/ Hex Artifact Content
Login

Artifact b60b1f1f48521fe5b4bf98a189cadc205b2e8065:


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 39 37 20 32 30 30 35 2f 30 31 2f 32 31  1.297 2005/01/21
02f0: 20 31 31 3a 35 35 3a 32 37 20 64 61 6e 69 65 6c   11:55:27 daniel
0300: 6b 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23  k1977 Exp $.*/.#
0310: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0320: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
0330: 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  ctype.h>../*.** 
0340: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0350: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65  called when a ne
0360: 77 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  w SQL statement 
0370: 69 73 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a  is beginning to.
0380: 2a 2a 20 62 65 20 70 61 72 73 65 64 2e 20 20 49  ** be parsed.  I
0390: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 70 50  nitialize the pP
03a0: 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20 61  arse structure a
03b0: 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69  s needed..*/.voi
03c0: 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 50 61  d sqlite3BeginPa
03d0: 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rse(Parse *pPars
03e0: 65 2c 20 69 6e 74 20 65 78 70 6c 61 69 6e 46 6c  e, int explainFl
03f0: 61 67 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 65  ag){.  pParse->e
0400: 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61 69 6e  xplain = explain
0410: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
0420: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nVar = 0;.}../*.
0430: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0440: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
0450: 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61  a single SQL sta
0460: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
0470: 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20 61 20  ** parsed and a 
0480: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 74 6f 20  VDBE program to 
0490: 65 78 65 63 75 74 65 20 74 68 61 74 20 73 74 61  execute that sta
04a0: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
04b0: 2a 2a 20 70 72 65 70 61 72 65 64 2e 20 20 54 68  ** prepared.  Th
04c0: 69 73 20 72 6f 75 74 69 6e 65 20 70 75 74 73 20  is routine puts 
04d0: 74 68 65 20 66 69 6e 69 73 68 69 6e 67 20 74 6f  the finishing to
04e0: 75 63 68 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  uches on the.** 
04f0: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 6e 64  VDBE program and
0500: 20 72 65 73 65 74 73 20 74 68 65 20 70 50 61 72   resets the pPar
0510: 73 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  se structure for
0520: 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 70 61 72   the next.** par
0530: 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  se..**.** Note t
0540: 68 61 74 20 69 66 20 61 6e 20 65 72 72 6f 72 20  hat if an error 
0550: 6f 63 63 75 72 72 65 64 2c 20 69 74 20 6d 69 67  occurred, it mig
0560: 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
0570: 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63  hat.** no VDBE c
0580: 6f 64 65 20 77 61 73 20 67 65 6e 65 72 61 74 65  ode was generate
0590: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
05a0: 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 50  e3FinishCoding(P
05b0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
05c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
05d0: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
05e0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
05f0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
0600: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65    if( pParse->ne
0610: 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 0a  sted ) return;..
0620: 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 67 65    /* Begin by ge
0630: 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65 20 74 65  nerating some te
0640: 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20 61  rmination code a
0650: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
0660: 0a 20 20 2a 2a 20 76 64 62 65 20 70 72 6f 67 72  .  ** vdbe progr
0670: 61 6d 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70  am.  */.  db = p
0680: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d  Parse->db;.  v =
0690: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
06a0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
06b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
06c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 48  dbeAddOp(v, OP_H
06d0: 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  alt, 0, 0);..   
06e0: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
06f0: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
0700: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
0710: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
0720: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
0730: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
0740: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
0750: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
0760: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
0770: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
0780: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
0790: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
07a0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
07b0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
07c0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
07d0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
07e0: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
07f0: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
0800: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
0810: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
0820: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  if( pParse->cook
0830: 69 65 47 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20  ieGoto>0 ){.    
0840: 20 20 75 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20    u32 mask;.    
0850: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
0860: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
0870: 67 65 50 32 28 76 2c 20 70 50 61 72 73 65 2d 3e  geP2(v, pParse->
0880: 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 2c 20 73 71  cookieGoto-1, sq
0890: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
08a0: 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 20 20  Addr(v));.      
08b0: 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73 6b 3d  for(iDb=0, mask=
08c0: 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  1; iDb<db->nDb; 
08d0: 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b 29  mask<<=1, iDb++)
08e0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
08f0: 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 63 6f  ask & pParse->co
0900: 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29 20 63  okieMask)==0 ) c
0910: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
0920: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
0930: 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74  p(v, OP_Transact
0940: 69 6f 6e 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20  ion, iDb, (mask 
0950: 26 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d  & pParse->writeM
0960: 61 73 6b 29 21 3d 30 29 3b 0a 20 20 20 20 20 20  ask)!=0);.      
0970: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
0980: 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43  Op(v, OP_VerifyC
0990: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 70 50 61 72  ookie, iDb, pPar
09a0: 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b  se->cookieValue[
09b0: 69 44 62 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iDb]);.      }. 
09c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
09d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
09e0: 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  , 0, pParse->coo
09f0: 6b 69 65 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a  kieGoto);.    }.
0a00: 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 20 4e 6f  .    /* Add a No
0a10: 2d 6f 70 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  -op that contain
0a20: 73 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  s the complete t
0a30: 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 69  ext of the compi
0a40: 6c 65 64 20 53 51 4c 0a 20 20 20 20 2a 2a 20 73  led SQL.    ** s
0a50: 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74 73 20  tatement as its 
0a60: 50 33 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68  P3 argument.  Th
0a70: 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e  is does not chan
0a80: 67 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 61  ge the functiona
0a90: 6c 69 74 79 0a 20 20 20 20 2a 2a 20 6f 66 20 74  lity.    ** of t
0aa0: 68 65 20 70 72 6f 67 72 61 6d 2e 20 0a 20 20 20  he program. .   
0ab0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
0ac0: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
0ad0: 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 74 72 61  ment sqlite3_tra
0ae0: 63 65 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ce()..    */.   
0af0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
0b00: 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30  v, OP_Noop, 0, 0
0b10: 2c 20 70 50 61 72 73 65 2d 3e 7a 53 71 6c 2c 20  , pParse->zSql, 
0b20: 70 50 61 72 73 65 2d 3e 7a 54 61 69 6c 2d 70 50  pParse->zTail-pP
0b30: 61 72 73 65 2d 3e 7a 53 71 6c 29 3b 0a 20 20 7d  arse->zSql);.  }
0b40: 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ...  /* Get the 
0b50: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65 61  VDBE program rea
0b60: 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  dy for execution
0b70: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26  .  */.  if( v &&
0b80: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
0b90: 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74 72   ){.    FILE *tr
0ba0: 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  ace = (db->flags
0bb0: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72   & SQLITE_VdbeTr
0bc0: 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74  ace)!=0 ? stdout
0bd0: 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   : 0;.    sqlite
0be0: 33 56 64 62 65 54 72 61 63 65 28 76 2c 20 74 72  3VdbeTrace(v, tr
0bf0: 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ace);.    sqlite
0c00: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76  3VdbeMakeReady(v
0c10: 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  , pParse->nVar, 
0c20: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 33 2c 0a  pParse->nMem+3,.
0c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c40: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
0c50: 3e 6e 54 61 62 2b 33 2c 20 70 50 61 72 73 65 2d  >nTab+3, pParse-
0c60: 3e 65 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70  >explain);.    p
0c70: 50 61 72 73 65 2d 3e 72 63 20 3d 20 70 50 61 72  Parse->rc = pPar
0c80: 73 65 2d 3e 6e 45 72 72 20 3f 20 53 51 4c 49 54  se->nErr ? SQLIT
0c90: 45 5f 45 52 52 4f 52 20 3a 20 53 51 4c 49 54 45  E_ERROR : SQLITE
0ca0: 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73  _DONE;.    pPars
0cb0: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
0cc0: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
0cd0: 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49  pParse->rc==SQLI
0ce0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
0cf0: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
0d00: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50  _ERROR;.  }.  pP
0d10: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a  arse->nTab = 0;.
0d20: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
0d30: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53   0;.  pParse->nS
0d40: 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  et = 0;.  pParse
0d50: 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a 20 20 70 50  ->nAgg = 0;.  pP
0d60: 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a  arse->nVar = 0;.
0d70: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
0d80: 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 72  Mask = 0;.  pPar
0d90: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d  se->cookieGoto =
0da0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e   0;.}../*.** Run
0db0: 20 74 68 65 20 70 61 72 73 65 72 20 61 6e 64 20   the parser and 
0dc0: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 72  code generator r
0dd0: 65 63 75 72 73 69 76 65 6c 79 20 69 6e 20 6f 72  ecursively in or
0de0: 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a  der to generate.
0df0: 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  ** code for the 
0e00: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 67 69  SQL statement gi
0e10: 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ven onto the end
0e20: 20 6f 66 20 74 68 65 20 70 50 61 72 73 65 20 63   of the pParse c
0e30: 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72 65 6e  ontext.** curren
0e40: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
0e50: 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 68  uction.  When th
0e60: 65 20 70 61 72 73 65 72 20 69 73 20 72 75 6e 20  e parser is run 
0e70: 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74  recursively.** t
0e80: 68 69 73 20 77 61 79 2c 20 74 68 65 20 66 69 6e  his way, the fin
0e90: 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e 6f  al OP_Halt is no
0ea0: 74 20 61 70 70 65 6e 64 65 64 20 61 6e 64 20 6f  t appended and o
0eb0: 74 68 65 72 20 69 6e 69 74 69 61 6c 69 7a 61 74  ther initializat
0ec0: 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61 6c  ion.** and final
0ed0: 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 61 72  ization steps ar
0ee0: 65 20 6f 6d 69 74 74 65 64 20 62 65 63 61 75 73  e omitted becaus
0ef0: 65 20 74 68 6f 73 65 20 61 72 65 20 68 61 6e 64  e those are hand
0f00: 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20 6f  ling by the.** o
0f10: 75 74 65 72 6d 6f 73 74 20 70 61 72 73 65 72 2e  utermost parser.
0f20: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79  .**.** Not every
0f30: 74 68 69 6e 67 20 69 73 20 6e 65 73 74 61 62 6c  thing is nestabl
0f40: 65 2e 20 20 54 68 69 73 20 66 61 63 69 6c 69 74  e.  This facilit
0f50: 79 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f  y is designed to
0f60: 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45 52   permit.** INSER
0f70: 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20 44  T, UPDATE, and D
0f80: 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  ELETE operations
0f90: 20 61 67 61 69 6e 73 74 20 53 51 4c 49 54 45 5f   against SQLITE_
0fa0: 4d 41 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a 20  MASTER.  Use.** 
0fb0: 63 61 72 65 20 69 66 20 79 6f 75 20 64 65 63 69  care if you deci
0fc0: 64 65 20 74 6f 20 74 72 79 20 74 6f 20 75 73 65  de to try to use
0fd0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 6f   this routine fo
0fe0: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
0ff0: 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  poses..*/.void s
1000: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
1010: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1020: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
1030: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
1040: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
1050: 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72 63   *zSql;.  int rc
1060: 3b 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45 5f  ;.# define SAVE_
1070: 53 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72 73  SZ  (sizeof(Pars
1080: 65 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50 61  e) - offsetof(Pa
1090: 72 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68 61  rse,nVar)).  cha
10a0: 72 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f 53  r saveBuf[SAVE_S
10b0: 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Z];..  if( pPars
10c0: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
10d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
10e0: 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b  se->nested<10 );
10f0: 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f    /* Nesting sho
1100: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c  uld only be of l
1110: 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a  imited depth */.
1120: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
1130: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20  Format);.  zSql 
1140: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
1150: 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  f(zFormat, ap);.
1160: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
1170: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
1180: 20 20 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20     return;   /* 
1190: 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  A malloc must ha
11a0: 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d  ve failed */.  }
11b0: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  .  pParse->neste
11c0: 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61  d++;.  memcpy(sa
11d0: 76 65 42 75 66 2c 20 26 70 50 61 72 73 65 2d 3e  veBuf, &pParse->
11e0: 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  nVar, SAVE_SZ);.
11f0: 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65    memset(&pParse
1200: 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41 56 45 5f  ->nVar, 0, SAVE_
1210: 53 5a 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  SZ);.  rc = sqli
1220: 74 65 33 52 75 6e 50 61 72 73 65 72 28 70 50 61  te3RunParser(pPa
1230: 72 73 65 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a 20  rse, zSql, 0);. 
1240: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 53 71 6c   sqliteFree(zSql
1250: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61  );.  memcpy(&pPa
1260: 72 73 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65 42  rse->nVar, saveB
1270: 75 66 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20  uf, SAVE_SZ);.  
1280: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d  pParse->nested--
1290: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
12a0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
12b0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
12c0: 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69  escribes a parti
12d0: 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a  cular database.*
12e0: 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68  * table given th
12f0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74  e name of that t
1300: 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e  able and (option
1310: 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f  ally) the name o
1320: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
1330: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
1340: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
1350: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
1360: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74  d..**.** If zDat
1370: 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20  abase is 0, all 
1380: 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65  databases are se
1390: 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 20 74  arched for the t
13a0: 61 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20  able and the.** 
13b0: 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74  first matching t
13c0: 61 62 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64  able is returned
13d0: 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .  (No checking 
13e0: 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 74 61  for duplicate ta
13f0: 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20  ble.** names is 
1400: 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72  done.)  The sear
1410: 63 68 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50  ch order is TEMP
1420: 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49   first, then MAI
1430: 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61  N, then any.** a
1440: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
1450: 65 73 20 61 64 64 65 64 20 75 73 69 6e 67 20 74  es added using t
1460: 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e  he ATTACH comman
1470: 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  d..**.** See als
1480: 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  o sqlite3LocateT
1490: 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65  able()..*/.Table
14a0: 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62   *sqlite3FindTab
14b0: 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  le(sqlite3 *db, 
14c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
14d0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
14e0: 44 61 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62  Database){.  Tab
14f0: 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74  le *p = 0;.  int
1500: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 4e   i;.  assert( zN
1510: 61 6d 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ame!=0 );.  asse
1520: 72 74 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  rt( (db->flags &
1530: 20 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69   SQLITE_Initiali
1540: 7a 65 64 29 20 7c 7c 20 64 62 2d 3e 69 6e 69 74  zed) || db->init
1550: 2e 62 75 73 79 20 29 3b 0a 20 20 66 6f 72 28 69  .busy );.  for(i
1560: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
1570: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  ++){.    int j =
1580: 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69   (i<2) ? i^1 : i
1590: 3b 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  ;   /* Search TE
15a0: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
15b0: 2f 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62  /.    if( zDatab
15c0: 61 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65  ase!=0 && sqlite
15d0: 33 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61  3StrICmp(zDataba
15e0: 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a  se, db->aDb[j].z
15f0: 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Name) ) continue
1600: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
1610: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
1620: 44 62 5b 6a 5d 2e 74 62 6c 48 61 73 68 2c 20 7a  Db[j].tblHash, z
1630: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61  Name, strlen(zNa
1640: 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20  me)+1);.    if( 
1650: 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  p ) break;.  }. 
1660: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1670: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
1680: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
1690: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
16a0: 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  s a particular d
16b0: 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65  atabase.** table
16c0: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
16d0: 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e  of that table an
16e0: 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74  d (optionally) t
16f0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a  he name of the.*
1700: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  * database conta
1710: 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e  ining the table.
1720: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
1730: 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73   not found.  Als
1740: 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72  o leave an.** er
1750: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
1760: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
1770: 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
1780: 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
1790: 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71  s routine and sq
17a0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29  lite3FindTable()
17b0: 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a   is that this.**
17c0: 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20   routine leaves 
17d0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
17e0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
17f0: 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c  Msg where.** sql
1800: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20  ite3FindTable() 
1810: 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62  does not..*/.Tab
1820: 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74  le *sqlite3Locat
1830: 65 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  eTable(Parse *pP
1840: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
1850: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
1860: 68 61 72 20 2a 7a 44 62 61 73 65 29 7b 0a 20 20  har *zDbase){.  
1870: 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20  Table *p;..  /* 
1880: 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  Read the databas
1890: 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20  e schema. If an 
18a0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65  error occurs, le
18b0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
18c0: 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f  sage.  ** and co
18d0: 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  de in pParse and
18e0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f   return NULL. */
18f0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
1900: 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
1910: 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
1920: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1930: 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46  ..  p = sqlite3F
1940: 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d  indTable(pParse-
1950: 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61  >db, zName, zDba
1960: 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  se);.  if( p==0 
1970: 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 62 61 73  ){.    if( zDbas
1980: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
1990: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
19a0: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
19b0: 65 3a 20 25 73 2e 25 73 22 2c 20 7a 44 62 61 73  e: %s.%s", zDbas
19c0: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, zName);.    }
19d0: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
19e0: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
19f0: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21  ->db, zName, 0)!
1a00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
1a10: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1a20: 73 65 2c 20 22 74 61 62 6c 65 20 5c 22 25 73 5c  se, "table \"%s\
1a30: 22 20 69 73 20 6e 6f 74 20 69 6e 20 64 61 74 61  " is not in data
1a40: 62 61 73 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20  base \"%s\"",.  
1a50: 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 7a 44         zName, zD
1a60: 62 61 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  base);.    }else
1a70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1a80: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1a90: 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
1aa0: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
1ab0: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63   }.    pParse->c
1ac0: 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
1ad0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
1ae0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
1af0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
1b00: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
1b10: 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72  cribes .** a par
1b20: 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69  ticular index gi
1b30: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
1b40: 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e  that index.** an
1b50: 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  d the name of th
1b60: 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
1b70: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64  contains the ind
1b80: 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55  ex..** Return NU
1b90: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
1ba0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
1bb0: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
1bc0: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
1bd0: 63 68 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ched for the.** 
1be0: 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69  table and the fi
1bf0: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 69 6e 64  rst matching ind
1c00: 65 78 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ex is returned. 
1c10: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a   (No checking.**
1c20: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 69   for duplicate i
1c30: 6e 64 65 78 20 6e 61 6d 65 73 20 69 73 20 64 6f  ndex names is do
1c40: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
1c50: 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d   order is.** TEM
1c60: 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41  P first, then MA
1c70: 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78  IN, then any aux
1c80: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
1c90: 20 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20   added.** using 
1ca0: 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61  the ATTACH comma
1cb0: 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71  nd..*/.Index *sq
1cc0: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 73  lite3FindIndex(s
1cd0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
1ce0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63  t char *zName, c
1cf0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
1d00: 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b  .  Index *p = 0;
1d10: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
1d20: 72 74 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  rt( (db->flags &
1d30: 20 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69   SQLITE_Initiali
1d40: 7a 65 64 29 20 7c 7c 20 64 62 2d 3e 69 6e 69 74  zed) || db->init
1d50: 2e 62 75 73 79 20 29 3b 0a 20 20 66 6f 72 28 69  .busy );.  for(i
1d60: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
1d70: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  ++){.    int j =
1d80: 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69   (i<2) ? i^1 : i
1d90: 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d  ;  /* Search TEM
1da0: 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f  P before MAIN */
1db0: 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26 26 20  .    if( zDb && 
1dc0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1dd0: 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a  Db, db->aDb[j].z
1de0: 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Name) ) continue
1df0: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
1e00: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
1e10: 44 62 5b 6a 5d 2e 69 64 78 48 61 73 68 2c 20 7a  Db[j].idxHash, z
1e20: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61  Name, strlen(zNa
1e30: 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20  me)+1);.    if( 
1e40: 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  p ) break;.  }. 
1e50: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1e60: 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20  .** Reclaim the 
1e70: 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61  memory used by a
1e80: 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69  n index.*/.stati
1e90: 63 20 76 6f 69 64 20 66 72 65 65 49 6e 64 65 78  c void freeIndex
1ea0: 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 73 71  (Index *p){.  sq
1eb0: 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 43 6f 6c  liteFree(p->zCol
1ec0: 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  Aff);.  sqliteFr
1ed0: 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ee(p);.}../*.** 
1ee0: 52 65 6d 6f 76 65 20 74 68 65 20 67 69 76 65 6e  Remove the given
1ef0: 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20   index from the 
1f00: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
1f10: 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74  , and free.** it
1f20: 73 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  s memory structu
1f30: 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  res..**.** The i
1f40: 6e 64 65 78 20 69 73 20 72 65 6d 6f 76 65 64 20  ndex is removed 
1f50: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1f60: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 62 75  e hash tables bu
1f70: 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 75  t.** it is not u
1f80: 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65  nlinked from the
1f90: 20 54 61 62 6c 65 20 74 68 61 74 20 69 74 20 69   Table that it i
1fa0: 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e  ndexes..** Unlin
1fb0: 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 54 61  king from the Ta
1fc0: 62 6c 65 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  ble must be done
1fd0: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
1fe0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
1ff0: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 44  tic void sqliteD
2000: 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74  eleteIndex(sqlit
2010: 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70  e3 *db, Index *p
2020: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64  ){.  Index *pOld
2030: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ;..  assert( db!
2040: 3d 30 20 26 26 20 70 2d 3e 7a 4e 61 6d 65 21 3d  =0 && p->zName!=
2050: 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73 71  0 );.  pOld = sq
2060: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
2070: 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d  &db->aDb[p->iDb]
2080: 2e 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a 4e 61  .idxHash, p->zNa
2090: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
20b0: 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31  rlen(p->zName)+1
20c0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 4f 6c 64  , 0);.  if( pOld
20d0: 21 3d 30 20 26 26 20 70 4f 6c 64 21 3d 70 20 29  !=0 && pOld!=p )
20e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73  {.    sqlite3Has
20f0: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
2100: 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73 68  [p->iDb].idxHash
2110: 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c 0a 20  , pOld->zName,. 
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2130: 20 20 20 20 73 74 72 6c 65 6e 28 70 4f 6c 64 2d      strlen(pOld-
2140: 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c 64 29  >zName)+1, pOld)
2150: 3b 0a 20 20 7d 0a 20 20 66 72 65 65 49 6e 64 65  ;.  }.  freeInde
2160: 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  x(p);.}../*.** U
2170: 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20  nlink the given 
2180: 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 74  index from its t
2190: 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 6d 6f 76  able, then remov
21a0: 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 66  e.** the index f
21b0: 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61  rom the index ha
21c0: 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65  sh table and fre
21d0: 65 20 69 74 73 20 6d 65 6d 6f 72 79 0a 2a 2a 20  e its memory.** 
21e0: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
21f0: 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e  oid sqlite3Unlin
2200: 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28  kAndDeleteIndex(
2210: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
2220: 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   iDb, const char
2230: 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49   *zIdxName){.  I
2240: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
2250: 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 6c 65 6e 20  int len;..  len 
2260: 3d 20 73 74 72 6c 65 6e 28 7a 49 64 78 4e 61 6d  = strlen(zIdxNam
2270: 65 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73  e);.  pIndex = s
2280: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
2290: 28 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 69  (&db->aDb[iDb].i
22a0: 64 78 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65  dxHash, zIdxName
22b0: 2c 20 6c 65 6e 2b 31 2c 20 30 29 3b 0a 20 20 69  , len+1, 0);.  i
22c0: 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
22d0: 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61   if( pIndex->pTa
22e0: 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e  ble->pIndex==pIn
22f0: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  dex ){.      pIn
2300: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
2310: 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  dex = pIndex->pN
2320: 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
2330: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a        Index *p;.
2340: 20 20 20 20 20 20 66 6f 72 28 70 3d 70 49 6e 64        for(p=pInd
2350: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
2360: 65 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65 78  ex; p && p->pNex
2370: 74 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e  t!=pIndex; p=p->
2380: 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 20 20 69  pNext){}.      i
2390: 66 28 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74  f( p && p->pNext
23a0: 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ==pIndex ){.    
23b0: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
23c0: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
23d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
23e0: 66 72 65 65 49 6e 64 65 78 28 70 49 6e 64 65 78  freeIndex(pIndex
23f0: 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61  );.  }.  db->fla
2400: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
2410: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
2420: 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73  *.** Erase all s
2430: 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f  chema informatio
2440: 6e 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65  n from the in-me
2450: 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73  mory hash tables
2460: 20 6f 66 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20   of.** a single 
2470: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
2480: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2490: 64 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d  d to reclaim mem
24a0: 6f 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68  ory.** before th
24b0: 65 20 64 61 74 61 62 61 73 65 20 63 6c 6f 73 65  e database close
24c0: 73 2e 20 20 49 74 20 69 73 20 61 6c 73 6f 20 63  s.  It is also c
24d0: 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 61 20 72  alled during a r
24e0: 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68  ollback.** if th
24f0: 65 72 65 20 77 65 72 65 20 73 63 68 65 6d 61 20  ere were schema 
2500: 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74  changes during t
2510: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  he transaction o
2520: 72 20 69 66 20 61 0a 2a 2a 20 73 63 68 65 6d 61  r if a.** schema
2530: 2d 63 6f 6f 6b 69 65 20 6d 69 73 6d 61 74 63 68  -cookie mismatch
2540: 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49   occurs..**.** I
2550: 66 20 69 44 62 3c 3d 30 20 74 68 65 6e 20 72 65  f iDb<=0 then re
2560: 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  set the internal
2570: 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73 20 66   schema tables f
2580: 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a  or all database.
2590: 2a 2a 20 66 69 6c 65 73 2e 20 20 49 66 20 69 44  ** files.  If iD
25a0: 62 3e 3d 32 20 74 68 65 6e 20 72 65 73 65 74 20  b>=2 then reset 
25b0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
25c0: 65 6d 61 20 66 6f 72 20 6f 6e 6c 79 20 74 68 65  ema for only the
25d0: 0a 2a 2a 20 73 69 6e 67 6c 65 20 66 69 6c 65 20  .** single file 
25e0: 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f  indicated..*/.vo
25f0: 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 49  id sqlite3ResetI
2600: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 73 71  nternalSchema(sq
2610: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
2620: 44 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  Db){.  HashElem 
2630: 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 74  *pElem;.  Hash t
2640: 65 6d 70 31 3b 0a 20 20 48 61 73 68 20 74 65 6d  emp1;.  Hash tem
2650: 70 32 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  p2;.  int i, j;.
2660: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
2670: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
2680: 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20   );.  db->flags 
2690: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 69 74 69  &= ~SQLITE_Initi
26a0: 61 6c 69 7a 65 64 3b 0a 20 20 66 6f 72 28 69 3d  alized;.  for(i=
26b0: 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  iDb; i<db->nDb; 
26c0: 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44  i++){.    Db *pD
26d0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
26e0: 0a 20 20 20 20 74 65 6d 70 31 20 3d 20 70 44 62  .    temp1 = pDb
26f0: 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 20 20 74  ->tblHash;.    t
2700: 65 6d 70 32 20 3d 20 70 44 62 2d 3e 74 72 69 67  emp2 = pDb->trig
2710: 48 61 73 68 3b 0a 20 20 20 20 73 71 6c 69 74 65  Hash;.    sqlite
2720: 33 48 61 73 68 49 6e 69 74 28 26 70 44 62 2d 3e  3HashInit(&pDb->
2730: 74 72 69 67 48 61 73 68 2c 20 53 51 4c 49 54 45  trigHash, SQLITE
2740: 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29  _HASH_STRING, 0)
2750: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73  ;.    sqlite3Has
2760: 68 43 6c 65 61 72 28 26 70 44 62 2d 3e 61 46 4b  hClear(&pDb->aFK
2770: 65 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ey);.    sqlite3
2780: 48 61 73 68 43 6c 65 61 72 28 26 70 44 62 2d 3e  HashClear(&pDb->
2790: 69 64 78 48 61 73 68 29 3b 0a 20 20 20 20 66 6f  idxHash);.    fo
27a0: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
27b0: 73 68 46 69 72 73 74 28 26 74 65 6d 70 32 29 3b  shFirst(&temp2);
27c0: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
27d0: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
27e0: 65 6d 29 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  em)){.      sqli
27f0: 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 72  te3DeleteTrigger
2800: 28 28 54 72 69 67 67 65 72 2a 29 73 71 6c 69 74  ((Trigger*)sqlit
2810: 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
2820: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2830: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 74  ite3HashClear(&t
2840: 65 6d 70 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  emp2);.    sqlit
2850: 65 33 48 61 73 68 49 6e 69 74 28 26 70 44 62 2d  e3HashInit(&pDb-
2860: 3e 74 62 6c 48 61 73 68 2c 20 53 51 4c 49 54 45  >tblHash, SQLITE
2870: 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29  _HASH_STRING, 0)
2880: 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d  ;.    for(pElem=
2890: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
28a0: 26 74 65 6d 70 31 29 3b 20 70 45 6c 65 6d 3b 20  &temp1); pElem; 
28b0: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
28c0: 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
28d0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
28e0: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
28f0: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 73  (pElem);.      s
2900: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
2910: 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
2920: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61   }.    sqlite3Ha
2930: 73 68 43 6c 65 61 72 28 26 74 65 6d 70 31 29 3b  shClear(&temp1);
2940: 0a 20 20 20 20 70 44 62 2d 3e 70 53 65 71 54 61  .    pDb->pSeqTa
2950: 62 20 3d 20 30 3b 0a 20 20 20 20 44 62 43 6c 65  b = 0;.    DbCle
2960: 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  arProperty(db, i
2970: 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65  , DB_SchemaLoade
2980: 64 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3e  d);.    if( iDb>
2990: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a  0 ) return;.  }.
29a0: 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30    assert( iDb==0
29b0: 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20   );.  db->flags 
29c0: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
29d0: 6e 43 68 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20  nChanges;..  /* 
29e0: 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  If one or more o
29f0: 66 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  f the auxiliary 
2a00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68  database files h
2a10: 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a  as been closed,.
2a20: 20 20 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65    ** then remove
2a30: 20 74 68 65 6e 20 66 72 6f 6d 20 74 68 65 20 61   then from the a
2a40: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
2a50: 65 20 6c 69 73 74 2e 20 20 57 65 20 74 61 6b 65  e list.  We take
2a60: 20 74 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74   the.  ** opport
2a70: 75 6e 69 74 79 20 74 6f 20 64 6f 20 74 68 69 73  unity to do this
2a80: 20 68 65 72 65 20 73 69 6e 63 65 20 77 65 20 68   here since we h
2a90: 61 76 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64  ave just deleted
2aa0: 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a   all of the.  **
2ab0: 20 73 63 68 65 6d 61 20 68 61 73 68 20 74 61 62   schema hash tab
2ac0: 6c 65 73 20 61 6e 64 20 74 68 65 72 65 66 6f 72  les and therefor
2ad0: 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  e do not have to
2ae0: 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65   make any change
2af0: 73 0a 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66  s.  ** to any of
2b00: 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20   those tables.. 
2b10: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
2b20: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
2b30: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
2b40: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
2b50: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
2b60: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  Bt==0 ){.      i
2b70: 66 28 20 70 44 62 2d 3e 70 41 75 78 20 26 26 20  f( pDb->pAux && 
2b80: 70 44 62 2d 3e 78 46 72 65 65 41 75 78 20 29 20  pDb->xFreeAux ) 
2b90: 70 44 62 2d 3e 78 46 72 65 65 41 75 78 28 70 44  pDb->xFreeAux(pD
2ba0: 62 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20  b->pAux);.      
2bb0: 70 44 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20  pDb->pAux = 0;. 
2bc0: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
2bd0: 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  =j=2; i<db->nDb;
2be0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
2bf0: 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d  t Db *pDb = &db-
2c00: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
2c10: 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a   pDb->pBt==0 ){.
2c20: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
2c30: 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  (pDb->zName);.  
2c40: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d      pDb->zName =
2c50: 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   0;.      contin
2c60: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
2c70: 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64  ( j<i ){.      d
2c80: 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e  b->aDb[j] = db->
2c90: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  aDb[i];.    }.  
2ca0: 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d    j++;.  }.  mem
2cb0: 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c  set(&db->aDb[j],
2cc0: 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a   0, (db->nDb-j)*
2cd0: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a  sizeof(db->aDb[j
2ce0: 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d  ]));.  db->nDb =
2cf0: 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44   j;.  if( db->nD
2d00: 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21  b<=2 && db->aDb!
2d10: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
2d20: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d  {.    memcpy(db-
2d30: 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e  >aDbStatic, db->
2d40: 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62  aDb, 2*sizeof(db
2d50: 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20  ->aDb[0]));.    
2d60: 73 71 6c 69 74 65 46 72 65 65 28 64 62 2d 3e 61  sqliteFree(db->a
2d70: 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Db);.    db->aDb
2d80: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
2d90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
2da0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2db0: 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61  alled whenever a
2dc0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
2dd0: 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
2de0: 0a 2a 2a 20 73 63 68 65 6d 61 20 63 68 61 6e 67  .** schema chang
2df0: 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72  es during the tr
2e00: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
2e10: 77 65 20 68 61 76 65 20 74 6f 20 72 65 73 65 74  we have to reset
2e20: 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c   the.** internal
2e30: 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64   hash tables and
2e40: 20 72 65 6c 6f 61 64 20 74 68 65 6d 20 66 72 6f   reload them fro
2e50: 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  m disk..*/.void 
2e60: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 49  sqlite3RollbackI
2e70: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73  nternalChanges(s
2e80: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
2e90: 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
2ea0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
2eb0: 67 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ges ){.    sqlit
2ec0: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
2ed0: 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20  chema(db, 0);.  
2ee0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
2ef0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2f00: 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20  d when a commit 
2f10: 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
2f20: 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
2f30: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c  ernalChanges(sql
2f40: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d  ite3 *db){.  db-
2f50: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
2f60: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
2f70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
2f80: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
2f90: 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 6f 72   from a table or
2fa0: 20 76 69 65 77 2e 0a 2a 2f 0a 73 74 61 74 69 63   view..*/.static
2fb0: 20 76 6f 69 64 20 73 71 6c 69 74 65 52 65 73 65   void sqliteRese
2fc0: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62  tColumnNames(Tab
2fd0: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69  le *pTable){.  i
2fe0: 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  nt i;.  Column *
2ff0: 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  pCol;.  assert( 
3000: 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 66  pTable!=0 );.  f
3010: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61  or(i=0, pCol=pTa
3020: 62 6c 65 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61  ble->aCol; i<pTa
3030: 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  ble->nCol; i++, 
3040: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  pCol++){.    sql
3050: 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 4e  iteFree(pCol->zN
3060: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
3070: 33 45 78 70 72 44 65 6c 65 74 65 28 70 43 6f 6c  3ExprDelete(pCol
3080: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 73 71  ->pDflt);.    sq
3090: 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a  liteFree(pCol->z
30a0: 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Type);.  }.  sql
30b0: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e  iteFree(pTable->
30c0: 61 43 6f 6c 29 3b 0a 20 20 70 54 61 62 6c 65 2d  aCol);.  pTable-
30d0: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  >aCol = 0;.  pTa
30e0: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d  ble->nCol = 0;.}
30f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
3100: 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73  he memory data s
3110: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
3120: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
3130: 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e  ven.** Table.  N
3140: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
3150: 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68  de to disk by th
3160: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
3170: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a  * This routine j
3180: 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20  ust deletes the 
3190: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20  data structure. 
31a0: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c   It does not unl
31b0: 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ink.** the table
31c0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
31d0: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
31e0: 62 6c 65 2e 20 20 4e 6f 72 20 64 6f 65 73 20 69  ble.  Nor does i
31f0: 74 20 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f 72 65  t remove.** fore
3200: 69 67 6e 20 6b 65 79 73 20 66 72 6f 6d 20 74 68  ign keys from th
3210: 65 20 73 71 6c 69 74 65 2e 61 46 4b 65 79 20 68  e sqlite.aFKey h
3220: 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20  ash table.  But 
3230: 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a  it does destroy.
3240: 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ** memory struct
3250: 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69  ures of the indi
3260: 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20  ces and foreign 
3270: 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  keys associated 
3280: 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62  with .** the tab
3290: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65  le..**.** Indice
32a0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
32b0: 68 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  h the table are 
32c0: 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68  unlinked from th
32d0: 65 20 22 64 62 22 0a 2a 2a 20 64 61 74 61 20 73  e "db".** data s
32e0: 74 72 75 63 74 75 72 65 20 69 66 20 64 62 21 3d  tructure if db!=
32f0: 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d 3d 4e 55  NULL.  If db==NU
3300: 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61 74 74 61  LL, indices atta
3310: 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74  ched to.** the t
3320: 61 62 6c 65 20 61 72 65 20 64 65 6c 65 74 65 64  able are deleted
3330: 2c 20 62 75 74 20 69 74 20 69 73 20 61 73 73 75  , but it is assu
3340: 6d 65 64 20 74 68 65 79 20 68 61 76 65 20 61 6c  med they have al
3350: 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 75 6e  ready been.** un
3360: 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  linked..*/.void 
3370: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
3380: 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  le(sqlite3 *db, 
3390: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
33a0: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c    Index *pIndex,
33b0: 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20   *pNext;.  FKey 
33c0: 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b  *pFKey, *pNextFK
33d0: 65 79 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 6c  ey;..  if( pTabl
33e0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  e==0 ) return;..
33f0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
3400: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
3410: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
3420: 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49  le.  */.  for(pI
3430: 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70  ndex = pTable->p
3440: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
3450: 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20  Index=pNext){.  
3460: 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78    pNext = pIndex
3470: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73  ->pNext;.    ass
3480: 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 69 44 62  ert( pIndex->iDb
3490: 3d 3d 70 54 61 62 6c 65 2d 3e 69 44 62 20 7c 7c  ==pTable->iDb ||
34a0: 20 28 70 54 61 62 6c 65 2d 3e 69 44 62 3d 3d 30   (pTable->iDb==0
34b0: 20 26 26 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d   && pIndex->iDb=
34c0: 3d 31 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  =1) );.    sqlit
34d0: 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c  eDeleteIndex(db,
34e0: 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 23   pIndex);.  }..#
34f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3500: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
3510: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 66   /* Delete all f
3520: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f  oreign keys asso
3530: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
3540: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6b 65 79   table.  The key
3550: 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61  s.  ** should ha
3560: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
3570: 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68  unlinked from th
3580: 65 20 64 62 2d 3e 61 46 4b 65 79 20 68 61 73 68  e db->aFKey hash
3590: 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 66   table .  */.  f
35a0: 6f 72 28 70 46 4b 65 79 3d 70 54 61 62 6c 65 2d  or(pFKey=pTable-
35b0: 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70  >pFKey; pFKey; p
35c0: 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79 29 7b  FKey=pNextFKey){
35d0: 0a 20 20 20 20 70 4e 65 78 74 46 4b 65 79 20 3d  .    pNextFKey =
35e0: 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
35f0: 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  m;.    assert( p
3600: 54 61 62 6c 65 2d 3e 69 44 62 3c 64 62 2d 3e 6e  Table->iDb<db->n
3610: 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Db );.    assert
3620: 28 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  ( sqlite3HashFin
3630: 64 28 26 64 62 2d 3e 61 44 62 5b 70 54 61 62 6c  d(&db->aDb[pTabl
3640: 65 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 0a 20  e->iDb].aFKey,. 
3650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3660: 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
3670: 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46 4b  >zTo, strlen(pFK
3680: 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b  ey->zTo)+1)!=pFK
3690: 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ey );.    sqlite
36a0: 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 7d  Free(pFKey);.  }
36b0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 65  .#endif..  /* De
36c0: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
36d0: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
36e0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 52 65  .  */.  sqliteRe
36f0: 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  setColumnNames(p
3700: 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65  Table);.  sqlite
3710: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e 61  Free(pTable->zNa
3720: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  me);.  sqliteFre
3730: 65 28 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66  e(pTable->zColAf
3740: 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  f);.  sqlite3Sel
3750: 65 63 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65  ectDelete(pTable
3760: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  ->pSelect);.  sq
3770: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 29  liteFree(pTable)
3780: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  ;.}../*.** Unlin
3790: 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c  k the given tabl
37a0: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
37b0: 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64  tables and the d
37c0: 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62  elete the.** tab
37d0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74  le structure wit
37e0: 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65  h all its indice
37f0: 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65  s and foreign ke
3800: 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ys..*/.void sqli
3810: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
3820: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
3830: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
3840: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61  nst char *zTabNa
3850: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  me){.  Table *p;
3860: 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70  .  FKey *pF1, *p
3870: 46 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a  F2;.  Db *pDb;..
3880: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
3890: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
38a0: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
38b0: 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
38c0: 7a 54 61 62 4e 61 6d 65 20 26 26 20 7a 54 61 62  zTabName && zTab
38d0: 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62  Name[0] );.  pDb
38e0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
38f0: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48  ;.  p = sqlite3H
3900: 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e  ashInsert(&pDb->
3910: 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d  tblHash, zTabNam
3920: 65 2c 20 73 74 72 6c 65 6e 28 7a 54 61 62 4e 61  e, strlen(zTabNa
3930: 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28  me)+1, 0);.  if(
3940: 20 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51   p ){.#ifndef SQ
3950: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
3960: 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72 28 70 46  N_KEY.    for(pF
3970: 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31 3b  1=p->pFKey; pF1;
3980: 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74 46   pF1=pF1->pNextF
3990: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  rom){.      int 
39a0: 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 31  nTo = strlen(pF1
39b0: 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20  ->zTo) + 1;.    
39c0: 20 20 70 46 32 20 3d 20 73 71 6c 69 74 65 33 48    pF2 = sqlite3H
39d0: 61 73 68 46 69 6e 64 28 26 70 44 62 2d 3e 61 46  ashFind(&pDb->aF
39e0: 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e  Key, pF1->zTo, n
39f0: 54 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  To);.      if( p
3a00: 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20  F2==pF1 ){.     
3a10: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
3a20: 73 65 72 74 28 26 70 44 62 2d 3e 61 46 4b 65 79  sert(&pDb->aFKey
3a30: 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c  , pF1->zTo, nTo,
3a40: 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 29 3b 0a   pF1->pNextTo);.
3a50: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3a60: 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 32 20       while( pF2 
3a70: 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 21  && pF2->pNextTo!
3a80: 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32 2d  =pF1 ){ pF2=pF2-
3a90: 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20 20  >pNextTo; }.    
3aa0: 20 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a 20      if( pF2 ){. 
3ab0: 20 20 20 20 20 20 20 20 20 70 46 32 2d 3e 70 4e           pF2->pN
3ac0: 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e 65  extTo = pF1->pNe
3ad0: 78 74 54 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xtTo;.        }.
3ae0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
3af0: 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
3b00: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
3b10: 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c  p);.  }.  db->fl
3b20: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
3b30: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
3b40: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f  /*.** Given a to
3b50: 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74  ken, return a st
3b60: 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73  ring that consis
3b70: 74 73 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f  ts of the text o
3b80: 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 20  f that.** token 
3b90: 77 69 74 68 20 61 6e 79 20 71 75 6f 74 61 74 69  with any quotati
3ba0: 6f 6e 73 20 72 65 6d 6f 76 65 64 2e 20 20 53 70  ons removed.  Sp
3bb0: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
3bc0: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
3bd0: 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ** is obtained f
3be0: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
3bf0: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
3c00: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
3c10: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  ing.** function.
3c20: 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72  .**.** Tokens ar
3c30: 65 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 70 6f  e really just po
3c40: 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20  inters into the 
3c50: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78  original SQL tex
3c60: 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20  t and so.** are 
3c70: 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61  not \000 termina
3c80: 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20  ted and are not 
3c90: 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65  persistent.  The
3ca0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
3cb0: 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d  .** is \000 term
3cc0: 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65  inated and is pe
3cd0: 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61  rsistent..*/.cha
3ce0: 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72  r *sqlite3NameFr
3cf0: 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70  omToken(Token *p
3d00: 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
3d10: 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d  Name;.  if( pNam
3d20: 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  e ){.    zName =
3d30: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
3d40: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
3d50: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  n);.    sqlite3D
3d60: 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
3d70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d   }else{.    zNam
3d80: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
3d90: 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  urn zName;.}../*
3da0: 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c  .** Open the sql
3db0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
3dc0: 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62   stored in datab
3dd0: 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66  ase number iDb f
3de0: 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54  or.** writing. T
3df0: 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e  he table is open
3e00: 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20  ed using cursor 
3e10: 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
3e20: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
3e30: 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  e(Vdbe *v, int i
3e40: 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  Db){.  sqlite3Vd
3e50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
3e60: 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a  teger, iDb, 0);.
3e70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3e80: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  Op(v, OP_OpenWri
3e90: 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f  te, 0, MASTER_RO
3ea0: 4f 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  OT);.  sqlite3Vd
3eb0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
3ec0: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20  tNumColumns, 0, 
3ed0: 35 29 3b 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61  5); /* sqlite_ma
3ee0: 73 74 65 72 20 68 61 73 20 35 20 63 6f 6c 75 6d  ster has 5 colum
3ef0: 6e 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ns */.}../*.** T
3f00: 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  he token *pName 
3f10: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d  contains the nam
3f20: 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  e of a database 
3f30: 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f  (either "main" o
3f40: 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74  r.** "temp" or t
3f50: 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74  he name of an at
3f60: 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73  tached db). This
3f70: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
3f80: 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66   the.** index of
3f90: 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62   the named datab
3fa0: 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d  ase in db->aDb[]
3fb0: 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e  , or -1 if the n
3fc0: 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73  amed db .** does
3fd0: 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 73   not exist..*/.s
3fe0: 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 44 62  tatic int findDb
3ff0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f  (sqlite3 *db, To
4000: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69  ken *pName){.  i
4010: 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 2f 2a  nt i = -1;    /*
4020: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
4030: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
4040: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4050: 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
4060: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 44 62  the name */.  Db
4070: 20 2a 70 44 62 3b 20 20 20 20 20 20 20 2f 2a 20   *pDb;       /* 
4080: 41 20 64 61 74 61 62 61 73 65 20 77 68 6f 73 65  A database whose
4090: 20 6e 61 6d 65 20 73 70 61 63 65 20 69 73 20 62   name space is b
40a0: 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 2a 2f  eing searched */
40b0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
40c0: 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65    /* Name we are
40d0: 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a   searching for *
40e0: 2f 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  /..  zName = sql
40f0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
4100: 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  n(pName);.  if( 
4110: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 6e 20 3d  zName ){.    n =
4120: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a   strlen(zName);.
4130: 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e      for(i=(db->n
4140: 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e  Db-1), pDb=&db->
4150: 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d  aDb[i]; i>=0; i-
4160: 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20  -, pDb--){.     
4170: 20 69 66 28 20 6e 3d 3d 73 74 72 6c 65 6e 28 70   if( n==strlen(p
4180: 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 30 3d  Db->zName) && 0=
4190: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
41a0: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  pDb->zName, zNam
41b0: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  e) ){.        br
41c0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
41d0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
41e0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  e(zName);.  }.  
41f0: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20  return i;.}../* 
4200: 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  The table or vie
4210: 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d  w or trigger nam
4220: 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  e is passed to t
4230: 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20  his routine via 
4240: 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31  tokens.** pName1
4250: 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20   and pName2. If 
4260: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77  the table name w
4270: 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  as fully qualifi
4280: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a  ed, for example:
4290: 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41  .**.** CREATE TA
42a0: 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e  BLE xxx.yyy (...
42b0: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70  );.** .** Then p
42c0: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
42d0: 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32  "xxx" and pName2
42e0: 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f   "yyy". On the o
42f0: 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20  ther hand if.** 
4300: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  the table name i
4310: 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c  s not fully qual
4320: 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a  ified, i.e.:.**.
4330: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
4340: 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20  yyy(...);.**.** 
4350: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
4360: 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20  et to "yyy" and 
4370: 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a  pName2 is ""..**
4380: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4390: 20 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71   sets the *ppUnq
43a0: 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  ual pointer to p
43b0: 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65  oint at the toke
43c0: 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20  n (pName1 or.** 
43d0: 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f  pName2) that sto
43e0: 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66  res the unqualif
43f0: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ied table name. 
4400: 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   The index of th
4410: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78  e.** database "x
4420: 78 78 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e  xx" is returned.
4430: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
4440: 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61  woPartName(.  Pa
4450: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4460: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
4470: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
4480: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
4490: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
44a0: 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69    /* The "xxx" i
44b0: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
44c0: 79 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f  yyy" or "xxx" */
44d0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
44e0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79  ,      /* The "y
44f0: 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  yy" in the name 
4500: 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54  "xxx.yyy" */.  T
4510: 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20  oken **pUnqual  
4520: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
4530: 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65  unqualified obje
4540: 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a  ct name here */.
4550: 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  ){.  int iDb;   
4560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4570: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
4580: 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20  ding the object 
4590: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
45a0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
45b0: 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20    if( pName2 && 
45c0: 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20  pName2->n>0 ){. 
45d0: 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e     assert( !db->
45e0: 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20  init.busy );.   
45f0: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
4600: 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 66 69  e2;.    iDb = fi
4610: 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29  ndDb(db, pName1)
4620: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
4630: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4640: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4650: 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61   "unknown databa
4660: 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b  se %T", pName1);
4670: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
4680: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Err++;.      ret
4690: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
46a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
46b0: 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  t( db->init.iDb=
46c0: 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62  =0 || db->init.b
46d0: 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62 20 3d  usy );.    iDb =
46e0: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20   db->init.iDb;. 
46f0: 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e     *pUnqual = pN
4700: 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ame1;.  }.  retu
4710: 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn iDb;.}../*.**
4720: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4730: 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69   used to check i
4740: 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72 69  f the UTF-8 stri
4750: 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65  ng zName is a le
4760: 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69  gal.** unqualifi
4770: 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65  ed name for a ne
4780: 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20  w schema object 
4790: 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76  (table, index, v
47a0: 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65  iew or.** trigge
47b0: 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72  r). All names ar
47c0: 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74  e legal except t
47d0: 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e 20  hose that begin 
47e0: 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a  with the string.
47f0: 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e  ** "sqlite_" (in
4800: 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72   upper, lower or
4810: 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54 68   mixed case). Th
4820: 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  is portion of th
4830: 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69  e namespace.** i
4840: 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  s reserved for i
4850: 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a  nternal use..*/.
4860: 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b  int sqlite3Check
4870: 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65  ObjectName(Parse
4880: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
4890: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
48a0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d  if( !pParse->db-
48b0: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50  >init.busy && pP
48c0: 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20  arse->nested==0 
48d0: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d  .          && 0=
48e0: 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70  =sqlite3StrNICmp
48f0: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
4900: 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c  ", 7) ){.    sql
4910: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4920: 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d  rse, "object nam
4930: 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  e reserved for i
4940: 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22  nternal use: %s"
4950: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  , zName);.    re
4960: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
4970: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
4980: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
4990: 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72  .** Begin constr
49a0: 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62  ucting a new tab
49b0: 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
49c0: 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  n in memory.  Th
49d0: 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72  is is.** the fir
49e0: 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63  st of several ac
49f0: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68  tion routines th
4a00: 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e  at get called in
4a10: 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20   response.** to 
4a20: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
4a30: 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61  tatement.  In pa
4a40: 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72  rticular, this r
4a50: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
4a60: 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67  .** after seeing
4a70: 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22   tokens "CREATE"
4a80: 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64   and "TABLE" and
4a90: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e   the table name.
4aa0: 20 20 54 68 65 0a 2a 2a 20 70 53 74 61 72 74 20    The.** pStart 
4ab0: 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 43 52 45  token is the CRE
4ac0: 41 54 45 20 61 6e 64 20 70 4e 61 6d 65 20 69 73  ATE and pName is
4ad0: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e   the table name.
4ae0: 20 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20    The isTemp.** 
4af0: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
4b00: 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  the table should
4b10: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
4b20: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
4b30: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73  base.** file ins
4b40: 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d  tead of in the m
4b50: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
4b60: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
4b70: 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a  ally the case.**
4b80: 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22   when the "TEMP"
4b90: 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20   or "TEMPORARY" 
4ba0: 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69  keyword occurs i
4bb0: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45  n between.** CRE
4bc0: 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a  ATE and TABLE..*
4bd0: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62  *.** The new tab
4be0: 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69  le record is ini
4bf0: 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74  tialized and put
4c00: 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   in pParse->pNew
4c10: 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72  Table..** As mor
4c20: 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  e of the CREATE 
4c30: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
4c40: 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74  is parsed, addit
4c50: 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20  ional action.** 
4c60: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65  routines will be
4c70: 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d   called to add m
4c80: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
4c90: 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a  to this record..
4ca0: 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
4cb0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
4cc0: 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
4cd0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
4ce0: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
4cf0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
4d00: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
4d10: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
4d20: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
4d30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61  .void sqlite3Sta
4d40: 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  rtTable(.  Parse
4d50: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
4d60: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
4d70: 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  .  Token *pStart
4d80: 2c 20 20 20 2f 2a 20 54 68 65 20 22 43 52 45 41  ,   /* The "CREA
4d90: 54 45 22 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54  TE" token */.  T
4da0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
4db0: 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
4dc0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
4dd0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
4de0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
4df0: 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70  2,   /* Second p
4e00: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  art of the name 
4e10: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
4e20: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
4e30: 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72  Temp,      /* Tr
4e40: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
4e50: 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TEMP table */.  
4e60: 69 6e 74 20 69 73 56 69 65 77 20 20 20 20 20 20  int isView      
4e70: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
4e80: 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 29 7b   is a VIEW */.){
4e90: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
4ea0: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
4eb0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
4ec0: 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20   0; /* The name 
4ed0: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
4ee0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
4ef0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
4f00: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
4f10: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
4f20: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
4f30: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74   to create the t
4f40: 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b  able in */.  Tok
4f50: 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a  en *pName;    /*
4f60: 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
4f70: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
4f80: 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f  o create */..  /
4f90: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76  * The table or v
4fa0: 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61  iew name to crea
4fb0: 74 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  te is passed to 
4fc0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61  this routine via
4fd0: 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61   tokens.  ** pNa
4fe0: 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20  me1 and pName2. 
4ff0: 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  If the table nam
5000: 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c  e was fully qual
5010: 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70  ified, for examp
5020: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52  le:.  **.  ** CR
5030: 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79  EATE TABLE xxx.y
5040: 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a  yy (...);.  ** .
5050: 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31    ** Then pName1
5060: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
5070: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
5080: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
5090: 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65  hand if.  ** the
50a0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e   table name is n
50b0: 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  ot fully qualifi
50c0: 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20  ed, i.e.:.  **. 
50d0: 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
50e0: 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a   yyy(...);.  **.
50f0: 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31    ** Then pName1
5100: 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22   is set to "yyy"
5110: 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22   and pName2 is "
5120: 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  "..  **.  ** The
5130: 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73   call below sets
5140: 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74   the pName point
5150: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
5160: 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31  he token (pName1
5170: 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29   or.  ** pName2)
5180: 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65   that stores the
5190: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62   unqualified tab
51a0: 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72  le name. The var
51b0: 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a  iable iDb is.  *
51c0: 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  * set to the ind
51d0: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
51e0: 73 65 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  se that the tabl
51f0: 65 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20  e or view is to 
5200: 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  be.  ** created 
5210: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d  in..  */.  iDb =
5220: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
5230: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
5240: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
5250: 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30  me);.  if( iDb<0
5260: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
5270: 20 69 73 54 65 6d 70 20 26 26 20 69 44 62 3e 31   isTemp && iDb>1
5280: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72   ){.    /* If cr
5290: 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61  eating a temp ta
52a0: 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61  ble, the name ma
52b0: 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69  y not be qualifi
52c0: 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ed */.    sqlite
52d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
52e0: 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62  , "temporary tab
52f0: 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  le name must be 
5300: 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20  unqualified");. 
5310: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
5320: 20 69 66 28 20 69 73 54 65 6d 70 20 29 20 69 44   if( isTemp ) iD
5330: 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65  b = 1;..  pParse
5340: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a  ->sNameToken = *
5350: 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d  pName;.  zName =
5360: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
5370: 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20  Token(pName);.  
5380: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72  if( zName==0 ) r
5390: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c  eturn;.  if( SQL
53a0: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43  ITE_OK!=sqlite3C
53b0: 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70  heckObjectName(p
53c0: 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  Parse, zName) ){
53d0: 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f  .    goto begin_
53e0: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  table_error;.  }
53f0: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
5400: 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20  iDb==1 ) isTemp 
5410: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
5420: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
5430: 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28  ZATION.  assert(
5440: 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69   (isTemp & 1)==i
5450: 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20  sTemp );.  {.   
5460: 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63   int code;.    c
5470: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
5480: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
5490: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
54a0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
54b0: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
54c0: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65  CHEMA_TABLE(isTe
54d0: 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  mp), 0, zDb) ){.
54e0: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
54f0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
5500: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
5510: 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
5520: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
5530: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
5540: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
5550: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5560: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
5570: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
5580: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
5590: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69  lse{.      if( i
55a0: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
55b0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
55c0: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
55d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
55e0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
55f0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
5600: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
5610: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
5620: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
5630: 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30  , code, zName, 0
5640: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
5650: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
5660: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
5670: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d  }.#endif..  /* M
5680: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77  ake sure the new
5690: 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73   table name does
56a0: 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74   not collide wit
56b0: 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20  h an existing.  
56c0: 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
56d0: 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61  e name in the sa
56e0: 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73  me database.  Is
56f0: 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  sue an error mes
5700: 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20  sage if.  ** it 
5710: 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  does..  */.  if(
5720: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
5730: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
5740: 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  arse) ){.    got
5750: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
5760: 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  ror;.  }.  pTabl
5770: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  e = sqlite3FindT
5780: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
5790: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
57a0: 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  me);.  if( pTabl
57b0: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
57c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
57d0: 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61   "table %T alrea
57e0: 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d  dy exists", pNam
57f0: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67  e);.    goto beg
5800: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
5810: 20 20 7d 0a 20 20 69 66 28 20 28 70 49 64 78 20    }.  if( (pIdx 
5820: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
5830: 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  ex(db, zName, 0)
5840: 29 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20 28  )!=0 && .      (
5850: 20 69 44 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e   iDb==0 || !db->
5860: 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20  init.busy) ){.  
5870: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5880: 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
5890: 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69   is already an i
58a0: 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20  ndex named %s", 
58b0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
58c0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
58d0: 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  or;.  }.  pTable
58e0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
58f0: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
5900: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ;.  if( pTable==
5910: 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  0 ){.    pParse-
5920: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
5930: 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  EM;.    pParse->
5940: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
5950: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
5960: 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  or;.  }.  pTable
5970: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
5980: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  .  pTable->nCol 
5990: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61  = 0;.  pTable->a
59a0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  Col = 0;.  pTabl
59b0: 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  e->iPKey = -1;. 
59c0: 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20   pTable->pIndex 
59d0: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69  = 0;.  pTable->i
59e0: 44 62 20 3d 20 69 44 62 3b 0a 20 20 69 66 28 20  Db = iDb;.  if( 
59f0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
5a00: 65 20 29 20 73 71 6c 69 74 65 33 44 65 6c 65 74  e ) sqlite3Delet
5a10: 65 54 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73  eTable(db, pPars
5a20: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20  e->pNewTable);. 
5a30: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
5a40: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20  le = pTable;..  
5a50: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
5a60: 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73  e magic sqlite_s
5a70: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73  equence table us
5a80: 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d  ed by autoincrem
5a90: 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  ent,.  ** then r
5aa0: 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20  ecord a pointer 
5ab0: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e  to this table in
5ac0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
5ad0: 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
5ae0: 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54  * so that INSERT
5af0: 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61   can find the ta
5b00: 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f  ble easily..  */
5b10: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5b20: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
5b30: 4e 54 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  NT.  if( strcmp(
5b40: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73  zName, "sqlite_s
5b50: 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a  equence")==0 ){.
5b60: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
5b70: 2e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c  .pSeqTab = pTabl
5b80: 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
5b90: 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
5ba0: 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68  ting the code th
5bb0: 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74  at will insert t
5bc0: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
5bd0: 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51  into.  ** the SQ
5be0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
5bf0: 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74  e.  Note in part
5c00: 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d  icular that we m
5c10: 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a  ust go ahead.  *
5c20: 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74  * and allocate t
5c30: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
5c40: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65   for the table e
5c50: 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72  ntry now.  Befor
5c60: 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41  e any.  ** PRIMA
5c70: 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
5c80: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61   keywords are pa
5c90: 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79  rsed.  Those key
5ca0: 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65  words will cause
5cb0: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f  .  ** indices to
5cc0: 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20   be created and 
5cd0: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
5ce0: 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72   must come befor
5cf0: 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69  e the .  ** indi
5d00: 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ces.  Hence, the
5d10: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
5d20: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73  or the table mus
5d30: 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20  t be allocated. 
5d40: 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   ** now..  */.  
5d50: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
5d60: 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74  sy && (v = sqlit
5d70: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
5d80: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ))!=0 ){.    sql
5d90: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
5da0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
5db0: 30 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a  0, iDb);..    /*
5dc0: 20 45 76 65 72 79 20 74 69 6d 65 20 61 20 6e 65   Every time a ne
5dd0: 77 20 74 61 62 6c 65 20 69 73 20 63 72 65 61 74  w table is creat
5de0: 65 64 20 74 68 65 20 66 69 6c 65 2d 66 6f 72 6d  ed the file-form
5df0: 61 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65 6e  at.    ** and en
5e00: 63 6f 64 69 6e 67 20 6d 65 74 61 2d 76 61 6c 75  coding meta-valu
5e10: 65 73 20 61 72 65 20 73 65 74 20 69 6e 20 74 68  es are set in th
5e20: 65 20 64 61 74 61 62 61 73 65 2c 20 69 6e 0a 20  e database, in. 
5e30: 20 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20     ** case this 
5e40: 69 73 20 74 68 65 20 66 69 72 73 74 20 74 61 62  is the first tab
5e50: 6c 65 20 63 72 65 61 74 65 64 2e 0a 20 20 20 20  le created..    
5e60: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
5e70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
5e80: 74 65 67 65 72 2c 20 64 62 2d 3e 66 69 6c 65 5f  teger, db->file_
5e90: 66 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20  format, 0);.    
5ea0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5eb0: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
5ec0: 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 73  , iDb, 1);.    s
5ed0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5ee0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64  v, OP_Integer, d
5ef0: 62 2d 3e 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  b->enc, 0);.    
5f00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5f10: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
5f20: 2c 20 69 44 62 2c 20 34 29 3b 0a 0a 20 20 20 20  , iDb, 4);..    
5f30: 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65  /* This just cre
5f40: 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c  ates a place-hol
5f50: 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68  der record in th
5f60: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
5f70: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68  table..    ** Th
5f80: 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64  e record created
5f90: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
5fa0: 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20  n anything yet. 
5fb0: 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c   It will be repl
5fc0: 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  aced.    ** by t
5fd0: 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e  he real entry in
5fe0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
5ff0: 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  at sqlite3EndTab
6000: 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  le()..    **.   
6010: 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
6020: 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  r the new entry 
6030: 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 74  is left on the t
6040: 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
6050: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  .    ** The rowi
6060: 64 20 76 61 6c 75 65 20 69 73 20 6e 65 65 64 65  d value is neede
6070: 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68  d by the code th
6080: 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  at sqlite3EndTab
6090: 6c 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 67  le will.    ** g
60a0: 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a  enerate..    */.
60b0: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d      sqlite3OpenM
60c0: 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69 44  asterTable(v, iD
60d0: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
60e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
60f0: 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a  ewRecno, 0, 0);.
6100: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6110: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
6120: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
6130: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6140: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29  P_String8, 0, 0)
6150: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6160: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
6170: 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20  IntKey, 0, 0);. 
6180: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6190: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
61a0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f   0, 0);.  }..  /
61b0: 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72  * Normal (non-er
61c0: 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a  ror) return. */.
61d0: 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20    return;..  /* 
61e0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
61f0: 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65  rs, we jump here
6200: 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f   */.begin_table_
6210: 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 46  error:.  sqliteF
6220: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  ree(zName);.  re
6230: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  turn;.}../*.** A
6240: 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20  dd a new column 
6250: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
6260: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
6270: 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  structed..**.** 
6280: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
6290: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
62a0: 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ce for each colu
62b0: 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  mn declaration.*
62c0: 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  * in a CREATE TA
62d0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
62e0: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
62f0: 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a  e() gets called.
6300: 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20  ** first to get 
6310: 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54  things going.  T
6320: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
6330: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65   is called for e
6340: 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a  ach.** column..*
6350: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
6360: 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70  dColumn(Parse *p
6370: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
6380: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
6390: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
63a0: 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  r *z;.  Column *
63b0: 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d  pCol;.  if( (p =
63c0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
63d0: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
63e0: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61  .  z = sqlite3Na
63f0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
6400: 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  e);.  if( z==0 )
6410: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
6420: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
6430: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
6440: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 70  ite3StrICmp(z, p
6450: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
6460: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
6470: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6480: 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20  rse, "duplicate 
6490: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22  column name: %s"
64a0: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , z);.      sqli
64b0: 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20  teFree(z);.     
64c0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
64d0: 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f   }.  if( (p->nCo
64e0: 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20  l & 0x7)==0 ){. 
64f0: 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b     Column *aNew;
6500: 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69  .    aNew = sqli
6510: 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 43  teRealloc( p->aC
6520: 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a  ol, (p->nCol+8)*
6530: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
6540: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65  ]));.    if( aNe
6550: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  w==0 ) return;. 
6560: 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65     p->aCol = aNe
6570: 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20  w;.  }.  pCol = 
6580: 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c  &p->aCol[p->nCol
6590: 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c  ];.  memset(pCol
65a0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61  , 0, sizeof(p->a
65b0: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c  Col[0]));.  pCol
65c0: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20  ->zName = z;. . 
65d0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
65e0: 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65  no type specifie
65f0: 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20  d, columns have 
6600: 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69  the default affi
6610: 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27  nity.  ** 'NONE'
6620: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
6630: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
6640: 74 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43  then sqlite3AddC
6650: 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c  olumnType() will
6660: 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  .  ** be called 
6670: 6e 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c  next to set pCol
6680: 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65  ->affinity corre
6690: 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f  ctly..  */.  pCo
66a0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
66b0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
66c0: 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70   pCol->pColl = p
66d0: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
66e0: 43 6f 6c 6c 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b  Coll;.  p->nCol+
66f0: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  +;.}../*.** This
6700: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
6710: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
6720: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
6730: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
6740: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
6750: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20  E statement.  A 
6760: 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74  "NOT NULL" const
6770: 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65  raint has.** bee
6780: 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75  n seen on a colu
6790: 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  mn.  This routin
67a0: 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75  e sets the notNu
67b0: 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68  ll flag on.** th
67c0: 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  e column current
67d0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
67e0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
67f0: 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c  qlite3AddNotNull
6800: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6810: 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20  int onError){.  
6820: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
6830: 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  i;.  if( (p = pP
6840: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
6850: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
6860: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
6870: 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61   if( i>=0 ) p->a
6880: 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d  Col[i].notNull =
6890: 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   onError;.}../*.
68a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
68b0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
68c0: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
68d0: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
68e0: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
68f0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
6900: 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73 74 20  nt.  The pFirst 
6910: 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72  token is the fir
6920: 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74  st.** token in t
6930: 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74  he sequence of t
6940: 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63 72  okens that descr
6950: 69 62 65 20 74 68 65 20 74 79 70 65 20 6f 66 20  ibe the type of 
6960: 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75  the.** column cu
6970: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
6980: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c  nstruction.   pL
6990: 61 73 74 20 69 73 20 74 68 65 20 6c 61 73 74 20  ast is the last 
69a0: 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  token.** in the 
69b0: 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74  sequence.  Use t
69c0: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
69d0: 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73  to construct a s
69e0: 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f  tring.** that co
69f0: 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e  ntains the typen
6a00: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
6a10: 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74  n and store that
6a20: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54   string.** in zT
6a30: 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71  ype..*/ .void sq
6a40: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79  lite3AddColumnTy
6a50: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
6a60: 2c 20 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c  , Token *pFirst,
6a70: 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74 29 7b 0a   Token *pLast){.
6a80: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
6a90: 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b  t i, j;.  int n;
6aa0: 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a 2a 70 7a  .  char *z, **pz
6ab0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
6ac0: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
6ad0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
6ae0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
6af0: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
6b00: 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
6b10: 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61  ;.  pCol = &p->a
6b20: 43 6f 6c 5b 69 5d 3b 0a 20 20 70 7a 20 3d 20 26  Col[i];.  pz = &
6b30: 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 6e  pCol->zType;.  n
6b40: 20 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b 20 28 70   = pLast->n + (p
6b50: 4c 61 73 74 2d 3e 7a 20 2d 20 70 46 69 72 73 74  Last->z - pFirst
6b60: 2d 3e 7a 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ->z);.  assert( 
6b70: 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29  pCol->zType==0 )
6b80: 3b 0a 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54  ;.  z = pCol->zT
6b90: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ype = sqlite3MPr
6ba0: 69 6e 74 66 28 22 25 2e 2a 73 22 2c 20 6e 2c 20  intf("%.*s", n, 
6bb0: 70 46 69 72 73 74 2d 3e 7a 29 3b 0a 20 20 69 66  pFirst->z);.  if
6bc0: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
6bd0: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 5b  .  for(i=j=0; z[
6be0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  i]; i++){.    in
6bf0: 74 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20  t c = z[i];.    
6c00: 69 66 28 20 69 73 73 70 61 63 65 28 63 29 20 29  if( isspace(c) )
6c10: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a   continue;.    z
6c20: 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20  [j++] = c;.  }. 
6c30: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 70 43 6f   z[j] = 0;.  pCo
6c40: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
6c50: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
6c60: 65 28 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e(z, n);.}../*.*
6c70: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
6c80: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
6c90: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f  value for the mo
6ca0: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
6cb0: 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74  d column.** of t
6cc0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
6cd0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
6ce0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66  ction..**.** Def
6cf0: 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65  ault value expre
6d00: 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63  ssions must be c
6d10: 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20  onstant.  Raise 
6d20: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20  an exception if 
6d30: 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74  this.** is not t
6d40: 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  he case..**.** T
6d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
6d60: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
6d70: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
6d80: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
6d90: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
6da0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
6db0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
6dc0: 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50  ddDefaultValue(P
6dd0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
6de0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 61  pr *pExpr){.  Ta
6df0: 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e  ble *p;.  Column
6e00: 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70   *pCol;.  if( (p
6e10: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
6e20: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
6e30: 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d  n;.  pCol = &(p-
6e40: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d  >aCol[p->nCol-1]
6e50: 29 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  );.  if( !sqlite
6e60: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
6e70: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71  pExpr) ){.    sq
6e80: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6e90: 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76  arse, "default v
6ea0: 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b  alue of column [
6eb0: 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  %s] is not const
6ec0: 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 70 43  ant",.        pC
6ed0: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  ol->zName);.  }e
6ee0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
6ef0: 45 78 70 72 44 65 6c 65 74 65 28 70 43 6f 6c 2d  ExprDelete(pCol-
6f00: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 70 43 6f  >pDflt);.    pCo
6f10: 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74  l->pDflt = sqlit
6f20: 65 33 45 78 70 72 44 75 70 28 70 45 78 70 72 29  e3ExprDup(pExpr)
6f30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
6f40: 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 70 50  rResolveNames(pP
6f50: 61 72 73 65 2c 30 2c 30 2c 30 2c 70 45 78 70 72  arse,0,0,0,pExpr
6f60: 2c 30 2c 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ,0,0);.  }.  sql
6f70: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
6f80: 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
6f90: 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52  Designate the PR
6fa0: 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68  IMARY KEY for th
6fb0: 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20  e table.  pList 
6fc0: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d  is a list of nam
6fd0: 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e  es .** of column
6fe0: 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  s that form the 
6ff0: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
7000: 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20   pList is NULL, 
7010: 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74  then the.** most
7020: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
7030: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
7040: 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61  ble is the prima
7050: 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20  ry key..**.** A 
7060: 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61  table can have a
7070: 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61  t most one prima
7080: 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20  ry key.  If the 
7090: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
70a0: 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b  s.** a primary k
70b0: 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20  ey (and this is 
70c0: 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61  the second prima
70d0: 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65  ry key) then cre
70e0: 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e  ate an.** error.
70f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52  .**.** If the PR
7100: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20  IMARY KEY is on 
7110: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
7120: 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69  whose datatype i
7130: 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68  s INTEGER,.** th
7140: 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74  en we will try t
7150: 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d  o use that colum
7160: 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20  n as the rowid. 
7170: 20 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69   Set the Table.i
7180: 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66  PKey.** field of
7190: 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72   the table under
71a0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f   construction to
71b0: 20 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66   be the index of
71c0: 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20   the.** INTEGER 
71d0: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
71e0: 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79  mn.  Table.iPKey
71f0: 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66   is set to -1 if
7200: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
7210: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
7220: 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  KEY..**.** If th
7230: 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20  e key is not an 
7240: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
7250: 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65  KEY, then create
7260: 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64   a unique.** ind
7270: 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20  ex for the key. 
7280: 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65   No index is cre
7290: 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52  ated for INTEGER
72a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a   PRIMARY KEYs..*
72b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
72c0: 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50  dPrimaryKey(.  P
72d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
72e0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
72f0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
7300: 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  t *pList,  /* Li
7310: 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65  st of field name
7320: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
7330: 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
7340: 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  ,      /* What t
7350: 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71  o do with a uniq
7360: 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20  ueness conflict 
7370: 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63  */.  int autoInc
7380: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
7390: 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d  f the AUTOINCREM
73a0: 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  ENT keyword is p
73b0: 72 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54  resent */.){.  T
73c0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
73d0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
73e0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
73f0: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
7400: 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70 54 61  -1, i;.  if( pTa
7410: 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 69 6d  b==0 ) goto prim
7420: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20  ary_key_exit;.  
7430: 69 66 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69  if( pTab->hasPri
7440: 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  mKey ){.    sqli
7450: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
7460: 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c  se, .      "tabl
7470: 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72  e \"%s\" has mor
7480: 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61  e than one prima
7490: 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a  ry key", pTab->z
74a0: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
74b0: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
74c0: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61  ;.  }.  pTab->ha
74d0: 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20  sPrimKey = 1;.  
74e0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
74f0: 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
7500: 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70  >nCol - 1;.    p
7510: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
7520: 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20  isPrimKey = 1;. 
7530: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
7540: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
7550: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
7560: 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
7570: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43  l<pTab->nCol; iC
7580: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ol++){.        i
7590: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
75a0: 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
75b0: 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ame, pTab->aCol[
75c0: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  iCol].zName)==0 
75d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
75e0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
75f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7600: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  iCol<pTab->nCol 
7610: 29 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ) pTab->aCol[iCo
7620: 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31  l].isPrimKey = 1
7630: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7640: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29  pList->nExpr>1 )
7650: 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a   iCol = -1;.  }.
7660: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
7670: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
7680: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
7690: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
76a0: 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66  .zType;.  }.  if
76b0: 28 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74  ( zType && sqlit
76c0: 65 33 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c  e3StrICmp(zType,
76d0: 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 20 29   "INTEGER")==0 )
76e0: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  {.    pTab->iPKe
76f0: 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54  y = iCol;.    pT
7700: 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e  ab->keyConf = on
7710: 45 72 72 6f 72 3b 0a 20 20 20 20 70 54 61 62 2d  Error;.    pTab-
7720: 3e 61 75 74 6f 49 6e 63 20 3d 20 61 75 74 6f 49  >autoInc = autoI
7730: 6e 63 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  nc;.  }else if( 
7740: 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64  autoInc ){.#ifnd
7750: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
7760: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
7770: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7780: 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e  (pParse, "AUTOIN
7790: 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20  CREMENT is only 
77a0: 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a  allowed on an ".
77b0: 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20         "INTEGER 
77c0: 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23  PRIMARY KEY");.#
77d0: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
77e0: 20 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65     sqlite3Create
77f0: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c  Index(pParse, 0,
7800: 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e   0, 0, pList, on
7810: 45 72 72 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20  Error, 0, 0);.  
7820: 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d    pList = 0;.  }
7830: 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  ..primary_key_ex
7840: 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  it:.  sqlite3Exp
7850: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  rListDelete(pLis
7860: 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  t);.  return;.}.
7870: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
7880: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
7890: 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
78a0: 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61  cently parsed ta
78b0: 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f  ble column.** to
78c0: 20 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76   the CollSeq giv
78d0: 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  en..*/.void sqli
78e0: 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70  te3AddCollateTyp
78f0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
7900: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
7910: 70 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a  pe, int nType){.
7920: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 49 6e    Table *p;.  In
7930: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 43 6f 6c  dex *pIdx;.  Col
7940: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69  lSeq *pColl;.  i
7950: 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 28 70 20  nt i;..  if( (p 
7960: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
7970: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
7980: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
7990: 31 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71  1;..  pColl = sq
79a0: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
79b0: 65 71 28 70 50 61 72 73 65 2c 20 7a 54 79 70 65  eq(pParse, zType
79c0: 2c 20 6e 54 79 70 65 29 3b 0a 20 20 70 2d 3e 61  , nType);.  p->a
79d0: 43 6f 6c 5b 69 5d 2e 70 43 6f 6c 6c 20 3d 20 70  Col[i].pColl = p
79e0: 43 6f 6c 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Coll;..  /* If t
79f0: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63  he column is dec
7a00: 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e  lared as "<name>
7a10: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c   PRIMARY KEY COL
7a20: 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20  LATE <type>",.  
7a30: 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78  ** then an index
7a40: 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63   may have been c
7a50: 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63  reated on this c
7a60: 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65  olumn before the
7a70: 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20  .  ** collation 
7a80: 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20  type was added. 
7a90: 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20  Correct this if 
7aa0: 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  it is the case..
7ab0: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 20    */.  for(pIdx 
7ac0: 3d 20 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  = p->pIndex; pId
7ad0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
7ae0: 65 78 74 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ext){.    assert
7af0: 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d  ( pIdx->nColumn=
7b00: 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  =1 );.    if( pI
7b10: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
7b20: 3d 69 20 29 20 70 49 64 78 2d 3e 6b 65 79 49 6e  =i ) pIdx->keyIn
7b30: 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 43  fo.aColl[0] = pC
7b40: 6f 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  oll;.  }.}../*.*
7b50: 2a 20 4c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  * Locate and ret
7b60: 75 72 6e 20 61 6e 20 65 6e 74 72 79 20 66 72 6f  urn an entry fro
7b70: 6d 20 74 68 65 20 64 62 2e 61 43 6f 6c 6c 53 65  m the db.aCollSe
7b80: 71 20 68 61 73 68 20 74 61 62 6c 65 2e 20 49 66  q hash table. If
7b90: 20 74 68 65 20 65 6e 74 72 79 0a 2a 2a 20 73 70   the entry.** sp
7ba0: 65 63 69 66 69 65 64 20 62 79 20 7a 4e 61 6d 65  ecified by zName
7bb0: 20 61 6e 64 20 6e 4e 61 6d 65 20 69 73 20 6e 6f   and nName is no
7bc0: 74 20 66 6f 75 6e 64 20 61 6e 64 20 70 61 72 61  t found and para
7bd0: 6d 65 74 65 72 20 27 63 72 65 61 74 65 27 20 69  meter 'create' i
7be0: 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 6e 20  s.** true, then 
7bf0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 6e 74  create a new ent
7c00: 72 79 2e 20 4f 74 68 65 72 77 69 73 65 20 72 65  ry. Otherwise re
7c10: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
7c20: 20 45 61 63 68 20 70 6f 69 6e 74 65 72 20 73 74   Each pointer st
7c30: 6f 72 65 64 20 69 6e 20 74 68 65 20 73 71 6c 69  ored in the sqli
7c40: 74 65 33 2e 61 43 6f 6c 6c 53 65 71 20 68 61 73  te3.aCollSeq has
7c50: 68 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73  h table contains
7c60: 20 61 6e 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20   an.** array of 
7c70: 74 68 72 65 65 20 43 6f 6c 6c 53 65 71 20 73 74  three CollSeq st
7c80: 72 75 63 74 75 72 65 73 2e 20 54 68 65 20 66 69  ructures. The fi
7c90: 72 73 74 20 69 73 20 74 68 65 20 63 6f 6c 6c 61  rst is the colla
7ca0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2a  tion sequence.**
7cb0: 20 70 72 65 66 66 65 72 72 65 64 20 66 6f 72 20   prefferred for 
7cc0: 55 54 46 2d 38 2c 20 74 68 65 20 73 65 63 6f 6e  UTF-8, the secon
7cd0: 64 20 55 54 46 2d 31 36 6c 65 2c 20 61 6e 64 20  d UTF-16le, and 
7ce0: 74 68 65 20 74 68 69 72 64 20 55 54 46 2d 31 36  the third UTF-16
7cf0: 62 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 64  be..**.** Stored
7d00: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
7d10: 65 72 20 74 68 65 20 74 68 72 65 65 20 63 6f 6c  er the three col
7d20: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
7d30: 20 69 73 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a   is a copy of.**
7d40: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
7d50: 65 71 75 65 6e 63 65 20 6e 61 6d 65 2e 20 41 20  equence name. A 
7d60: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
7d70: 73 74 72 69 6e 67 20 69 73 20 73 74 6f 72 65 64  string is stored
7d80: 20 69 6e 0a 2a 2a 20 65 61 63 68 20 63 6f 6c 6c   in.** each coll
7d90: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 73  ation sequence s
7da0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
7db0: 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 20 66 69  tic CollSeq * fi
7dc0: 6e 64 43 6f 6c 6c 53 65 71 45 6e 74 72 79 28 0a  ndCollSeqEntry(.
7dd0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
7de0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
7df0: 6d 65 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c  me,.  int nName,
7e00: 0a 20 20 69 6e 74 20 63 72 65 61 74 65 0a 29 7b  .  int create.){
7e10: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
7e20: 6c 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30  l;.  if( nName<0
7e30: 20 29 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65   ) nName = strle
7e40: 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 43 6f 6c  n(zName);.  pCol
7e50: 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  l = sqlite3HashF
7e60: 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ind(&db->aCollSe
7e70: 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  q, zName, nName)
7e80: 3b 0a 0a 20 20 69 66 28 20 30 3d 3d 70 43 6f 6c  ;..  if( 0==pCol
7e90: 6c 20 26 26 20 63 72 65 61 74 65 20 29 7b 0a 20  l && create ){. 
7ea0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
7eb0: 65 4d 61 6c 6c 6f 63 28 20 33 2a 73 69 7a 65 6f  eMalloc( 3*sizeo
7ec0: 66 28 2a 70 43 6f 6c 6c 29 20 2b 20 6e 4e 61 6d  f(*pColl) + nNam
7ed0: 65 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28  e + 1 );.    if(
7ee0: 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
7ef0: 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 20 3d  pColl[0].zName =
7f00: 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 5b 33   (char*)&pColl[3
7f10: 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 30  ];.      pColl[0
7f20: 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ].enc = SQLITE_U
7f30: 54 46 38 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  TF8;.      pColl
7f40: 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61  [1].zName = (cha
7f50: 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20  r*)&pColl[3];.  
7f60: 20 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e 65 6e 63      pColl[1].enc
7f70: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c   = SQLITE_UTF16L
7f80: 45 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 32  E;.      pColl[2
7f90: 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ].zName = (char*
7fa0: 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20  )&pColl[3];.    
7fb0: 20 20 70 43 6f 6c 6c 5b 32 5d 2e 65 6e 63 20 3d    pColl[2].enc =
7fc0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b   SQLITE_UTF16BE;
7fd0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43  .      memcpy(pC
7fe0: 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e  oll[0].zName, zN
7ff0: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20  ame, nName);.   
8000: 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d     pColl[0].zNam
8010: 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20  e[nName] = 0;.  
8020: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
8030: 6e 73 65 72 74 28 26 64 62 2d 3e 61 43 6f 6c 6c  nsert(&db->aColl
8040: 53 65 71 2c 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e  Seq, pColl[0].zN
8050: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 70 43 6f 6c  ame, nName, pCol
8060: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  l);.    }.  }.  
8070: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
8080: 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
8090: 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f   zName points to
80a0: 20 61 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64   a UTF-8 encoded
80b0: 20 73 74 72 69 6e 67 20 6e 4e 61 6d 65 20 62 79   string nName by
80c0: 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2a 20 52 65 74  tes long..** Ret
80d0: 75 72 6e 20 74 68 65 20 43 6f 6c 6c 53 65 71 2a  urn the CollSeq*
80e0: 20 70 6f 69 6e 74 65 72 20 66 6f 72 20 74 68 65   pointer for the
80f0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
8100: 6e 63 65 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 0a  nce named zName.
8110: 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 63 6f 64  ** for the encod
8120: 69 6e 67 20 27 65 6e 63 27 20 66 72 6f 6d 20 74  ing 'enc' from t
8130: 68 65 20 64 61 74 61 62 61 73 65 20 27 64 62 27  he database 'db'
8140: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
8150: 6e 74 72 79 20 73 70 65 63 69 66 69 65 64 20 69  ntry specified i
8160: 73 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 64 20  s not found and 
8170: 27 63 72 65 61 74 65 27 20 69 73 20 74 72 75 65  'create' is true
8180: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 0a  , then create a.
8190: 2a 2a 20 6e 65 77 20 65 6e 74 72 79 2e 20 20 4f  ** new entry.  O
81a0: 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
81b0: 4e 55 4c 4c 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  NULL..*/.CollSeq
81c0: 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c   *sqlite3FindCol
81d0: 6c 53 65 71 28 0a 20 20 73 71 6c 69 74 65 33 20  lSeq(.  sqlite3 
81e0: 2a 64 62 2c 0a 20 20 75 38 20 65 6e 63 2c 0a 20  *db,.  u8 enc,. 
81f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
8200: 6d 65 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c  me,.  int nName,
8210: 0a 20 20 69 6e 74 20 63 72 65 61 74 65 0a 29 7b  .  int create.){
8220: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
8230: 6c 20 3d 20 66 69 6e 64 43 6f 6c 6c 53 65 71 45  l = findCollSeqE
8240: 6e 74 72 79 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ntry(db, zName, 
8250: 6e 4e 61 6d 65 2c 20 63 72 65 61 74 65 29 3b 0a  nName, create);.
8260: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
8270: 5f 55 54 46 38 3d 3d 31 20 26 26 20 53 51 4c 49  _UTF8==1 && SQLI
8280: 54 45 5f 55 54 46 31 36 4c 45 3d 3d 32 20 26 26  TE_UTF16LE==2 &&
8290: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3d   SQLITE_UTF16BE=
82a0: 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =3 );.  assert( 
82b0: 65 6e 63 3e 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc>=SQLITE_UTF8
82c0: 20 26 26 20 65 6e 63 3c 3d 53 51 4c 49 54 45 5f   && enc<=SQLITE_
82d0: 55 54 46 31 36 42 45 20 29 3b 0a 20 20 69 66 28  UTF16BE );.  if(
82e0: 20 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 2b   pColl ) pColl +
82f0: 3d 20 65 6e 63 2d 31 3b 0a 20 20 72 65 74 75 72  = enc-1;.  retur
8300: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pColl;.}../*.*
8310: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 27 63 6f  * Invoke the 'co
8320: 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 27 20  llation needed' 
8330: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 72 65 71 75  callback to requ
8340: 65 73 74 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20  est a collation 
8350: 73 65 71 75 65 6e 63 65 0a 2a 2a 20 69 6e 20 74  sequence.** in t
8360: 68 65 20 64 61 74 61 62 61 73 65 20 74 65 78 74  he database text
8370: 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 6e 61 6d   encoding of nam
8380: 65 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  e zName, length 
8390: 6e 4e 61 6d 65 2e 0a 2a 2a 20 49 66 20 74 68 65  nName..** If the
83a0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
83b0: 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nce.*/.static vo
83c0: 69 64 20 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65  id callCollNeede
83d0: 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  d(sqlite3 *db, c
83e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
83f0: 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20  , int nName){.  
8400: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 78 43 6f  assert( !db->xCo
8410: 6c 6c 4e 65 65 64 65 64 20 7c 7c 20 21 64 62 2d  llNeeded || !db-
8420: 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 29  >xCollNeeded16 )
8430: 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20  ;.  if( nName<0 
8440: 29 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e  ) nName = strlen
8450: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 64  (zName);.  if( d
8460: 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 29  b->xCollNeeded )
8470: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78 74  {.    char *zExt
8480: 65 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 53 74  ernal = sqliteSt
8490: 72 4e 44 75 70 28 7a 4e 61 6d 65 2c 20 6e 4e 61  rNDup(zName, nNa
84a0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 45  me);.    if( !zE
84b0: 78 74 65 72 6e 61 6c 20 29 20 72 65 74 75 72 6e  xternal ) return
84c0: 3b 0a 20 20 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  ;.    db->xCollN
84d0: 65 65 64 65 64 28 64 62 2d 3e 70 43 6f 6c 6c 4e  eeded(db->pCollN
84e0: 65 65 64 65 64 41 72 67 2c 20 64 62 2c 20 28 69  eededArg, db, (i
84f0: 6e 74 29 64 62 2d 3e 65 6e 63 2c 20 7a 45 78 74  nt)db->enc, zExt
8500: 65 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  ernal);.    sqli
8510: 74 65 46 72 65 65 28 7a 45 78 74 65 72 6e 61 6c  teFree(zExternal
8520: 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  );.  }.#ifndef S
8530: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
8540: 0a 20 20 69 66 28 20 64 62 2d 3e 78 43 6f 6c 6c  .  if( db->xColl
8550: 4e 65 65 64 65 64 31 36 20 29 7b 0a 20 20 20 20  Needed16 ){.    
8560: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 45 78 74  char const *zExt
8570: 65 72 6e 61 6c 3b 0a 20 20 20 20 73 71 6c 69 74  ernal;.    sqlit
8580: 65 33 5f 76 61 6c 75 65 20 2a 70 54 6d 70 20 3d  e3_value *pTmp =
8590: 20 73 71 6c 69 74 65 33 47 65 74 54 72 61 6e 73   sqlite3GetTrans
85a0: 69 65 6e 74 56 61 6c 75 65 28 64 62 29 3b 0a 20  ientValue(db);. 
85b0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
85c0: 65 74 53 74 72 28 70 54 6d 70 2c 20 2d 31 2c 20  etStr(pTmp, -1, 
85d0: 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54  zName, SQLITE_UT
85e0: 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  F8, SQLITE_STATI
85f0: 43 29 3b 0a 20 20 20 20 7a 45 78 74 65 72 6e 61  C);.    zExterna
8600: 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
8610: 54 65 78 74 28 70 54 6d 70 2c 20 53 51 4c 49 54  Text(pTmp, SQLIT
8620: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a  E_UTF16NATIVE);.
8630: 20 20 20 20 69 66 28 20 21 7a 45 78 74 65 72 6e      if( !zExtern
8640: 61 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  al ) return;.   
8650: 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
8660: 31 36 28 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64  16(db->pCollNeed
8670: 65 64 41 72 67 2c 20 64 62 2c 20 28 69 6e 74 29  edArg, db, (int)
8680: 64 62 2d 3e 65 6e 63 2c 20 7a 45 78 74 65 72 6e  db->enc, zExtern
8690: 61 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  al);.  }.#endif.
86a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
86b0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
86c0: 69 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  if the collation
86d0: 20 66 61 63 74 6f 72 79 20 66 61 69 6c 73 20 74   factory fails t
86e0: 6f 20 64 65 6c 69 76 65 72 20 61 0a 2a 2a 20 63  o deliver a.** c
86f0: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
8700: 6e 20 69 6e 20 74 68 65 20 62 65 73 74 20 65 6e  n in the best en
8710: 63 6f 64 69 6e 67 20 62 75 74 20 74 68 65 72 65  coding but there
8720: 20 6d 61 79 20 62 65 20 6f 74 68 65 72 20 76 65   may be other ve
8730: 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 74 68 69  rsions.** of thi
8740: 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  s collation func
8750: 74 69 6f 6e 20 28 66 6f 72 20 6f 74 68 65 72 20  tion (for other 
8760: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73 29 20  text encodings) 
8770: 61 76 61 69 6c 61 62 6c 65 2e 20 55 73 65 20 6f  available. Use o
8780: 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 73 65 20 69  ne.** of these i
8790: 6e 73 74 65 61 64 20 69 66 20 74 68 65 79 20 65  nstead if they e
87a0: 78 69 73 74 2e 20 41 76 6f 69 64 20 61 20 55 54  xist. Avoid a UT
87b0: 46 2d 38 20 3c 2d 3e 20 55 54 46 2d 31 36 20 63  F-8 <-> UTF-16 c
87c0: 6f 6e 76 65 72 73 69 6f 6e 20 69 66 0a 2a 2a 20  onversion if.** 
87d0: 70 6f 73 73 69 62 6c 65 2e 0a 2a 2f 0a 73 74 61  possible..*/.sta
87e0: 74 69 63 20 69 6e 74 20 73 79 6e 74 68 43 6f 6c  tic int synthCol
87f0: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
8800: 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  se, CollSeq *pCo
8810: 6c 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ll){.  CollSeq *
8820: 70 43 6f 6c 6c 32 3b 0a 20 20 63 68 61 72 20 2a  pColl2;.  char *
8830: 7a 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  z = pColl->zName
8840: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c  ;.  int n = strl
8850: 65 6e 28 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33  en(z);.  sqlite3
8860: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
8870: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  b;.  int i;.  st
8880: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45  atic const u8 aE
8890: 6e 63 5b 5d 20 3d 20 7b 20 53 51 4c 49 54 45 5f  nc[] = { SQLITE_
88a0: 55 54 46 31 36 42 45 2c 20 53 51 4c 49 54 45 5f  UTF16BE, SQLITE_
88b0: 55 54 46 31 36 4c 45 2c 20 53 51 4c 49 54 45 5f  UTF16LE, SQLITE_
88c0: 55 54 46 38 20 7d 3b 0a 20 20 66 6f 72 28 69 3d  UTF8 };.  for(i=
88d0: 30 3b 20 69 3c 33 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<3; i++){.  
88e0: 20 20 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69 74    pColl2 = sqlit
88f0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
8900: 2c 20 61 45 6e 63 5b 69 5d 2c 20 7a 2c 20 6e 2c  , aEnc[i], z, n,
8910: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   0);.    if( pCo
8920: 6c 6c 32 2d 3e 78 43 6d 70 21 3d 30 20 29 7b 0a  ll2->xCmp!=0 ){.
8930: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f        memcpy(pCo
8940: 6c 6c 2c 20 70 43 6f 6c 6c 32 2c 20 73 69 7a 65  ll, pColl2, size
8950: 6f 66 28 43 6f 6c 6c 53 65 71 29 29 3b 0a 20 20  of(CollSeq));.  
8960: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8970: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
8980: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
8990: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  rr==0 ){.    sql
89a0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
89b0: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f  rse, "no such co
89c0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
89d0: 3a 20 25 2e 2a 73 22 2c 20 6e 2c 20 7a 29 3b 0a  : %.*s", n, z);.
89e0: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 45    }.  pParse->nE
89f0: 72 72 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 53  rr++;.  return S
8a00: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
8a10: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
8a20: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  ne is called on 
8a30: 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
8a40: 65 6e 63 65 20 62 65 66 6f 72 65 20 69 74 20 69  ence before it i
8a50: 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 63 68 65  s used to.** che
8a60: 63 6b 20 74 68 61 74 20 69 74 20 69 73 20 64 65  ck that it is de
8a70: 66 69 6e 65 64 2e 20 41 6e 20 75 6e 64 65 66 69  fined. An undefi
8a80: 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ned collation se
8a90: 71 75 65 6e 63 65 20 65 78 69 73 74 73 20 77 68  quence exists wh
8aa0: 65 6e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65  en.** a database
8ab0: 20 69 73 20 6c 6f 61 64 65 64 20 74 68 61 74 20   is loaded that 
8ac0: 63 6f 6e 74 61 69 6e 73 20 72 65 66 65 72 65 6e  contains referen
8ad0: 63 65 73 20 74 6f 20 63 6f 6c 6c 61 74 69 6f 6e  ces to collation
8ae0: 20 73 65 71 75 65 6e 63 65 73 0a 2a 2a 20 74 68   sequences.** th
8af0: 61 74 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e  at have not been
8b00: 20 64 65 66 69 6e 65 64 20 62 79 20 73 71 6c 69   defined by sqli
8b10: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
8b20: 74 69 6f 6e 28 29 20 65 74 63 2e 0a 2a 2a 0a 2a  tion() etc..**.*
8b30: 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 74  * If required, t
8b40: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c  his routine call
8b50: 73 20 74 68 65 20 27 63 6f 6c 6c 61 74 69 6f 6e  s the 'collation
8b60: 20 6e 65 65 64 65 64 27 20 63 61 6c 6c 62 61 63   needed' callbac
8b70: 6b 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20  k to.** request 
8b80: 61 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20  a definition of 
8b90: 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
8ba0: 71 75 65 6e 63 65 2e 20 49 66 20 74 68 69 73 20  quence. If this 
8bb0: 64 6f 65 73 6e 27 74 20 77 6f 72 6b 2c 20 0a 2a  doesn't work, .*
8bc0: 2a 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  * an equivalent 
8bd0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
8be0: 63 65 20 74 68 61 74 20 75 73 65 73 20 61 20 74  ce that uses a t
8bf0: 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 64 69 66  ext encoding dif
8c00: 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 74  ferent.** from t
8c10: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
8c20: 20 69 73 20 73 75 62 73 74 69 74 75 74 65 64 2c   is substituted,
8c30: 20 69 66 20 6f 6e 65 20 69 73 20 61 76 61 69 6c   if one is avail
8c40: 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
8c50: 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71  ite3CheckCollSeq
8c60: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8c70: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b  CollSeq *pColl){
8c80: 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20  .  if( pColl && 
8c90: 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a  !pColl->xCmp ){.
8ca0: 20 20 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74      /* No collat
8cb0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ion sequence of 
8cc0: 74 68 69 73 20 74 79 70 65 20 66 6f 72 20 74 68  this type for th
8cd0: 69 73 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 72  is encoding is r
8ce0: 65 67 69 73 74 65 72 65 64 2e 0a 20 20 20 20 2a  egistered..    *
8cf0: 2a 20 43 61 6c 6c 20 74 68 65 20 63 6f 6c 6c 61  * Call the colla
8d00: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 74 6f 20  tion factory to 
8d10: 73 65 65 20 69 66 20 69 74 20 63 61 6e 20 73 75  see if it can su
8d20: 70 70 6c 79 20 75 73 20 77 69 74 68 20 6f 6e 65  pply us with one
8d30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 6c  ..    */.    cal
8d40: 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 70 50 61 72  lCollNeeded(pPar
8d50: 73 65 2d 3e 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a  se->db, pColl->z
8d60: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 43 6f  Name, strlen(pCo
8d70: 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ll->zName));.   
8d80: 20 69 66 28 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d   if( !pColl->xCm
8d90: 70 20 26 26 20 73 79 6e 74 68 43 6f 6c 6c 53 65  p && synthCollSe
8da0: 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29  q(pParse, pColl)
8db0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8dc0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
8dd0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
8de0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
8df0: 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74  /*.** Call sqlit
8e00: 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 29  e3CheckCollSeq()
8e10: 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 6c 61 74 69   for all collati
8e20: 6e 67 20 73 65 71 75 65 6e 63 65 73 20 69 6e 20  ng sequences in 
8e30: 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 69 6e 20  an index,.** in 
8e40: 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66 79 20  order to verify 
8e50: 74 68 61 74 20 61 6c 6c 20 74 68 65 20 6e 65 63  that all the nec
8e60: 65 73 73 61 72 79 20 63 6f 6c 6c 61 74 69 6e 67  essary collating
8e70: 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 0a 2a   sequences are.*
8e80: 2a 20 6c 6f 61 64 65 64 2e 0a 2a 2f 0a 69 6e 74  * loaded..*/.int
8e90: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 49 6e 64   sqlite3CheckInd
8ea0: 65 78 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  exCollSeq(Parse 
8eb0: 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
8ec0: 70 49 64 78 29 7b 0a 20 20 69 66 28 20 70 49 64  pIdx){.  if( pId
8ed0: 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  x ){.    int i;.
8ee0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
8ef0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Idx->nColumn; i+
8f00: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
8f10: 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65  lite3CheckCollSe
8f20: 71 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e  q(pParse, pIdx->
8f30: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d  keyInfo.aColl[i]
8f40: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
8f50: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
8f60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8f70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
8f80: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
8f90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
8fa0: 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61  eturns the colla
8fb0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
8fc0: 72 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  r database nativ
8fd0: 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69  e text.** encodi
8fe0: 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ng identified by
8ff0: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d   the string zNam
9000: 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e  e, length nName.
9010: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
9020: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
9030: 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f  n sequence is no
9040: 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20  t available, or 
9050: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  not available.**
9060: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
9070: 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67   native encoding
9080: 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  , the collation 
9090: 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b  factory is invok
90a0: 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74  ed to.** request
90b0: 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c   it. If the coll
90c0: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f  ation factory do
90d0: 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75  es not supply su
90e0: 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a  ch a sequence,.*
90f0: 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e  * and the sequen
9100: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
9110: 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20  in another text 
9120: 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74  encoding, then t
9130: 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  hat is.** return
9140: 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
9150: 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73  * If no versions
9160: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65   of the requeste
9170: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71  d collations seq
9180: 75 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61  uence are availa
9190: 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68  ble, or.** anoth
91a0: 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  er error occurs,
91b0: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
91c0: 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d  d and an error m
91d0: 65 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69  essage written i
91e0: 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a  nto.** pParse..*
91f0: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
9200: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
9210: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
9220: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
9230: 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20  , int nName){.  
9240: 75 38 20 65 6e 63 20 3d 20 70 50 61 72 73 65 2d  u8 enc = pParse-
9250: 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 75 38 20 69  >db->enc;.  u8 i
9260: 6e 69 74 62 75 73 79 20 3d 20 70 50 61 72 73 65  nitbusy = pParse
9270: 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b  ->db->init.busy;
9280: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
9290: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
92a0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2d 3e 64  ollSeq(pParse->d
92b0: 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e  b, enc, zName, n
92c0: 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b  Name, initbusy);
92d0: 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29  .  if( nName<0 )
92e0: 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28   nName = strlen(
92f0: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 69  zName);.  if( !i
9300: 6e 69 74 62 75 73 79 20 26 26 20 28 21 70 43 6f  nitbusy && (!pCo
9310: 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43  ll || !pColl->xC
9320: 6d 70 29 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  mp) ){.    /* No
9330: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
9340: 6e 63 65 20 6f 66 20 74 68 69 73 20 74 79 70 65  nce of this type
9350: 20 66 6f 72 20 74 68 69 73 20 65 6e 63 6f 64 69   for this encodi
9360: 6e 67 20 69 73 20 72 65 67 69 73 74 65 72 65 64  ng is registered
9370: 2e 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 20 74 68  ..    ** Call th
9380: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
9390: 6f 72 79 20 74 6f 20 73 65 65 20 69 66 20 69 74  ory to see if it
93a0: 20 63 61 6e 20 73 75 70 70 6c 79 20 75 73 20 77   can supply us w
93b0: 69 74 68 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a  ith one..    */.
93c0: 20 20 20 20 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64      callCollNeed
93d0: 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ed(pParse->db, z
93e0: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
93f0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
9400: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61  3FindCollSeq(pPa
9410: 72 73 65 2d 3e 64 62 2c 20 65 6e 63 2c 20 7a 4e  rse->db, enc, zN
9420: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a  ame, nName, 0);.
9430: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26      if( pColl &&
9440: 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b   !pColl->xCmp ){
9450: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
9460: 6d 61 79 20 62 65 20 61 20 76 65 72 73 69 6f 6e  may be a version
9470: 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   of the collatio
9480: 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20  n sequence that 
9490: 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
94a0: 2a 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 62 65  * translation be
94b0: 74 77 65 65 6e 20 65 6e 63 6f 64 69 6e 67 73 2e  tween encodings.
94c0: 20 53 65 61 72 63 68 20 66 6f 72 20 69 74 20 77   Search for it w
94d0: 69 74 68 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71  ith synthCollSeq
94e0: 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ()..      */.   
94f0: 20 20 20 69 66 28 20 73 79 6e 74 68 43 6f 6c 6c     if( synthColl
9500: 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c  Seq(pParse, pCol
9510: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  l) ){.        re
9520: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
9530: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
9540: 49 66 20 6e 6f 74 68 69 6e 67 20 68 61 73 20 62  If nothing has b
9550: 65 65 6e 20 66 6f 75 6e 64 2c 20 77 72 69 74 65  een found, write
9560: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
9570: 67 65 20 69 6e 74 6f 20 70 50 61 72 73 65 20 2a  ge into pParse *
9580: 2f 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73  /.  if( !initbus
9590: 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20  y && (!pColl || 
95a0: 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b  !pColl->xCmp) ){
95b0: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
95c0: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
95d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
95e0: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
95f0: 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ch collation seq
9600: 75 65 6e 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e  uence: %.*s", nN
9610: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ame, zName);.   
9620: 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30   }.    pColl = 0
9630: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
9640: 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  Coll;.}..../*.**
9650: 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e   Scan the column
9660: 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65   type name zType
9670: 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20   (length nType) 
9680: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a  and return the.*
9690: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66  * associated aff
96a0: 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2f 0a 63  inity type..*/.c
96b0: 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e  har sqlite3Affin
96c0: 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68  ityType(const ch
96d0: 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e  ar *zType, int n
96e0: 54 79 70 65 29 7b 0a 20 20 69 6e 74 20 6e 2c 20  Type){.  int n, 
96f0: 69 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  i;.  static cons
9700: 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63  t struct {.    c
9710: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 62 3b  onst char *zSub;
9720: 20 20 2f 2a 20 4b 65 79 77 6f 72 64 73 20 73 75    /* Keywords su
9730: 62 73 74 72 69 6e 67 20 74 6f 20 73 65 61 72 63  bstring to searc
9740: 68 20 66 6f 72 20 2a 2f 0a 20 20 20 20 63 68 61  h for */.    cha
9750: 72 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20  r nSub;         
9760: 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 7a 53 75  /* length of zSu
9770: 62 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 61 66  b */.    char af
9780: 66 69 6e 69 74 79 3b 20 20 20 20 20 2f 2a 20 41  finity;     /* A
9790: 66 66 69 6e 69 74 79 20 74 6f 20 72 65 74 75 72  ffinity to retur
97a0: 6e 20 69 66 20 69 74 20 6d 61 74 63 68 65 73 20  n if it matches 
97b0: 2a 2f 0a 20 20 7d 20 73 75 62 73 74 72 69 6e 67  */.  } substring
97c0: 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 22 49 4e  s[] = {.    {"IN
97d0: 54 22 2c 20 20 33 2c 20 53 51 4c 49 54 45 5f 41  T",  3, SQLITE_A
97e0: 46 46 5f 49 4e 54 45 47 45 52 7d 2c 0a 20 20 20  FF_INTEGER},.   
97f0: 20 7b 22 43 48 41 52 22 2c 20 34 2c 20 53 51 4c   {"CHAR", 4, SQL
9800: 49 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c 0a 20  ITE_AFF_TEXT},. 
9810: 20 20 20 7b 22 43 4c 4f 42 22 2c 20 34 2c 20 53     {"CLOB", 4, S
9820: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c  QLITE_AFF_TEXT},
9830: 0a 20 20 20 20 7b 22 54 45 58 54 22 2c 20 34 2c  .    {"TEXT", 4,
9840: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
9850: 7d 2c 0a 20 20 20 20 7b 22 42 4c 4f 42 22 2c 20  },.    {"BLOB", 
9860: 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  4, SQLITE_AFF_NO
9870: 4e 45 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28  NE},.  };..  if(
9880: 20 6e 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20   nType==0 ){.   
9890: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
98a0: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 66  FF_NONE;.  }.  f
98b0: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
98c0: 28 73 75 62 73 74 72 69 6e 67 73 29 2f 73 69 7a  (substrings)/siz
98d0: 65 6f 66 28 73 75 62 73 74 72 69 6e 67 73 5b 30  eof(substrings[0
98e0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ]); i++){.    in
98f0: 74 20 63 31 20 3d 20 73 75 62 73 74 72 69 6e 67  t c1 = substring
9900: 73 5b 69 5d 2e 7a 53 75 62 5b 30 5d 3b 0a 20 20  s[i].zSub[0];.  
9910: 20 20 69 6e 74 20 63 32 20 3d 20 74 6f 6c 6f 77    int c2 = tolow
9920: 65 72 28 63 31 29 3b 0a 20 20 20 20 69 6e 74 20  er(c1);.    int 
9930: 6c 69 6d 69 74 20 3d 20 6e 54 79 70 65 20 2d 20  limit = nType - 
9940: 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 6e 53  substrings[i].nS
9950: 75 62 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ub;.    const ch
9960: 61 72 20 2a 7a 20 3d 20 73 75 62 73 74 72 69 6e  ar *z = substrin
9970: 67 73 5b 69 5d 2e 7a 53 75 62 3b 0a 20 20 20 20  gs[i].zSub;.    
9980: 66 6f 72 28 6e 3d 30 3b 20 6e 3c 3d 6c 69 6d 69  for(n=0; n<=limi
9990: 74 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69  t; n++){.      i
99a0: 6e 74 20 63 20 3d 20 7a 54 79 70 65 5b 6e 5d 3b  nt c = zType[n];
99b0: 0a 20 20 20 20 20 20 69 66 28 20 28 63 3d 3d 63  .      if( (c==c
99c0: 31 20 7c 7c 20 63 3d 3d 63 32 29 0a 20 20 20 20  1 || c==c2).    
99d0: 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73           && 0==s
99e0: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 26  qlite3StrNICmp(&
99f0: 7a 54 79 70 65 5b 6e 5d 2c 20 7a 2c 20 73 75 62  zType[n], z, sub
9a00: 73 74 72 69 6e 67 73 5b 69 5d 2e 6e 53 75 62 29  strings[i].nSub)
9a10: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
9a20: 72 6e 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d  rn substrings[i]
9a30: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  .affinity;.     
9a40: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
9a50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
9a60: 5f 4e 55 4d 45 52 49 43 3b 0a 7d 0a 0a 2f 2a 0a  _NUMERIC;.}../*.
9a70: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
9a80: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65   that will incre
9a90: 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20  ment the schema 
9aa0: 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  cookie..**.** Th
9ab0: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
9ac0: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
9ad0: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
9ae0: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
9af0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
9b00: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
9b10: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
9b20: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
9b30: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
9b40: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
9b50: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
9b60: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
9b70: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
9b80: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
9b90: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
9ba0: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
9bb0: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
9bc0: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
9bd0: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
9be0: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
9bf0: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
9c00: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
9c10: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
9c20: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
9c30: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
9c40: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
9c50: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
9c60: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
9c70: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
9c80: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
9c90: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
9ca0: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
9cb0: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
9cc0: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
9cd0: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
9ce0: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
9cf0: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
9d00: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
9d10: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
9d20: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
9d30: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f  fe enough..*/.vo
9d40: 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  id sqlite3Change
9d50: 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 33 20 2a  Cookie(sqlite3 *
9d60: 64 62 2c 20 56 64 62 65 20 2a 76 2c 20 69 6e 74  db, Vdbe *v, int
9d70: 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33   iDb){.  sqlite3
9d80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9d90: 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62  Integer, db->aDb
9da0: 5b 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f  [iDb].schema_coo
9db0: 6b 69 65 2b 31 2c 20 30 29 3b 0a 20 20 73 71 6c  kie+1, 0);.  sql
9dc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9dd0: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
9de0: 44 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Db, 0);.}../*.**
9df0: 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d   Measure the num
9e00: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
9e10: 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70  s needed to outp
9e20: 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  ut the given.** 
9e30: 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65  identifier.  The
9e40: 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64   number returned
9e50: 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75   includes any qu
9e60: 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74  otes used.** but
9e70: 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64   does not includ
9e80: 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69  e the null termi
9e90: 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nator..**.** The
9ea0: 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e   estimate is con
9eb0: 73 65 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d  servative.  It m
9ec0: 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
9ed0: 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72  hat what is.** r
9ee0: 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f  eally needed..*/
9ef0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e  .static int iden
9f00: 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68  tLength(const ch
9f10: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b  ar *z){.  int n;
9f20: 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20  .  for(n=0; *z; 
9f30: 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69  n++, z++){.    i
9f40: 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b  f( *z=='"' ){ n+
9f50: 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72  +; }.  }.  retur
9f60: 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  n n + 2;.}../*.*
9f70: 2a 20 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74  * Write an ident
9f80: 69 66 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65  ifier onto the e
9f90: 6e 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  nd of the given 
9fa0: 73 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20  string.  Add.** 
9fb0: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73  quote characters
9fc0: 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73   as needed..*/.s
9fd0: 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74  tatic void ident
9fe0: 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74  Put(char *z, int
9ff0: 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53   *pIdx, char *zS
a000: 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75  ignedIdent){.  u
a010: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
a020: 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  dent = (unsigned
a030: 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64   char*)zSignedId
a040: 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ent;.  int i, j,
a050: 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20   needQuote;.  i 
a060: 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a  = *pIdx;.  for(j
a070: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
a080: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73  ++){.    if( !is
a090: 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29  alnum(zIdent[j])
a0a0: 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27   && zIdent[j]!='
a0b0: 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  _' ) break;.  }.
a0c0: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a    needQuote =  z
a0d0: 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69  Ident[j]!=0 || i
a0e0: 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d  sdigit(zIdent[0]
a0f0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
a100: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65      || sqlite3Ke
a110: 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74  ywordCode(zIdent
a120: 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69  , j)!=TK_ID;.  i
a130: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
a140: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66  [i++] = '"';.  f
a150: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
a160: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69  ]; j++){.    z[i
a170: 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b  ++] = zIdent[j];
a180: 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b  .    if( zIdent[
a190: 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d  j]=='"' ) z[i++]
a1a0: 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66   = '"';.  }.  if
a1b0: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
a1c0: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b  i++] = '"';.  z[
a1d0: 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20  i] = 0;.  *pIdx 
a1e0: 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = i;.}../*.** Ge
a1f0: 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20  nerate a CREATE 
a200: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
a210: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
a220: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62  the given.** tab
a230: 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68  le.  Memory to h
a240: 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20  old the text of 
a250: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
a260: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
a270: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
a280: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
a290: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
a2a0: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
a2b0: 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61  tatic char *crea
a2c0: 74 65 54 61 62 6c 65 53 74 6d 74 28 54 61 62 6c  teTableStmt(Tabl
a2d0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  e *p){.  int i, 
a2e0: 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53  k, n;.  char *zS
a2f0: 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65  tmt;.  char *zSe
a300: 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64  p, *zSep2, *zEnd
a310: 2c 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  , *z;.  Column *
a320: 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  pCol;.  n = 0;. 
a330: 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61   for(pCol = p->a
a340: 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e  Col, i=0; i<p->n
a350: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
a360: 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e  ){.    n += iden
a370: 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e  tLength(pCol->zN
a380: 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 70 43  ame);.    z = pC
a390: 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 69  ol->zType;.    i
a3a0: 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 6e 20  f( z ){.      n 
a3b0: 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 29 20 2b 20  += (strlen(z) + 
a3c0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
a3d0: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
a3e0: 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  (p->zName);.  if
a3f0: 28 20 6e 3c 35 30 20 29 7b 0a 20 20 20 20 7a 53  ( n<50 ){.    zS
a400: 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65  ep = "";.    zSe
a410: 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45  p2 = ",";.    zE
a420: 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73  nd = ")";.  }els
a430: 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c  e{.    zSep = "\
a440: 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  n  ";.    zSep2 
a450: 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a  = ",\n  ";.    z
a460: 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d  End = "\n)";.  }
a470: 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70  .  n += 35 + 6*p
a480: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20  ->nCol;.  zStmt 
a490: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
a4a0: 77 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53  w( n );.  if( zS
a4b0: 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tmt==0 ) return 
a4c0: 30 3b 0a 20 20 73 74 72 63 70 79 28 7a 53 74 6d  0;.  strcpy(zStm
a4d0: 74 2c 20 70 2d 3e 69 44 62 3d 3d 31 20 3f 20 22  t, p->iDb==1 ? "
a4e0: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
a4f0: 45 20 22 20 3a 20 22 43 52 45 41 54 45 20 54 41  E " : "CREATE TA
a500: 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74  BLE ");.  k = st
a510: 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69  rlen(zStmt);.  i
a520: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
a530: 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  k, p->zName);.  
a540: 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27  zStmt[k++] = '('
a550: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e  ;.  for(pCol=p->
a560: 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e  aCol, i=0; i<p->
a570: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
a580: 2b 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 26  +){.    strcpy(&
a590: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b  zStmt[k], zSep);
a5a0: 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e  .    k += strlen
a5b0: 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20  (&zStmt[k]);.   
a5c0: 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20   zSep = zSep2;. 
a5d0: 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d     identPut(zStm
a5e0: 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  t, &k, pCol->zNa
a5f0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 20  me);.    if( (z 
a600: 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d  = pCol->zType)!=
a610: 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74  0 ){.      zStmt
a620: 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [k++] = ' ';.   
a630: 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74     strcpy(&zStmt
a640: 5b 6b 5d 2c 20 7a 29 3b 0a 20 20 20 20 20 20 6b  [k], z);.      k
a650: 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20   += strlen(z);. 
a660: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74 72 63 70     }.  }.  strcp
a670: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e  y(&zStmt[k], zEn
a680: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74  d);.  return zSt
a690: 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  mt;.}../*.** Thi
a6a0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
a6b0: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
a6c0: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
a6d0: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
a6e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
a6f0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
a700: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
a710: 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63  re that other ac
a720: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61  tion routines ha
a730: 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67  ve been building
a740: 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
a750: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  the internal has
a760: 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69  h tables, assumi
a770: 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76  ng no errors hav
a780: 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a  e.** occurred..*
a790: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f  *.** An entry fo
a7a0: 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d  r the table is m
a7b0: 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ade in the maste
a7c0: 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c  r table on disk,
a7d0: 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20   unless.** this 
a7e0: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
a7f0: 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74  able or db->init
a800: 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20  .busy==1.  When 
a810: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
a820: 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20  .** it means we 
a830: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
a840: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
a850: 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a  ble because we j
a860: 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  ust.** connected
a870: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
a880: 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
a890: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
a8a0: 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e  ble has.** recen
a8b0: 74 6c 79 20 63 68 61 6e 67 65 73 2c 20 73 6f 20  tly changes, so 
a8c0: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
a8d0: 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  is table already
a8e0: 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68   exists in.** th
a8f0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
a900: 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f  table.  We do no
a910: 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65  t want to create
a920: 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a   it again..**.**
a930: 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20   If the pSelect 
a940: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
a950: 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74  NULL, it means t
a960: 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
a970: 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74  .** was called t
a980: 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65  o create a table
a990: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
a9a0: 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41  a .** "CREATE TA
a9b0: 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  BLE ... AS SELEC
a9c0: 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74  T ..." statement
a9d0: 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  .  The column na
a9e0: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  mes of.** the ne
a9f0: 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74  w table will mat
aa00: 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ch the result se
aa10: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  t of the SELECT.
aa20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
aa30: 45 6e 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a  EndTable(Parse *
aa40: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
aa50: 45 6e 64 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  End, Select *pSe
aa60: 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
aa70: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
aa80: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
aa90: 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26    if( (pEnd==0 &
aaa0: 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c  & pSelect==0) ||
aab0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
aac0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
aad0: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
aae0: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
aaf0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
ab00: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  p==0 ) return;..
ab10: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69    assert( !db->i
ab20: 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65  nit.busy || !pSe
ab30: 6c 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  lect );..  /* If
ab40: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   the db->init.bu
ab50: 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73  sy is 1 it means
ab60: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
ab70: 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a  the SQL off the.
ab80: 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73    ** "sqlite_mas
ab90: 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f  ter" or "sqlite_
aba0: 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62  temp_master" tab
abb0: 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a  le on the disk..
abc0: 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77    ** So do not w
abd0: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
abe0: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
abf0: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
ac00: 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  umber.  ** for t
ac10: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
ac20: 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  e db->init.newTn
ac30: 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20  um field.  (The 
ac40: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
ac50: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
ac60: 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74  n put there by t
ac70: 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20  he sqliteOpenCb 
ac80: 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20  routine.).  */. 
ac90: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
aca0: 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75  sy ){.    p->tnu
acb0: 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
acc0: 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Tnum;.  }..  /* 
acd0: 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  If not initializ
ace0: 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ing, then create
acf0: 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68   a record for th
ad00: 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a  e new table.  **
ad10: 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
ad20: 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74  ASTER table of t
ad30: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
ad40: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a  e record number.
ad50: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77    ** for the new
ad60: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 73 68 6f   table entry sho
ad70: 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 6f  uld already be o
ad80: 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a  n the stack..  *
ad90: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69  *.  ** If this i
ada0: 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61  s a TEMPORARY ta
adb0: 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65  ble, write the e
adc0: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75  ntry into the au
add0: 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c  xiliary.  ** fil
ade0: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74  e instead of int
adf0: 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
ae00: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
ae10: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
ae20: 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  usy ){.    int n
ae30: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  ;.    Vdbe *v;. 
ae40: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20     char *zType; 
ae50: 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20     /* "view" or 
ae60: 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63  "table" */.    c
ae70: 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f  har *zType2;   /
ae80: 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 42  * "VIEW" or "TAB
ae90: 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  LE" */.    char 
aea0: 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65  *zStmt;    /* Te
aeb0: 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
aec0: 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45   TABLE or CREATE
aed0: 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20   VIEW statement 
aee0: 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  */..    v = sqli
aef0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
af00: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
af10: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20   ) return;..    
af20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
af30: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
af40: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65   0);..    /* Cre
af50: 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65  ate the rootpage
af60: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
af70: 6c 65 20 61 6e 64 20 70 75 73 68 20 69 74 20 6f  le and push it o
af80: 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 20  nto the stack.. 
af90: 20 20 20 2a 2a 20 41 20 76 69 65 77 20 68 61 73     ** A view has
afa0: 20 6e 6f 20 72 6f 6f 74 70 61 67 65 2c 20 73 6f   no rootpage, so
afb0: 20 6a 75 73 74 20 70 75 73 68 20 61 20 7a 65 72   just push a zer
afc0: 6f 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  o onto the stack
afd0: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 76 69 65 77   for.    ** view
afe0: 73 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a  s.  Initialize z
aff0: 54 79 70 65 20 61 74 20 74 68 65 20 73 61 6d 65  Type at the same
b000: 20 74 69 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   time..    */.  
b010: 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74    if( p->pSelect
b020: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
b030: 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20  A regular table 
b040: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
b050: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b060: 43 72 65 61 74 65 54 61 62 6c 65 2c 20 70 2d 3e  CreateTable, p->
b070: 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7a  iDb, 0);.      z
b080: 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a  Type = "table";.
b090: 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
b0a0: 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20  TABLE";.#ifndef 
b0b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
b0c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b0d0: 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20    /* A view */. 
b0e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b0f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
b100: 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
b110: 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22    zType = "view"
b120: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d  ;.      zType2 =
b130: 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a   "VIEW";.#endif.
b140: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
b150: 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41 54   this is a CREAT
b160: 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53 45  E TABLE xx AS SE
b170: 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74  LECT ..., execut
b180: 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20  e the SELECT.   
b190: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f   ** statement to
b1a0: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65   populate the ne
b1b0: 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f  w table. The roo
b1c0: 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  t-page number fo
b1d0: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77  r the.    ** new
b1e0: 20 74 61 62 6c 65 20 69 73 20 6f 6e 20 74 68 65   table is on the
b1f0: 20 74 6f 70 20 6f 66 20 74 68 65 20 76 64 62 65   top of the vdbe
b200: 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20   stack..    **. 
b210: 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53     ** Once the S
b220: 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20 63  ELECT has been c
b230: 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33 53  oded by sqlite3S
b240: 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20 69  elect(), it is i
b250: 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61  n a.    ** suita
b260: 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75 65  ble state to que
b270: 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
b280: 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65  n names and type
b290: 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20  s to be used.   
b2a0: 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74   ** by the new t
b2b0: 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
b2c0: 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
b2d0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65        Table *pSe
b2e0: 6c 54 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69  lTab;.      sqli
b2f0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b300: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
b310: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b320: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
b330: 67 65 72 2c 20 70 2d 3e 69 44 62 2c 20 30 29 3b  ger, p->iDb, 0);
b340: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b350: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
b360: 65 6e 57 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a  enWrite, 1, 0);.
b370: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54        pParse->nT
b380: 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71  ab = 2;.      sq
b390: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
b3a0: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 53 52 54  se, pSelect, SRT
b3b0: 5f 54 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c  _Table, 1, 0, 0,
b3c0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
b3d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b3e0: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31  p(v, OP_Close, 1
b3f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
b400: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
b410: 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  ){.        pSelT
b420: 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
b430: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
b440: 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 65 63 74  arse, 0, pSelect
b450: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
b460: 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75  SelTab==0 ) retu
b470: 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rn;.        asse
b480: 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29  rt( p->aCol==0 )
b490: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f  ;.        p->nCo
b4a0: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
b4b0: 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 43  l;.        p->aC
b4c0: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
b4d0: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c  ol;.        pSel
b4e0: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
b4f0: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e         pSelTab->
b500: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
b510: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
b520: 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29  able(0, pSelTab)
b530: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b540: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
b550: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
b560: 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
b570: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
b580: 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
b590: 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72        zStmt = cr
b5a0: 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 70 29  eateTableStmt(p)
b5b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
b5c0: 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64     n = Addr(pEnd
b5d0: 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 50 61 72  ->z) - Addr(pPar
b5e0: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
b5f0: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 7a 53 74  ) + 1;.      zSt
b600: 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
b610: 6e 74 66 28 22 43 52 45 41 54 45 20 25 73 20 25  ntf("CREATE %s %
b620: 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c  .*s", zType2, n,
b630: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
b640: 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 7d 0a 0a 20  ken.z);.    }.. 
b650: 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72     /* A slot for
b660: 20 74 68 65 20 72 65 63 6f 72 64 20 68 61 73 20   the record has 
b670: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
b680: 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20  ocated in the . 
b690: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53     ** SQLITE_MAS
b6a0: 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a  TER table.  We j
b6b0: 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61  ust need to upda
b6c0: 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74  te that slot wit
b6d0: 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65  h all.    ** the
b6e0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27   information we'
b6f0: 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 20 20 54  ve collected.  T
b700: 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  he rowid for the
b710: 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 0a 20 20   preallocated.  
b720: 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 74 68 65    ** slot is the
b730: 20 32 6e 64 20 69 74 65 6d 20 6f 6e 20 74 68 65   2nd item on the
b740: 20 73 74 61 63 6b 2e 20 20 54 68 65 20 74 6f 70   stack.  The top
b750: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69 73   of the stack is
b760: 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74   the.    ** root
b770: 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e 65   page for the ne
b780: 77 20 74 61 62 6c 65 20 28 6f 72 20 61 20 30 20  w table (or a 0 
b790: 69 66 20 74 68 69 73 20 69 73 20 61 20 76 69 65  if this is a vie
b7a0: 77 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  w)..    */.    s
b7b0: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
b7c0: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
b7d0: 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a  "UPDATE %Q.%s ".
b7e0: 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74 79           "SET ty
b7f0: 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51  pe='%s', name=%Q
b800: 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72  , tbl_name=%Q, r
b810: 6f 6f 74 70 61 67 65 3d 23 30 2c 20 73 71 6c 3d  ootpage=#0, sql=
b820: 25 51 20 22 0a 20 20 20 20 20 20 20 22 57 48 45  %Q ".       "WHE
b830: 52 45 20 72 6f 77 69 64 3d 23 31 22 2c 0a 20 20  RE rowid=#1",.  
b840: 20 20 20 20 64 62 2d 3e 61 44 62 5b 70 2d 3e 69      db->aDb[p->i
b850: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
b860: 41 5f 54 41 42 4c 45 28 70 2d 3e 69 44 62 29 2c  A_TABLE(p->iDb),
b870: 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20  .      zType,.  
b880: 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20      p->zName,.  
b890: 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20      p->zName,.  
b8a0: 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b      zStmt.    );
b8b0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
b8c0: 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69  zStmt);.    sqli
b8d0: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
b8e0: 64 62 2c 20 76 2c 20 70 2d 3e 69 44 62 29 3b 0a  db, v, p->iDb);.
b8f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b900: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
b910: 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  NT.    /* Check 
b920: 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65 65  to see if we nee
b930: 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73  d to create an s
b940: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
b950: 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20  able for.    ** 
b960: 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66  keeping track of
b970: 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b   autoincrement k
b980: 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eys..    */.    
b990: 69 66 28 20 70 2d 3e 61 75 74 6f 49 6e 63 20 29  if( p->autoInc )
b9a0: 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62 20  {.      Db *pDb 
b9b0: 3d 20 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44  = &db->aDb[p->iD
b9c0: 62 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  b];.      if( pD
b9d0: 62 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b  b->pSeqTab==0 ){
b9e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b9f0: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
ba00: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43  se,.          "C
ba10: 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73  REATE TABLE %Q.s
ba20: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e  qlite_sequence(n
ba30: 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20  ame,seq)",.     
ba40: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a       pDb->zName.
ba50: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
ba60: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
ba70: 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20  .    /* Reparse 
ba80: 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70  everything to up
ba90: 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
baa0: 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  l data structure
bab0: 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
bac0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61  VdbeOp3(v, OP_Pa
bad0: 72 73 65 53 63 68 65 6d 61 2c 20 70 2d 3e 69 44  rseSchema, p->iD
bae0: 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 73 71  b, 0,.        sq
baf0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 74 62  lite3MPrintf("tb
bb00: 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70 2d 3e  l_name='%q'",p->
bb10: 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d  zName), P3_DYNAM
bb20: 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  IC);.  }...  /* 
bb30: 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f  Add the table to
bb40: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
bb50: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
bb60: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
bb70: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
bb80: 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73  it.busy && pPars
bb90: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
bba0: 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20    Table *pOld;. 
bbb0: 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 20     FKey *pFKey; 
bbc0: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
bbd0: 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 3b  db->aDb[p->iDb];
bbe0: 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  .    pOld = sqli
bbf0: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
bc00: 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e  Db->tblHash, p->
bc10: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d  zName, strlen(p-
bc20: 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20  >zName)+1, p);. 
bc30: 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20     if( pOld ){. 
bc40: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
bc50: 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  pOld );  /* Mall
bc60: 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
bc70: 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49  led inside HashI
bc80: 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20  nsert() */.     
bc90: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 23   return;.    }.#
bca0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
bcb0: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
bcc0: 20 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e     for(pFKey=p->
bcd0: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46  pFKey; pFKey; pF
bce0: 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74  Key=pFKey->pNext
bcf0: 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74  From){.      int
bd00: 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46   nTo = strlen(pF
bd10: 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20  Key->zTo) + 1;. 
bd20: 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78       pFKey->pNex
bd30: 74 54 6f 20 3d 20 73 71 6c 69 74 65 33 48 61 73  tTo = sqlite3Has
bd40: 68 46 69 6e 64 28 26 70 44 62 2d 3e 61 46 4b 65  hFind(&pDb->aFKe
bd50: 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e  y, pFKey->zTo, n
bd60: 54 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  To);.      sqlit
bd70: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44  e3HashInsert(&pD
bd80: 62 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d  b->aFKey, pFKey-
bd90: 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79  >zTo, nTo, pFKey
bda0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
bdb0: 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77      pParse->pNew
bdc0: 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64  Table = 0;.    d
bdd0: 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20  b->nTable++;.   
bde0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
bdf0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
be00: 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  es;.  }.}..#ifnd
be10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
be20: 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  IEW./*.** The pa
be30: 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
be40: 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72  routine in order
be50: 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
be60: 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71   VIEW.*/.void sq
be70: 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28  lite3CreateView(
be80: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
be90: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  ,     /* The par
bea0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
beb0: 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c    Token *pBegin,
bec0: 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41       /* The CREA
bed0: 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
bee0: 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65  gins the stateme
bef0: 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nt */.  Token *p
bf00: 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68  Name1,     /* Th
bf10: 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c  e token that hol
bf20: 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ds the name of t
bf30: 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  he view */.  Tok
bf40: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
bf50: 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
bf60: 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
bf70: 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
bf80: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
bf90: 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54  t,   /* A SELECT
bfa0: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
bfb0: 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
bfc0: 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  new view */.  in
bfd0: 74 20 69 73 54 65 6d 70 20 20 20 20 20 20 20 20  t isTemp        
bfe0: 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54   /* TRUE for a T
bff0: 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f  EMPORARY view */
c000: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
c010: 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74    int n;.  const
c020: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c030: 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b  z;.  Token sEnd;
c040: 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b  .  DbFixer sFix;
c050: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b  .  Token *pName;
c060: 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  ..  sqlite3Start
c070: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 42  Table(pParse, pB
c080: 65 67 69 6e 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  egin, pName1, pN
c090: 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 29  ame2, isTemp, 1)
c0a0: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
c0b0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
c0c0: 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
c0d0: 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c  >nErr ){.    sql
c0e0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
c0f0: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72  (pSelect);.    r
c100: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
c110: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
c120: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
c130: 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
c140: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
c150: 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
c160: 72 73 65 2c 20 70 2d 3e 69 44 62 2c 20 22 76 69  rse, p->iDb, "vi
c170: 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20  ew", pName).    
c180: 26 26 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c  && sqlite3FixSel
c190: 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65  ect(&sFix, pSele
c1a0: 63 74 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  ct).  ){.    sql
c1b0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
c1c0: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72  (pSelect);.    r
c1d0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
c1e0: 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   Make a copy of 
c1f0: 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43  the entire SELEC
c200: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
c210: 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
c220: 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c  w..  ** This wil
c230: 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20  l force all the 
c240: 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c  Expr.token.z val
c250: 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ues to be dynami
c260: 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  cally.  ** alloc
c270: 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e  ated rather than
c280: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e   point to the in
c290: 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69  put string - whi
c2a0: 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  ch means that.  
c2b0: 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72  ** they will per
c2c0: 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63  sist after the c
c2d0: 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65  urrent sqlite3_e
c2e0: 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72  xec() call retur
c2f0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53  ns..  */.  p->pS
c300: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
c310: 65 6c 65 63 74 44 75 70 28 70 53 65 6c 65 63 74  electDup(pSelect
c320: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
c330: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
c340: 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  );.  if( !pParse
c350: 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ->db->init.busy 
c360: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 69  ){.    sqlite3Vi
c370: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
c380: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d  (pParse, p);.  }
c390: 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
c3a0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
c3b0: 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
c3c0: 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70  nt.  Make sEnd p
c3d0: 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65  oint to.  ** the
c3e0: 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e   end..  */.  sEn
c3f0: 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73  d = pParse->sLas
c400: 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45  tToken;.  if( sE
c410: 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45  nd.z[0]!=0 && sE
c420: 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a  nd.z[0]!=';' ){.
c430: 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45      sEnd.z += sE
c440: 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64  nd.n;.  }.  sEnd
c450: 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 73 45  .n = 0;.  n = sE
c460: 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a  nd.z - pBegin->z
c470: 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75  ;.  z = (const u
c480: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
c490: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65  egin->z;.  while
c4a0: 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d  ( n>0 && (z[n-1]
c4b0: 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65  ==';' || isspace
c4c0: 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d  (z[n-1])) ){ n--
c4d0: 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26  ; }.  sEnd.z = &
c4e0: 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e  z[n-1];.  sEnd.n
c4f0: 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20   = 1;..  /* Use 
c500: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
c510: 29 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65  ) to add the vie
c520: 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f  w to the SQLITE_
c530: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a  MASTER table */.
c540: 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c    sqlite3EndTabl
c550: 65 28 70 50 61 72 73 65 2c 20 26 73 45 6e 64 2c  e(pParse, &sEnd,
c560: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d   0);.  return;.}
c570: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
c580: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
c590: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c5a0: 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54  MIT_VIEW./*.** T
c5b0: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
c5c0: 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61  re pTable is rea
c5d0: 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c  lly a VIEW.  Fil
c5e0: 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  l in the names o
c5f0: 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73  f.** the columns
c600: 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20   of the view in 
c610: 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63  the pTable struc
c620: 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68  ture.  Return th
c630: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65  e number.** of e
c640: 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72  rrors.  If an er
c650: 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76  ror is seen leav
c660: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
c670: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
c680: 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
c690: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
c6a0: 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70  mnNames(Parse *p
c6b0: 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
c6c0: 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  able){.  Table *
c6d0: 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20  pSelTab;   /* A 
c6e0: 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20  fake table from 
c6f0: 77 68 69 63 68 20 77 65 20 67 65 74 20 74 68 65  which we get the
c700: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
c710: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20   Select *pSel;  
c720: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68     /* Copy of th
c730: 65 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d  e SELECT that im
c740: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65  plements the vie
c750: 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20  w */.  int nErr 
c760: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  = 0;     /* Numb
c770: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63  er of errors enc
c780: 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e  ountered */.  in
c790: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
c7a0: 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68  /* Temporarily h
c7b0: 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20  olds the number 
c7c0: 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73 69 67  of cursors assig
c7d0: 6e 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ned */..  assert
c7e0: 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 20 20 2f  ( pTable );..  /
c7f0: 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f  * A positive nCo
c800: 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75  l means the colu
c810: 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68  mns names for th
c820: 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a  is view are.  **
c830: 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a   already known..
c840: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
c850: 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75  e->nCol>0 ) retu
c860: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65  rn 0;..  /* A ne
c870: 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61  gative nCol is a
c880: 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20   special marker 
c890: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20  meaning that we 
c8a0: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  are currently.  
c8b0: 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d  ** trying to com
c8c0: 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pute the column 
c8d0: 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e  names.  If we en
c8e0: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
c8f0: 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67   with.  ** a neg
c900: 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d  ative nCol, it m
c910: 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65  eans two or more
c920: 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f   views form a lo
c930: 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  op, like this:. 
c940: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45   **.  **     CRE
c950: 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20  ATE VIEW one AS 
c960: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77  SELECT * FROM tw
c970: 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  o;.  **     CREA
c980: 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53  TE VIEW two AS S
c990: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65  ELECT * FROM one
c9a0: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75  ;.  **.  ** Actu
c9b0: 61 6c 6c 79 2c 20 74 68 69 73 20 65 72 72 6f 72  ally, this error
c9c0: 20 69 73 20 63 61 75 67 68 74 20 70 72 65 76 69   is caught previ
c9d0: 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20 74 68 65  ously and so the
c9e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a   following test.
c9f0: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61    ** should alwa
ca00: 79 73 20 66 61 69 6c 2e 20 20 42 75 74 20 77 65  ys fail.  But we
ca10: 20 77 69 6c 6c 20 6c 65 61 76 65 20 69 74 20 69   will leave it i
ca20: 6e 20 70 6c 61 63 65 20 6a 75 73 74 20 74 6f 20  n place just to 
ca30: 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20  be safe..  */.  
ca40: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
ca50: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
ca60: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
ca70: 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69  , "view %s is ci
ca80: 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64  rcularly defined
ca90: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
caa0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
cab0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
cac0: 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
cad0: 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20  t means we need 
cae0: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74  to compute the t
caf0: 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a  able names..  **
cb00: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63   Note that the c
cb10: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65  all to sqlite3Re
cb20: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
cb30: 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e  ) will expand an
cb40: 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65  y.  ** "*" eleme
cb50: 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  nts in the resul
cb60: 74 73 20 73 65 74 20 6f 66 20 74 68 65 20 76 69  ts set of the vi
cb70: 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69  ew and will assi
cb80: 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20  gn cursors.  ** 
cb90: 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20  to the elements 
cba0: 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
cbb0: 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e  se.  But we do n
cbc0: 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20 63 68  ot want these ch
cbd0: 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65  anges.  ** to be
cbe0: 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20   permanent.  So 
cbf0: 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  the computation 
cc00: 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70  is done on a cop
cc10: 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  y of the SELECT.
cc20: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
cc30: 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
cc40: 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  view..  */.  ass
cc50: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65  ert( pTable->pSe
cc60: 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d  lect );.  pSel =
cc70: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
cc80: 70 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  p(pTable->pSelec
cc90: 74 29 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65  t);.  n = pParse
cca0: 2d 3e 6e 54 61 62 3b 0a 20 20 73 71 6c 69 74 65  ->nTab;.  sqlite
ccb0: 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
ccc0: 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53  rsors(pParse, pS
ccd0: 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 70 54 61  el->pSrc);.  pTa
cce0: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a  ble->nCol = -1;.
ccf0: 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
cd00: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
cd10: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20  lect(pParse, 0, 
cd20: 70 53 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d  pSel);.  pParse-
cd30: 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 69 66 28  >nTab = n;.  if(
cd40: 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20   pSelTab ){.    
cd50: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
cd60: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70  aCol==0 );.    p
cd70: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53  Table->nCol = pS
cd80: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
cd90: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
cda0: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
cdb0: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
cdc0: 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61   = 0;.    pSelTa
cdd0: 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
cde0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
cdf0: 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b  ble(0, pSelTab);
ce00: 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72  .    DbSetProper
ce10: 74 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ty(pParse->db, p
ce20: 54 61 62 6c 65 2d 3e 69 44 62 2c 20 44 42 5f 55  Table->iDb, DB_U
ce30: 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 20 20  nresetViews);.  
ce40: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 6c  }else{.    pTabl
ce50: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  e->nCol = 0;.   
ce60: 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73   nErr++;.  }.  s
ce70: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
ce80: 74 65 28 70 53 65 6c 29 3b 0a 20 20 72 65 74 75  te(pSel);.  retu
ce90: 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e  rn nErr;  .}.#en
cea0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
ceb0: 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 6e  IT_VIEW */..#ifn
cec0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ced0: 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  VIEW./*.** Clear
cee0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
cef0: 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45  s from every VIE
cf00: 57 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64  W in database id
cf10: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
cf20: 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
cf30: 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  tAll(sqlite3 *db
cf40: 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61  , int idx){.  Ha
cf50: 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28  shElem *i;.  if(
cf60: 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28   !DbHasProperty(
cf70: 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
cf80: 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74 75  setViews) ) retu
cf90: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  rn;.  for(i=sqli
cfa0: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
cfb0: 3e 61 44 62 5b 69 64 78 5d 2e 74 62 6c 48 61 73  >aDb[idx].tblHas
cfc0: 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48  h); i; i=sqliteH
cfd0: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
cfe0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
cff0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
d000: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
d010: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
d020: 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75   sqliteResetColu
d030: 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20  mnNames(pTab);. 
d040: 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65     }.  }.  DbCle
d050: 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  arProperty(db, i
d060: 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
d070: 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  ews);.}.#else.# 
d080: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65  define sqliteVie
d090: 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23  wResetAll(A,B).#
d0a0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
d0b0: 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a  OMIT_VIEW */../*
d0c0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
d0d0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
d0e0: 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73  he VDBE to adjus
d0f0: 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  t the internal s
d100: 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79  chema.** used by
d110: 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65   SQLite when the
d120: 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76   btree layer mov
d130: 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20  es a table root 
d140: 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f  page. The.** roo
d150: 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c  t-page of a tabl
d160: 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61  e or index in da
d170: 74 61 62 61 73 65 20 69 44 62 20 68 61 73 20 63  tabase iDb has c
d180: 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f  hanged from iFro
d190: 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2f 0a  m.** to iTo..*/.
d1a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d1b0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76  MIT_AUTOVACUUM.v
d1c0: 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50  oid sqlite3RootP
d1d0: 61 67 65 4d 6f 76 65 64 28 44 62 20 2a 70 44 62  ageMoved(Db *pDb
d1e0: 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
d1f0: 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65   iTo){.  HashEle
d200: 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 0a 20 20 66  m *pElem;.  .  f
d210: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
d220: 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 74  ashFirst(&pDb->t
d230: 62 6c 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20  blHash); pElem; 
d240: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
d250: 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
d260: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
d270: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
d280: 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Elem);.    if( p
d290: 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d  Tab->tnum==iFrom
d2a0: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
d2b0: 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20  tnum = iTo;.    
d2c0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
d2d0: 20 20 7d 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d    }.  for(pElem=
d2e0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
d2f0: 26 70 44 62 2d 3e 69 64 78 48 61 73 68 29 3b 20  &pDb->idxHash); 
d300: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
d310: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
d320: 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  m)){.    Index *
d330: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73  pIdx = sqliteHas
d340: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
d350: 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d    if( pIdx->tnum
d360: 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
d370: 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54   pIdx->tnum = iT
d380: 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  o;.      return;
d390: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
d3a0: 65 72 74 28 30 29 3b 0a 7d 0a 23 65 6e 64 69 66  ert(0);.}.#endif
d3b0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f  ../*.** Write co
d3c0: 64 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20  de to erase the 
d3d0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
d3e0: 70 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d  page iTable from
d3f0: 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a   database iDb..*
d400: 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64  * Also write cod
d410: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
d420: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
d430: 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  ble and internal
d440: 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20   schema.** if a 
d450: 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f  root-page of ano
d460: 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f  ther table is mo
d470: 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  ved by the btree
d480: 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a  -layer whilst.**
d490: 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20   erasing iTable 
d4a0: 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e  (this can happen
d4b0: 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61   with an auto-va
d4c0: 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a  cuum database)..
d4d0: 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
d4e0: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
d4f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
d500: 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69  nt iTable, int i
d510: 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
d520: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
d530: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
d540: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d550: 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c  P_Destroy, iTabl
d560: 65 2c 20 69 44 62 29 3b 0a 23 69 66 6e 64 65 66  e, iDb);.#ifndef
d570: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
d580: 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f  OVACUUM.  /* OP_
d590: 44 65 73 74 72 6f 79 20 70 75 73 68 65 73 20 61  Destroy pushes a
d5a0: 6e 20 69 6e 74 65 67 65 72 20 6f 6e 74 6f 20 74  n integer onto t
d5b0: 68 65 20 73 74 61 63 6b 2e 20 49 66 20 74 68 69  he stack. If thi
d5c0: 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69  s integer.  ** i
d5d0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
d5e0: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
d5f0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
d600: 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a   table moved to.
d610: 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54    ** location iT
d620: 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  able. The follow
d630: 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65  ing code modifie
d640: 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  s the sqlite_mas
d650: 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a  ter table to.  *
d660: 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a  * reflect this..
d670: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23    **.  ** The "#
d680: 30 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73  0" in the SQL is
d690: 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74   a special const
d6a0: 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77  ant that means w
d6b0: 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20  hatever value.  
d6c0: 2a 2a 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70  ** is on the top
d6d0: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 20   of the stack.  
d6e0: 53 65 65 20 73 71 6c 69 74 65 33 52 65 67 69 73  See sqlite3Regis
d6f0: 74 65 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f 0a  terExpr()..  */.
d700: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
d710: 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
d720: 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
d730: 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64   SET rootpage=%d
d740: 20 57 48 45 52 45 20 23 30 20 41 4e 44 20 72 6f   WHERE #0 AND ro
d750: 6f 74 70 61 67 65 3d 23 30 22 2c 0a 20 20 20 20  otpage=#0",.    
d760: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
d770: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
d780: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
d790: 69 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  iTable);.#endif.
d7a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56  }../*.** Write V
d7b0: 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73  DBE code to eras
d7c0: 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  e table pTab and
d7d0: 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20   all associated 
d7e0: 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e  indices on disk.
d7f0: 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61  .** Code to upda
d800: 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  te the sqlite_ma
d810: 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20  ster tables and 
d820: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
d830: 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69  definitions.** i
d840: 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61  n case a root-pa
d850: 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
d860: 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
d870: 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
d880: 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20  ree layer.** is 
d890: 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73  also added (this
d8a0: 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
d8b0: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
d8c0: 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74  database)..*/.st
d8d0: 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
d8e0: 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  yTable(Parse *pP
d8f0: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
d900: 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
d910: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
d920: 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  M.  Index *pIdx;
d930: 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61  .  destroyRootPa
d940: 67 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  ge(pParse, pTab-
d950: 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 69 44 62  >tnum, pTab->iDb
d960: 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54  );.  for(pIdx=pT
d970: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
d980: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
d990: 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79  xt){.    destroy
d9a0: 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
d9b0: 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 49 64   pIdx->tnum, pId
d9c0: 78 2d 3e 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c  x->iDb);.  }.#el
d9d0: 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  se.  /* If the d
d9e0: 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 61  atabase may be a
d9f0: 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62  uto-vacuum capab
da00: 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d  le (if SQLITE_OM
da10: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
da20: 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  ** is not define
da30: 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69  d), then it is i
da40: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c  mportant to call
da50: 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74   OP_Destroy on t
da60: 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e  he.  ** table an
da70: 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67  d index root-pag
da80: 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61  es in order, sta
da90: 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e  rting with the n
daa0: 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a  umerically .  **
dab0: 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
dac0: 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20  ge number. This 
dad0: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
dae0: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74  none of the root
daf0: 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  -pages.  ** to b
db00: 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 72  e destroyed is r
db10: 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65  elocated by an e
db20: 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f  arlier OP_Destro
db30: 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20  y. i.e. if the. 
db40: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65   ** following we
db50: 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20  re coded:.  **. 
db60: 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34   ** OP_Destroy 4
db70: 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a   0.  ** ....  **
db80: 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a   OP_Destroy 5 0.
db90: 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f    **.  ** and ro
dba0: 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65 6e  ot page 5 happen
dbb0: 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72  ed to be the lar
dbc0: 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
dbd0: 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a  umber in the.  *
dbe0: 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  * database, then
dbf0: 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75   root page 5 wou
dc00: 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70  ld be moved to p
dc10: 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20 20  age 4 by the .  
dc20: 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34  ** "OP_Destroy 4
dc30: 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20   0" opcode. The 
dc40: 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44  subsequent "OP_D
dc50: 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c  estroy 5 0" woul
dc60: 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65  d hit.  ** a fre
dc70: 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a  e-list page..  *
dc80: 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
dc90: 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74  Tab->tnum;.  int
dca0: 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b   iDestroyed = 0;
dcb0: 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
dcc0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
dcd0: 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73  .    int iLarges
dce0: 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
dcf0: 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c  iDestroyed==0 ||
dd00: 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64   iTab<iDestroyed
dd10: 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65   ){.      iLarge
dd20: 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d  st = iTab;.    }
dd30: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
dd40: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
dd50: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
dd60: 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  xt){.      int i
dd70: 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d  Idx = pIdx->tnum
dd80: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
dd90: 70 49 64 78 2d 3e 69 44 62 3d 3d 70 54 61 62 2d  pIdx->iDb==pTab-
dda0: 3e 69 44 62 20 29 3b 0a 20 20 20 20 20 20 69 66  >iDb );.      if
ddb0: 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30  ( (iDestroyed==0
ddc0: 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72   || (iIdx<iDestr
ddd0: 6f 79 65 64 29 29 20 26 26 20 69 49 64 78 3e 69  oyed)) && iIdx>i
dde0: 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20  Largest ){.     
ddf0: 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49     iLargest = iI
de00: 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dx;.      }.    
de10: 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67 65  }.    if( iLarge
de20: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
de30: 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
de40: 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72  age(pParse, iLar
de50: 67 65 73 74 2c 20 70 54 61 62 2d 3e 69 44 62 29  gest, pTab->iDb)
de60: 3b 0a 20 20 20 20 69 44 65 73 74 72 6f 79 65 64  ;.    iDestroyed
de70: 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 7d   = iLargest;.  }
de80: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
de90: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
dea0: 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68   called to do th
deb0: 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50  e work of a DROP
dec0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
ded0: 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68  ..** pName is th
dee0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
def0: 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65  ble to be droppe
df00: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
df10: 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  e3DropTable(Pars
df20: 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
df30: 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
df40: 73 56 69 65 77 29 7b 0a 20 20 54 61 62 6c 65 20  sView){.  Table 
df50: 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76  *pTab;.  Vdbe *v
df60: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
df70: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
df80: 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20  int iDb;..  if( 
df90: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
dfa0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
dfb0: 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69  ailed ) goto exi
dfc0: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
dfd0: 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e  assert( pName->n
dfe0: 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62  Src==1 );.  pTab
dff0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
e000: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e  Table(pParse, pN
e010: 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
e020: 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
e030: 74 61 62 61 73 65 29 3b 0a 0a 20 20 69 66 28 20  tabase);..  if( 
e040: 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65  pTab==0 ) goto e
e050: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
e060: 20 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44    iDb = pTab->iD
e070: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  b;.  assert( iDb
e080: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
e090: 44 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Db );.#ifndef SQ
e0a0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
e0b0: 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
e0c0: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f  int code;.    co
e0d0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
e0e0: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 54   SCHEMA_TABLE(pT
e0f0: 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 63 6f  ab->iDb);.    co
e100: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
e110: 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44  db->aDb[pTab->iD
e120: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b].zName;.    if
e130: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
e140: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
e150: 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20  E_DELETE, zTab, 
e160: 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20  0, zDb)){.      
e170: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
e180: 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
e190: 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20  if( isView ){.  
e1a0: 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29      if( iDb==1 )
e1b0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
e1c0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
e1d0: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65  P_VIEW;.      }e
e1e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
e1f0: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
e200: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20  VIEW;.      }.  
e210: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
e220: 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  f( iDb==1 ){.   
e230: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
e240: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42  TE_DROP_TEMP_TAB
e250: 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LE;.      }else{
e260: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
e270: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c  SQLITE_DROP_TABL
e280: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
e290: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
e2a0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
e2b0: 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e  , code, pTab->zN
e2c0: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
e2d0: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
e2e0: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
e2f0: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
e300: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
e310: 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
e320: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
e330: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
e340: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
e350: 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  able;.    }.  }.
e360: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 54 61  #endif.  if( pTa
e370: 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 70  b->readOnly || p
e380: 54 61 62 3d 3d 64 62 2d 3e 61 44 62 5b 69 44 62  Tab==db->aDb[iDb
e390: 5d 2e 70 53 65 71 54 61 62 20 29 7b 0a 20 20 20  ].pSeqTab ){.   
e3a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
e3b0: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
e3c0: 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72  %s may not be dr
e3d0: 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  opped", pTab->zN
e3e0: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
e3f0: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
e400: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
e410: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
e420: 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54  /* Ensure DROP T
e430: 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64  ABLE is not used
e440: 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20   on a view, and 
e450: 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74  DROP VIEW is not
e460: 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20   used.  ** on a 
e470: 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
e480: 28 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62  ( isView && pTab
e490: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
e4a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
e4b0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65  Msg(pParse, "use
e4c0: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64   DROP TABLE to d
e4d0: 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c  elete table %s",
e4e0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
e4f0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
e500: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  p_table;.  }.  i
e510: 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54  f( !isView && pT
e520: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
e530: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
e540: 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
e550: 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c  DROP VIEW to del
e560: 65 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54  ete view %s", pT
e570: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
e580: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
e590: 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  able;.  }.#endif
e5a0: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
e5b0: 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
e5c0: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
e5d0: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20  e master table. 
e5e0: 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a   ** on disk..  *
e5f0: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
e600: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
e610: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 54    if( v ){.    T
e620: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
e630: 3b 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20  ;.    int iDb = 
e640: 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20 44  pTab->iDb;.    D
e650: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
e660: 62 5b 69 44 62 5d 3b 0a 20 20 20 20 73 71 6c 69  b[iDb];.    sqli
e670: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
e680: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
e690: 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20  , iDb);..    /* 
e6a0: 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72  Drop all trigger
e6b0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
e6c0: 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  h the table bein
e6d0: 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a  g dropped. Code.
e6e0: 20 20 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61      ** is genera
e6f0: 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e  ted to remove en
e700: 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74  tries from sqlit
e710: 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a  e_master and/or.
e720: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65      ** sqlite_te
e730: 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71  mp_master if req
e740: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
e750: 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 61    pTrigger = pTa
e760: 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20  b->pTrigger;.   
e770: 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72   while( pTrigger
e780: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
e790: 28 20 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d  ( pTrigger->iDb=
e7a0: 3d 69 44 62 20 7c 7c 20 70 54 72 69 67 67 65 72  =iDb || pTrigger
e7b0: 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20  ->iDb==1 );.    
e7c0: 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69    sqlite3DropTri
e7d0: 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20  ggerPtr(pParse, 
e7e0: 70 54 72 69 67 67 65 72 2c 20 31 29 3b 0a 20 20  pTrigger, 1);.  
e7f0: 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
e800: 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a  Trigger->pNext;.
e810: 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
e820: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
e830: 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20  NCREMENT.    /* 
e840: 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69  Remove any entri
e850: 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  es of the sqlite
e860: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
e870: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
e880: 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65      ** the table
e890: 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20   being dropped. 
e8a0: 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66  This is done bef
e8b0: 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20 69 73  ore the table is
e8c0: 20 64 72 6f 70 70 65 64 0a 20 20 20 20 2a 2a 20   dropped.    ** 
e8d0: 61 74 20 74 68 65 20 62 74 72 65 65 20 6c 65 76  at the btree lev
e8e0: 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  el, in case the 
e8f0: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
e900: 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20  table needs to. 
e910: 20 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20     ** move as a 
e920: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72  result of the dr
e930: 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69  op (can happen i
e940: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
e950: 64 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  de)..    */.    
e960: 69 66 28 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e  if( pTab->autoIn
e970: 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  c ){.      sqlit
e980: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
e990: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44  arse,.        "D
e9a0: 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e 73 71  ELETE FROM %s.sq
e9b0: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48  lite_sequence WH
e9c0: 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20  ERE name=%Q",.  
e9d0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
e9e0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20  , pTab->zName.  
e9f0: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e      );.    }.#en
ea00: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70  dif..    /* Drop
ea10: 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54   all SQLITE_MAST
ea20: 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64  ER table and ind
ea30: 65 78 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ex entries that 
ea40: 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20 20  refer to the.   
ea50: 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70   ** table. The p
ea60: 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70  rogram name loop
ea70: 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61  s through the ma
ea80: 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64  ster table and d
ea90: 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20 65 76  eletes.    ** ev
eaa0: 65 72 79 20 72 6f 77 20 74 68 61 74 20 72 65 66  ery row that ref
eab0: 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f  ers to a table o
eac0: 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  f the same name 
ead0: 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67  as the one being
eae0: 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e  .    ** dropped.
eaf0: 20 54 72 69 67 67 65 72 73 20 61 72 65 20 68 61   Triggers are ha
eb00: 6e 64 6c 65 64 20 73 65 70 65 72 61 74 65 6c 79  ndled seperately
eb10: 20 62 65 63 61 75 73 65 20 61 20 74 72 69 67 67   because a trigg
eb20: 65 72 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a  er can be.    **
eb30: 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
eb40: 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68  temp database th
eb50: 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  at refers to a t
eb60: 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a  able in another.
eb70: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e      ** database.
eb80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
eb90: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
eba0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
ebb0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
ebc0: 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d  %s WHERE tbl_nam
ebd0: 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27  e=%Q and type!='
ebe0: 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20  trigger'",.     
ebf0: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53     pDb->zName, S
ec00: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
ec10: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
ec20: 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20      if( !isView 
ec30: 29 7b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79  ){.      destroy
ec40: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
ec50: 61 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ab);.    }..    
ec60: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61  /* Remove the ta
ec70: 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53  ble entry from S
ec80: 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c  QLite's internal
ec90: 20 73 63 68 65 6d 61 0a 20 20 20 20 2a 2f 0a 20   schema.    */. 
eca0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
ecb0: 33 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c  3(v, OP_DropTabl
ecc0: 65 2c 20 69 44 62 2c 20 30 2c 20 70 54 61 62 2d  e, iDb, 0, pTab-
ecd0: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  >zName, 0);.  }.
ece0: 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65    sqliteViewRese
ecf0: 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a  tAll(db, iDb);..
ed00: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a  exit_drop_table:
ed10: 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
ed20: 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a  tDelete(pName);.
ed30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
ed40: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
ed50: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
ed60: 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74  foreign key on t
ed70: 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72  he table.** curr
ed80: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
ed90: 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d  truction.  pFrom
eda0: 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77  Col determines w
edb0: 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  hich columns.** 
edc0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  in the current t
edd0: 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68  able point to th
ede0: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20  e foreign key.  
edf0: 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74  If pFromCol==0 t
ee00: 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74  hen.** connect t
ee10: 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61  he key to the la
ee20: 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74  st column insert
ee30: 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20  ed.  pTo is the 
ee40: 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74  name of.** the t
ee50: 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f  able referred to
ee60: 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c  .  pToCol is a l
ee70: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ist of tables in
ee80: 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54   the other.** pT
ee90: 6f 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65  o table that the
eea0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69   foreign key poi
eeb0: 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63  nts to.  flags c
eec0: 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69  ontains all.** i
eed0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
eee0: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65   the conflict re
eef0: 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
ef00: 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  hms specified.**
ef10: 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54   in the ON DELET
ef20: 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64  E, ON UPDATE and
ef30: 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73   ON INSERT claus
ef40: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65  es..**.** An FKe
ef50: 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  y structure is c
ef60: 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64  reated and added
ef70: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
ef80: 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72  rrently.** under
ef90: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e   construction in
efa0: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   the pParse->pNe
efb0: 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54  wTable field.  T
efc0: 68 65 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69  he new FKey.** i
efd0: 73 20 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74  s not linked int
efe0: 6f 20 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74  o db->aFKey at t
eff0: 68 69 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74  his point - that
f000: 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e   does not happen
f010: 0a 2a 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65  .** until sqlite
f020: 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a  3EndTable()..**.
f030: 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b  ** The foreign k
f040: 65 79 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d  ey is set for IM
f050: 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73 73 69  MEDIATE processi
f060: 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e  ng.  A subsequen
f070: 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c  t call.** to sql
f080: 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
f090: 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e  Key() might chan
f0a0: 67 65 20 74 68 69 73 20 74 6f 20 44 45 46 45 52  ge this to DEFER
f0b0: 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  RED..*/.void sql
f0c0: 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67  ite3CreateForeig
f0d0: 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  nKey(.  Parse *p
f0e0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
f0f0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
f100: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
f110: 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c  FromCol,  /* Col
f120: 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62  umns in this tab
f130: 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  le that point to
f140: 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
f150: 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20    Token *pTo,   
f160: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
f170: 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c  f the other tabl
f180: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
f190: 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43  *pToCol,    /* C
f1a0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74  olumns in the ot
f1b0: 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  her table */.  i
f1c0: 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
f1d0: 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20      /* Conflict 
f1e0: 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
f1f0: 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 23 69 66  ithms. */.){.#if
f200: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f210: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46  _FOREIGN_KEY.  F
f220: 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a  Key *pFKey = 0;.
f230: 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61    Table *p = pPa
f240: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
f250: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69    int nByte;.  i
f260: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  nt i;.  int nCol
f270: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20  ;.  char *z;..  
f280: 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29  assert( pTo!=0 )
f290: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
f2a0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67  pParse->nErr ) g
f2b0: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66  oto fk_end;.  if
f2c0: 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b  ( pFromCol==0 ){
f2d0: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  .    int iCol = 
f2e0: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69  p->nCol-1;.    i
f2f0: 66 28 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f  f( iCol<0 ) goto
f300: 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28   fk_end;.    if(
f310: 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f   pToCol && pToCo
f320: 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  l->nExpr!=1 ){. 
f330: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
f340: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f  rMsg(pParse, "fo
f350: 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22  reign key on %s"
f360: 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75  .         " shou
f370: 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  ld reference onl
f380: 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  y one column of 
f390: 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20  table %T",.     
f3a0: 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c      p->aCol[iCol
f3b0: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20  ].zName, pTo);. 
f3c0: 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64       goto fk_end
f3d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c  ;.    }.    nCol
f3e0: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
f3f0: 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
f400: 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d  ol->nExpr!=pFrom
f410: 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  Col->nExpr ){.  
f420: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
f430: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
f440: 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c    "number of col
f450: 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20  umns in foreign 
f460: 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
f470: 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ch the number of
f480: 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75   ".        "colu
f490: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72  mns in the refer
f4a0: 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20  enced table");. 
f4b0: 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
f4c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
f4d0: 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  l = pFromCol->nE
f4e0: 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  xpr;.  }.  nByte
f4f0: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79   = sizeof(*pFKey
f500: 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28  ) + nCol*sizeof(
f510: 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20  pFKey->aCol[0]) 
f520: 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20  + pTo->n + 1;.  
f530: 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
f540: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f    for(i=0; i<pTo
f550: 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  Col->nExpr; i++)
f560: 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  {.      nByte +=
f570: 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e   strlen(pToCol->
f580: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b  a[i].zName) + 1;
f590: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
f5a0: 65 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ey = sqliteMallo
f5b0: 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  c( nByte );.  if
f5c0: 28 20 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74  ( pFKey==0 ) got
f5d0: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65  o fk_end;.  pFKe
f5e0: 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20  y->pFrom = p;.  
f5f0: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
f600: 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a   = p->pFKey;.  z
f610: 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79   = (char*)&pFKey
f620: 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43  [1];.  pFKey->aC
f630: 6f 6c 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f  ol = (struct sCo
f640: 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20  lMap*)z;.  z += 
f650: 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43  sizeof(struct sC
f660: 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70  olMap)*nCol;.  p
f670: 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20  FKey->zTo = z;. 
f680: 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e   memcpy(z, pTo->
f690: 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b  z, pTo->n);.  z[
f6a0: 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a  pTo->n] = 0;.  z
f6b0: 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20   += pTo->n+1;.  
f6c0: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d  pFKey->pNextTo =
f6d0: 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f   0;.  pFKey->nCo
f6e0: 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20  l = nCol;.  if( 
f6f0: 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
f700: 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30     pFKey->aCol[0
f710: 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f  ].iFrom = p->nCo
f720: 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l-1;.  }else{.  
f730: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
f740: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
f750: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
f760: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20  j=0; j<p->nCol; 
f770: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
f780: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
f790: 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  (p->aCol[j].zNam
f7a0: 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69  e, pFromCol->a[i
f7b0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
f7c0: 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e           pFKey->
f7d0: 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[i].iFrom = 
f7e0: 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  j;.          bre
f7f0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
f800: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
f810: 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  j>=p->nCol ){.  
f820: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
f830: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
f840: 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77           "unknow
f850: 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20  n column \"%s\" 
f860: 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
f870: 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20  efinition", .   
f880: 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d         pFromCol-
f890: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
f8a0: 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
f8b0: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
f8c0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f  .  }.  if( pToCo
f8d0: 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
f8e0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
f8f0: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
f900: 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  rlen(pToCol->a[i
f910: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
f920: 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  pFKey->aCol[i].z
f930: 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d  Col = z;.      m
f940: 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d  emcpy(z, pToCol-
f950: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b  >a[i].zName, n);
f960: 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b  .      z[n] = 0;
f970: 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b  .      z += n+1;
f980: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
f990: 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
f9a0: 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c   0;.  pFKey->del
f9b0: 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20  eteConf = flags 
f9c0: 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d  & 0xff;.  pFKey-
f9d0: 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66  >updateConf = (f
f9e0: 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78  lags >> 8 ) & 0x
f9f0: 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73  ff;.  pFKey->ins
fa00: 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73  ertConf = (flags
fa10: 20 3e 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b   >> 16 ) & 0xff;
fa20: 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
fa30: 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74  foreign key to t
fa40: 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20  he table as the 
fa50: 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a  last step..  */.
fa60: 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b    p->pFKey = pFK
fa70: 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b  ey;.  pFKey = 0;
fa80: 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69  ..fk_end:.  sqli
fa90: 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 23  teFree(pFKey);.#
faa0: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
fab0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  d(SQLITE_OMIT_FO
fac0: 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20  REIGN_KEY) */.  
fad0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
fae0: 65 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b  elete(pFromCol);
faf0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
fb00: 73 74 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29  stDelete(pToCol)
fb10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
fb20: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
fb30: 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41  d when an INITIA
fb40: 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72  LLY IMMEDIATE or
fb50: 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
fb60: 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73  RED.** clause is
fb70: 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66   seen as part of
fb80: 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64   a foreign key d
fb90: 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20  efinition.  The 
fba0: 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61  isDeferred.** pa
fbb0: 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72  rameter is 1 for
fbc0: 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
fbd0: 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e  RED and 0 for IN
fbe0: 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
fbf0: 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69  E..** The behavi
fc00: 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  or of the most r
fc10: 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20  ecently created 
fc20: 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61  foreign key is a
fc30: 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72  djusted.** accor
fc40: 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  dingly..*/.void 
fc50: 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
fc60: 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50  ignKey(Parse *pP
fc70: 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65  arse, int isDefe
fc80: 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53  rred){.#ifndef S
fc90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
fca0: 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a  GN_KEY.  Table *
fcb0: 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46  pTab;.  FKey *pF
fcc0: 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62  Key;.  if( (pTab
fcd0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
fce0: 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b  able)==0 || (pFK
fcf0: 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79  ey = pTab->pFKey
fd00: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
fd10: 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
fd20: 65 64 20 3d 20 69 73 44 65 66 65 72 72 65 64 3b  ed = isDeferred;
fd30: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
fd40: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
fd50: 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61  hat will erase a
fd60: 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20  nd refill index 
fd70: 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a  *pIdx.  This is.
fd80: 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69  ** used to initi
fd90: 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72  alize a newly cr
fda0: 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74  eated index or t
fdb0: 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a  o recompute the.
fdc0: 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  ** content of an
fdd0: 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e   index in respon
fde0: 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20  se to a REINDEX 
fdf0: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69  command..**.** i
fe00: 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73  f memRootPage is
fe10: 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69   not negative, i
fe20: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
fe30: 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a   index is newly.
fe40: 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  ** created.  The
fe50: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 73 70 65   memory cell spe
fe60: 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f  cified by memRoo
fe70: 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74  tPage contains t
fe80: 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
fe90: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
fea0: 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74  dex.  If memRoot
feb0: 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65  Page is negative
fec0: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e  , then.** the in
fed0: 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
fee0: 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63  ts and must be c
fef0: 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 62 65  leared before be
ff00: 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64  ing refilled and
ff10: 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67  .** the root pag
ff20: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
ff30: 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66  index is taken f
ff40: 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  rom pIndex->tnum
ff50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ff60: 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
ff70: 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
ff80: 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  e, Index *pIndex
ff90: 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67  , int memRootPag
ffa0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  e){.  Table *pTa
ffb0: 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  b = pIndex->pTab
ffc0: 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  le;  /* The tabl
ffd0: 65 20 74 68 61 74 20 69 73 20 69 6e 64 65 78 65  e that is indexe
ffe0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20  d */.  int iTab 
fff0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 20  = pParse->nTab; 
10000 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63        /* Btree c
10010 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
10020 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  Tab */.  int iId
10030 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
10040 2b 31 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65  +1;     /* Btree
10050 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   cursor used for
10060 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74   pIndex */.  int
10070 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20   addr1;         
10080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
10090 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66  ddress of top of
100a0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 74   loop */.  int t
100b0 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
100c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
100d0 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20  t page of index 
100e0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
100f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10100 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
10110 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76  code into this v
10120 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a  irtual machine *
10130 2f 0a 20 20 69 6e 74 20 69 73 55 6e 69 71 75 65  /.  int isUnique
10140 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10150 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
10160 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20 2a 2f   unique index */
10170 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10180 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
10190 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ION.  if( sqlite
101a0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
101b0 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  e, SQLITE_REINDE
101c0 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  X, pIndex->zName
101d0 2c 20 30 2c 0a 20 20 20 20 20 20 70 50 61 72 73  , 0,.      pPars
101e0 65 2d 3e 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65  e->db->aDb[pInde
101f0 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20  x->iDb].zName ) 
10200 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
10210 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 76 20 3d   }.#endif..  v =
10220 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
10230 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
10240 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
10250 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e  if( memRootPage>
10260 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
10270 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10280 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d 52 6f 6f  _MemLoad, memRoo
10290 74 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 74  tPage, 0);.    t
102a0 6e 75 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  num = 0;.  }else
102b0 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e  {.    tnum = pIn
102c0 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 73  dex->tnum;.    s
102d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
102e0 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75  v, OP_Clear, tnu
102f0 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b  m, pIndex->iDb);
10300 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
10310 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
10320 74 65 67 65 72 2c 20 70 49 6e 64 65 78 2d 3e 69  teger, pIndex->i
10330 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  Db, 0);.  sqlite
10340 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f  3VdbeOp3(v, OP_O
10350 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20  penWrite, iIdx, 
10360 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  tnum,.          
10370 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
10380 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66  )&pIndex->keyInf
10390 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P3_KEYINFO);.
103a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
103b0 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
103c0 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20 30 29 3b  , pTab->iDb, 0);
103d0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
103e0 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  dOp(v, OP_OpenRe
103f0 61 64 2c 20 69 54 61 62 2c 20 70 54 61 62 2d 3e  ad, iTab, pTab->
10400 74 6e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  tnum);.  sqlite3
10410 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10420 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69  SetNumColumns, i
10430 54 61 62 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29  Tab, pTab->nCol)
10440 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
10450 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10460 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
10470 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65   0);.  sqlite3Ge
10480 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 76  nerateIndexKey(v
10490 2c 20 70 49 6e 64 65 78 2c 20 69 54 61 62 29 3b  , pIndex, iTab);
104a0 0a 20 20 69 73 55 6e 69 71 75 65 20 3d 20 70 49  .  isUnique = pI
104b0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
104c0 45 5f 4e 6f 6e 65 3b 0a 20 20 73 71 6c 69 74 65  E_None;.  sqlite
104d0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
104e0 5f 49 64 78 50 75 74 2c 20 69 49 64 78 2c 20 69  _IdxPut, iIdx, i
104f0 73 55 6e 69 71 75 65 29 3b 0a 20 20 69 66 28 20  sUnique);.  if( 
10500 69 73 55 6e 69 71 75 65 20 29 7b 0a 20 20 20 20  isUnique ){.    
10510 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
10520 65 50 33 28 76 2c 20 2d 31 2c 20 22 69 6e 64 65  eP3(v, -1, "inde
10530 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  xed columns are 
10540 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33 5f  not unique", P3_
10550 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 20 20 73  STATIC);.  }.  s
10560 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10570 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62  v, OP_Next, iTab
10580 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20 20 73 71  , addr1+1);.  sq
10590 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
105a0 32 28 76 2c 20 61 64 64 72 31 2c 20 73 71 6c 69  2(v, addr1, sqli
105b0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
105c0 64 72 28 76 29 29 3b 0a 20 20 73 71 6c 69 74 65  dr(v));.  sqlite
105d0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
105e0 5f 43 6c 6f 73 65 2c 20 69 54 61 62 2c 20 30 29  _Close, iTab, 0)
105f0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
10600 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
10610 2c 20 69 49 64 78 2c 20 30 29 3b 0a 7d 0a 0a 2f  , iIdx, 0);.}../
10620 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
10630 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53  w index for an S
10640 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65  QL table.  pName
10650 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20  1.pName2 is the 
10660 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
10670 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69  x .** and pTblLi
10680 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  st is the name o
10690 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  f the table that
106a0 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
106b0 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a  d.  Both will .*
106c0 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20  * be NULL for a 
106d0 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61  primary key or a
106e0 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  n index that is 
106f0 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73  created to satis
10700 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63  fy a.** UNIQUE c
10710 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70  onstraint.  If p
10720 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78  Table and pIndex
10730 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70   are NULL, use p
10740 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
10750 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65  .** as the table
10760 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
10770 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
10780 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68  le is a table th
10790 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  at is.** current
107a0 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
107b0 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45  cted by a CREATE
107c0 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
107d0 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73  ..**.** pList is
107e0 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   a list of colum
107f0 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
10800 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65  .  pList will be
10810 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a   NULL if this.**
10820 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65   is a primary ke
10830 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73  y or unique-cons
10840 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f  traint on the mo
10850 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e  st recent column
10860 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65   added.** to the
10870 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
10880 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
10890 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73  ion.  .*/.void s
108a0 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
108b0 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
108c0 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69  se,     /* All i
108d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
108e0 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20   this parse */. 
108f0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
10900 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72      /* First par
10910 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e  t of index name.
10920 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
10930 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
10940 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70       /* Second p
10950 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
10960 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
10970 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62  /.  SrcList *pTb
10980 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20  lName, /* Table 
10990 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50  to index. Use pP
109a0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
109b0 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69  if 0 */.  ExprLi
109c0 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
109d0 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  A list of column
109e0 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
109f0 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
10a00 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62  ,       /* OE_Ab
10a10 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  ort, OE_Ignore, 
10a20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f  OE_Replace, or O
10a30 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65  E_None */.  Toke
10a40 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f  n *pStart,     /
10a50 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
10a60 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 61  en that begins a
10a70 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
10a80 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
10a90 65 6e 20 2a 70 45 6e 64 20 20 20 20 20 20 20 20  en *pEnd        
10aa0 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74 20  /* The ")" that 
10ab0 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41 54  closes the CREAT
10ac0 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
10ad0 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  t */.){.  Table 
10ae0 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20  *pTab = 0;   /* 
10af0 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  Table to be inde
10b00 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  xed */.  Index *
10b10 70 49 6e 64 65 78 20 3d 20 30 3b 20 2f 2a 20 54  pIndex = 0; /* T
10b20 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63  he index to be c
10b30 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72  reated */.  char
10b40 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *zName = 0;.  i
10b50 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e  nt i, j;.  Token
10b60 20 6e 75 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46   nullId;    /* F
10b70 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e  ake token for an
10b80 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a   empty ID list *
10b90 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  /.  DbFixer sFix
10ba0 3b 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69  ;    /* For assi
10bb0 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e  gning database n
10bc0 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a  ames to pTable *
10bd0 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 3b 20  /.  int isTemp; 
10be0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
10bf0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 69 6e 64   a temporary ind
10c00 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ex */.  sqlite3 
10c10 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
10c20 3b 0a 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  ;..  int iDb;   
10c30 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
10c40 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
10c50 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 77 72  that is being wr
10c60 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  itten */.  Token
10c70 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20   *pName = 0; /* 
10c80 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
10c90 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f   of the index to
10ca0 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66   create */..  if
10cb0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
10cc0 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  | sqlite3_malloc
10cd0 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65  _failed ) goto e
10ce0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10cf0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  ;..  /*.  ** Fin
10d00 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  d the table that
10d10 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
10d20 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79  d.  Return early
10d30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   if not found.. 
10d40 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61   */.  if( pTblNa
10d50 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a  me!=0 ){..    /*
10d60 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72   Use the two-par
10d70 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20  t index name to 
10d80 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61  determine the da
10d90 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74  tabase .    ** t
10da0 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65  o search for the
10db0 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68   table. 'Fix' th
10dc0 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  e table name to 
10dd0 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62  this db.    ** b
10de0 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70  efore looking up
10df0 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
10e00 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
10e10 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20  Name1 && pName2 
10e20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  );.    iDb = sql
10e30 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
10e40 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
10e50 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
10e60 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29  .    if( iDb<0 )
10e70 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
10e80 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20 2f 2a  e_index;..    /*
10e90 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61   If the index na
10ea0 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69  me was unqualifi
10eb0 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65  ed, check if the
10ec0 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
10ed0 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c  * is a temp tabl
10ee0 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68  e. If so, set th
10ef0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e  e database to 1.
10f00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 61 62  .    */.    pTab
10f10 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
10f20 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  tLookup(pParse, 
10f30 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 69  pTblName);.    i
10f40 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61  f( pName2 && pNa
10f50 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61  me2->n==0 && pTa
10f60 62 20 26 26 20 70 54 61 62 2d 3e 69 44 62 3d 3d  b && pTab->iDb==
10f70 31 20 29 7b 0a 20 20 20 20 20 20 69 44 62 20 3d  1 ){.      iDb =
10f80 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   1;.    }..    i
10f90 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
10fa0 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
10fb0 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70   iDb, "index", p
10fc0 4e 61 6d 65 29 20 26 26 0a 20 20 20 20 20 20 20  Name) &&.       
10fd0 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
10fe0 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61  st(&sFix, pTblNa
10ff0 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  me).    ){.     
11000 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
11010 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
11020 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
11030 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
11040 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61  rse, pTblName->a
11050 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  [0].zName, .    
11060 20 20 20 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b      pTblName->a[
11070 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
11080 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67     if( !pTab ) g
11090 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
110a0 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72  index;.    asser
110b0 74 28 20 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44  t( iDb==pTab->iD
110c0 62 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  b );.  }else{.  
110d0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d    assert( pName=
110e0 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d  =0 );.    pTab =
110f0 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
11100 62 6c 65 3b 0a 20 20 20 20 69 44 62 20 3d 20 70  ble;.    iDb = p
11110 54 61 62 2d 3e 69 44 62 3b 0a 20 20 7d 0a 0a 20  Tab->iDb;.  }.. 
11120 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20   if( pTab==0 || 
11130 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67  pParse->nErr ) g
11140 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
11150 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61  index;.  if( pTa
11160 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  b->readOnly ){. 
11170 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11180 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
11190 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
111a0 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e  indexed", pTab->
111b0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
111c0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
111d0 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  ex;.  }.#ifndef 
111e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
111f0 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65  .  if( pTab->pSe
11200 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
11210 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
11220 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e  se, "views may n
11230 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
11240 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
11250 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
11260 0a 23 65 6e 64 69 66 0a 20 20 69 73 54 65 6d 70  .#endif.  isTemp
11270 20 3d 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31 3b   = pTab->iDb==1;
11280 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
11290 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
112a0 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75   index.  Make su
112b0 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  re there is not 
112c0 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a  already another.
112d0 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
112e0 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ble with the sam
112f0 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20  e name.  .  **. 
11300 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20   ** Exception:  
11310 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  If we are readin
11320 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70  g the names of p
11330 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73  ermanent indices
11340 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73   from the.  ** s
11350 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
11360 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65  le (because some
11370 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63   other process c
11380 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d  hanged the schem
11390 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20  a) and.  ** one 
113a0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  of the index nam
113b0 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68  es collides with
113c0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74   the name of a t
113d0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
113e0 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68  r.  ** index, th
113f0 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  en we will conti
11400 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74  nue to process t
11410 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a  his index..  **.
11420 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30    ** If pName==0
11430 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
11440 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69  e are.  ** deali
11450 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72  ng with a primar
11460 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20  y key or UNIQUE 
11470 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20  constraint.  We 
11480 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f  have to invent o
11490 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65  ur.  ** own name
114a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61  ..  */.  if( pNa
114b0 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
114c0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
114d0 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
114e0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
114f0 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
11500 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
11510 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
11520 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e  ndex;.    if( zN
11530 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ame==0 ) goto ex
11540 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
11550 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
11560 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
11570 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
11580 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
11590 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
115a0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
115b0 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
115c0 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
115d0 20 49 6e 64 65 78 20 2a 70 49 53 61 6d 65 4e 61   Index *pISameNa
115e0 6d 65 3b 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65  me;    /* Anothe
115f0 72 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65  r index with the
11600 20 73 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   same name */.  
11610 20 20 20 20 54 61 62 6c 65 20 2a 70 54 53 61 6d      Table *pTSam
11620 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74  eName;    /* A t
11630 61 62 6c 65 20 77 69 74 68 20 73 61 6d 65 20 6e  able with same n
11640 61 6d 65 20 61 73 20 74 68 65 20 69 6e 64 65 78  ame as the index
11650 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 53 51   */.      if( SQ
11660 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
11670 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
11680 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  e) ) goto exit_c
11690 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
116a0 20 20 20 69 66 28 20 28 70 49 53 61 6d 65 4e 61     if( (pISameNa
116b0 6d 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  me = sqlite3Find
116c0 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
116d0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
116e0 61 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ame))!=0 ){.    
116f0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11700 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
11710 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78  ex %s already ex
11720 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ists", zName);. 
11730 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
11740 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
11750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
11760 20 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73   (pTSameName = s
11770 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
11780 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d  db, zName, 0))!=
11790 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
117a0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
117b0 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
117c0 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e  lready a table n
117d0 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29  amed %s", zName)
117e0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
117f0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
11800 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11810 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d    }else if( pNam
11820 65 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  e==0 ){.    char
11830 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69   zBuf[30];.    i
11840 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20  nt n;.    Index 
11850 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28  *pLoop;.    for(
11860 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64  pLoop=pTab->pInd
11870 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20  ex, n=1; pLoop; 
11880 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65  pLoop=pLoop->pNe
11890 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73  xt, n++){}.    s
118a0 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 5f 25 64  printf(zBuf,"_%d
118b0 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20  ",n);.    zName 
118c0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
118d0 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65  SetString(&zName
118e0 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
118f0 64 65 78 5f 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  dex_", pTab->zNa
11900 6d 65 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a  me, zBuf, (char*
11910 29 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  )0);.    if( zNa
11920 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
11930 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
11940 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
11950 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  for authorizatio
11960 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69  n to create an i
11970 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  ndex..  */.#ifnd
11980 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
11990 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
119a0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
119b0 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70  *zDb = db->aDb[p
119c0 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b  Tab->iDb].zName;
119d0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
119e0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
119f0 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
11a00 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73   SCHEMA_TABLE(is
11a10 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29  Temp), 0, zDb) )
11a20 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
11a30 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
11a40 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51      }.    i = SQ
11a50 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
11a60 58 3b 0a 20 20 20 20 69 66 28 20 69 73 54 65 6d  X;.    if( isTem
11a70 70 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43  p ) i = SQLITE_C
11a80 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
11a90 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
11aa0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
11ab0 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61  e, i, zName, pTa
11ac0 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
11ad0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
11ae0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
11af0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
11b00 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d  ..  /* If pList=
11b10 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69  =0, it means thi
11b20 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
11b30 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70  lled to make a p
11b40 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20  rimary.  ** key 
11b50 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20  out of the last 
11b60 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20  column added to 
11b70 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
11b80 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20  construction..  
11b90 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66  ** So create a f
11ba0 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75  ake list to simu
11bb0 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a  late this..  */.
11bc0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
11bd0 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d  {.    nullId.z =
11be0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62   pTab->aCol[pTab
11bf0 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b  ->nCol-1].zName;
11c00 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20  .    nullId.n = 
11c10 73 74 72 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29  strlen(nullId.z)
11c20 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  ;.    pList = sq
11c30 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
11c40 65 6e 64 28 30 2c 20 30 2c 20 26 6e 75 6c 6c 49  end(0, 0, &nullI
11c50 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  d);.    if( pLis
11c60 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  t==0 ) goto exit
11c70 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
11c80 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41   }..  /* .  ** A
11c90 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65  llocate the inde
11ca0 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20  x structure. .  
11cb0 2a 2f 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  */.  pIndex = sq
11cc0 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
11cd0 6f 66 28 49 6e 64 65 78 29 20 2b 20 73 74 72 6c  of(Index) + strl
11ce0 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a  en(zName) + 1 +.
11cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d00 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28          (sizeof(
11d10 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 43 6f  int) + sizeof(Co
11d20 6c 6c 53 65 71 2a 29 29 2a 70 4c 69 73 74 2d 3e  llSeq*))*pList->
11d30 6e 45 78 70 72 20 29 3b 0a 20 20 69 66 28 20 70  nExpr );.  if( p
11d40 49 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20  Index==0 ) goto 
11d50 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
11d60 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  x;.  pIndex->aiC
11d70 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70  olumn = (int*)&p
11d80 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
11d90 43 6f 6c 6c 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  Coll[pList->nExp
11da0 72 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e  r];.  pIndex->zN
11db0 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49  ame = (char*)&pI
11dc0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  ndex->aiColumn[p
11dd0 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20  List->nExpr];.  
11de0 73 74 72 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a  strcpy(pIndex->z
11df0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Name, zName);.  
11e00 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d  pIndex->pTable =
11e10 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d   pTab;.  pIndex-
11e20 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74  >nColumn = pList
11e30 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65  ->nExpr;.  pInde
11e40 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45  x->onError = onE
11e50 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  rror;.  pIndex->
11e60 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d  autoIndex = pNam
11e70 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  e==0;.  pIndex->
11e80 69 44 62 20 3d 20 69 44 62 3b 0a 0a 20 20 2f 2a  iDb = iDb;..  /*
11e90 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20   Scan the names 
11ea0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  of the columns o
11eb0 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
11ec0 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20  e indexed and.  
11ed0 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75  ** load the colu
11ee0 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20  mn indices into 
11ef0 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74  the Index struct
11f00 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20  ure.  Report an 
11f10 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e  error.  ** if an
11f20 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20  y column is not 
11f30 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f  found..  */.  fo
11f40 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
11f50 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
11f60 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
11f70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
11f80 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
11f90 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
11fa0 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i].zName, pTab->
11fb0 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d  aCol[j].zName)==
11fc0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
11fd0 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62  .    if( j>=pTab
11fe0 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
11ff0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12000 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
12010 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20  s has no column 
12020 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20  named %s",.     
12030 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20     pTab->zName, 
12040 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
12050 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  e);.      goto e
12060 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12070 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
12080 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
12090 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  = j;.    if( pLi
120a0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 29  st->a[i].pExpr )
120b0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
120c0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
120d0 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  r->pColl );.    
120e0 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66    pIndex->keyInf
120f0 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 4c 69  o.aColl[i] = pLi
12100 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e  st->a[i].pExpr->
12110 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  pColl;.    }else
12120 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
12130 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d  keyInfo.aColl[i]
12140 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
12150 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  .pColl;.    }.  
12160 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
12170 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
12180 69 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 21 64  i] );.    if( !d
12190 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
121a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
121b0 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61  CheckCollSeq(pPa
121c0 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 6b 65 79  rse, pIndex->key
121d0 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 0a  Info.aColl[i]) .
121e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
121f0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
12200 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  dex;.    }.  }. 
12210 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f   pIndex->keyInfo
12220 2e 6e 46 69 65 6c 64 20 3d 20 70 4c 69 73 74 2d  .nField = pList-
12230 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70  >nExpr;..  if( p
12240 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65  Tab==pParse->pNe
12250 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a  wTable ){.    /*
12260 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
12270 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f  s been called to
12280 20 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d   create an autom
12290 61 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a  atic index as a.
122a0 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66      ** result of
122b0 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
122c0 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
122d0 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69  on a column defi
122e0 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a  nition, or.    *
122f0 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  * a PRIMARY KEY 
12300 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65  or UNIQUE clause
12310 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63   following the c
12320 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
12330 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f  s..    ** i.e. o
12340 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  ne of:.    **.  
12350 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
12360 45 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45  E t(x PRIMARY KE
12370 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52  Y, y);.    ** CR
12380 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20  EATE TABLE t(x, 
12390 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29  y, UNIQUE(x, y))
123a0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
123b0 45 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63  Either way, chec
123c0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
123d0 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
123e0 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e  s such an index.
123f0 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64   If.    ** so, d
12400 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61  on't bother crea
12410 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54  ting this one. T
12420 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73  his only applies
12430 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d   to.    ** autom
12440 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64  atically created
12450 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20   indices. Users 
12460 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77  can do as they w
12470 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  ish with.    ** 
12480 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73  explicit indices
12490 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64  ..    */.    Ind
124a0 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
124b0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
124c0 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
124d0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
124e0 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
124f0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6f   assert( pIdx->o
12500 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
12510 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
12520 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78   pIdx->autoIndex
12530 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
12540 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  ( pIndex->onErro
12550 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20  r!=OE_None );.. 
12560 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e       if( pIdx->n
12570 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e  Column!=pIndex->
12580 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e  nColumn ) contin
12590 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  ue;.      for(k=
125a0 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; k<pIdx->nColu
125b0 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; k++){.      
125c0 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
125d0 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d  lumn[k]!=pIndex-
125e0 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62  >aiColumn[k] ) b
125f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66  reak;.        if
12600 28 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e  ( pIdx->keyInfo.
12610 61 43 6f 6c 6c 5b 6b 5d 21 3d 70 49 6e 64 65 78  aColl[k]!=pIndex
12620 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
12630 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  k] ) break;.    
12640 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d    }.      if( k=
12650 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  =pIdx->nColumn )
12660 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
12670 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e  dx->onError!=pIn
12680 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a  dex->onError ){.
12690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
126a0 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65  s constraint cre
126b0 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e  ates the same in
126c0 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75  dex as a previou
126d0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
126e0 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66  onstraint specif
126f0 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e  ied somewhere in
12700 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
12710 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  E statement..   
12720 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65         ** Howeve
12730 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43  r the ON CONFLIC
12740 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69  T clauses are di
12750 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68  fferent. If both
12760 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
12770 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61   ** constraint a
12780 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  nd the previous 
12790 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74  equivalent const
127a0 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69  raint have expli
127b0 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  cit.          **
127c0 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
127d0 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20  uses this is an 
127e0 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65  error. Otherwise
127f0 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  , use the.      
12800 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c      ** explicitl
12810 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61  y specified beha
12820 76 69 6f 75 72 20 66 6f 72 20 74 68 65 20 69 6e  viour for the in
12830 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  dex..          *
12840 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
12850 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  !(pIdx->onError=
12860 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70  =OE_Default || p
12870 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
12880 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20  OE_Default) ){. 
12890 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
128a0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
128b0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
128c0 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67      "conflicting
128d0 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
128e0 75 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c  uses specified",
128f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   0);.          }
12900 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
12910 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
12920 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  _Default ){.    
12930 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e          pIdx->on
12940 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e  Error = pIndex->
12950 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  onError;.       
12960 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
12970 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
12980 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
12990 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
129a0 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
129b0 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74  new Index struct
129c0 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65  ure to its table
129d0 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65   and to the othe
129e0 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  r.  ** in-memory
129f0 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
12a00 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  ures. .  */.  if
12a10 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
12a20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  ){.    Index *p;
12a30 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
12a40 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
12a50 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d  aDb[pIndex->iDb]
12a60 2e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20  .idxHash, .     
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a80 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
12a90 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78  e, strlen(pIndex
12aa0 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64  ->zName)+1, pInd
12ab0 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  ex);.    if( p )
12ac0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
12ad0 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a  p==pIndex );  /*
12ae0 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
12af0 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  e failed */.    
12b00 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
12b10 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
12b20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
12b30 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
12b40 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70  anges;.    if( p
12b50 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  TblName!=0 ){.  
12b60 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
12b70 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54   = db->init.newT
12b80 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  num;.    }.  }..
12b90 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
12ba0 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 74  init.busy is 0 t
12bb0 68 65 6e 20 63 72 65 61 74 65 20 74 68 65 20 69  hen create the i
12bc0 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54  ndex on disk.  T
12bd0 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65  his.  ** involve
12be0 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e  s writing the in
12bf0 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73  dex into the mas
12c00 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69  ter table and fi
12c10 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a  lling in the.  *
12c20 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65  * index with the
12c30 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63   current table c
12c40 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20  ontents..  **.  
12c50 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e  ** The db->init.
12c60 62 75 73 79 20 69 73 20 30 20 77 68 65 6e 20 74  busy is 0 when t
12c70 68 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e  he user first en
12c80 74 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e  ters a CREATE IN
12c90 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e  DEX .  ** comman
12ca0 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  d.  db->init.bus
12cb0 79 20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61  y is 1 when a da
12cc0 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
12cd0 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54   and .  ** CREAT
12ce0 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
12cf0 74 73 20 61 72 65 20 72 65 61 64 20 6f 75 74 20  ts are read out 
12d00 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  of the master ta
12d10 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68  ble.  In.  ** th
12d20 65 20 6c 61 74 74 65 72 20 63 61 73 65 20 74 68  e latter case th
12d30 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
12d40 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20  exists on disk, 
12d50 77 68 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a  which is why.  *
12d60 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20  * we don't want 
12d70 74 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a  to recreate it..
12d80 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62    **.  ** If pTb
12d90 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  lName==0 it mean
12da0 73 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  s this index is 
12db0 67 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70  generated as a p
12dc0 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20  rimary key.  ** 
12dd0 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
12de0 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45  aint of a CREATE
12df0 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
12e00 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62  .  Since the tab
12e10 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74  le.  ** has just
12e20 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69   been created, i
12e30 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61  t contains no da
12e40 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ta and the index
12e50 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
12e60 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65    ** step can be
12e70 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
12e80 20 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 69 6e   else if( db->in
12e90 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20  it.busy==0 ){.  
12ea0 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
12eb0 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20  har *zStmt;.    
12ec0 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73  int iMem = pPars
12ed0 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20  e->nMem++;..    
12ee0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
12ef0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
12f00 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
12f10 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12f20 78 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  x;..    /* Creat
12f30 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66  e the rootpage f
12f40 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  or the index.   
12f50 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
12f60 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
12f70 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
12f80 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
12f90 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
12fa0 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c  reateIndex, iDb,
12fb0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12fc0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12fd0 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20  MemStore, iMem, 
12fe0 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68  0);..    /* Gath
12ff0 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  er the complete 
13000 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
13010 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
13020 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74  nt into.    ** t
13030 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c  he zStmt variabl
13040 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
13050 20 70 53 74 61 72 74 20 26 26 20 70 45 6e 64 20   pStart && pEnd 
13060 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 61  ){.      /* A na
13070 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68 20 61  med index with a
13080 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45 41 54  n explicit CREAT
13090 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
130a0 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74  t */.      zStmt
130b0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
130c0 66 28 22 43 52 45 41 54 45 25 73 20 49 4e 44 45  f("CREATE%s INDE
130d0 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20  X %.*s",.       
130e0 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e   onError==OE_Non
130f0 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55  e ? "" : " UNIQU
13100 45 22 2c 0a 20 20 20 20 20 20 20 20 41 64 64 72  E",.        Addr
13110 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72  (pEnd->z) - Addr
13120 28 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 31 2c 0a  (pName->z) + 1,.
13130 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a          pName->z
13140 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
13150 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61      /* An automa
13160 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74 65  tic index create
13170 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b  d by a PRIMARY K
13180 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  EY or UNIQUE con
13190 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20  straint */.     
131a0 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69   /* zStmt = sqli
131b0 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20  te3MPrintf(""); 
131c0 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  */.      zStmt =
131d0 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
131e0 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69  * Add an entry i
131f0 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  n sqlite_master 
13200 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20  for this index. 
13210 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
13220 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
13230 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49  rse, .        "I
13240 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73  NSERT INTO %Q.%s
13250 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c   VALUES('index',
13260 25 51 2c 25 51 2c 23 30 2c 25 51 29 3b 22 2c 0a  %Q,%Q,#0,%Q);",.
13270 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b          db->aDb[
13280 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
13290 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20  MA_TABLE(iDb),. 
132a0 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
132b0 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54  Name,.        pT
132c0 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
132d0 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a     zStmt.    );.
132e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
132f0 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
13300 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
13310 65 46 72 65 65 28 7a 53 74 6d 74 29 3b 0a 0a 20  eFree(zStmt);.. 
13320 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69     /* Fill the i
13330 6e 64 65 78 20 77 69 74 68 20 64 61 74 61 20 61  ndex with data a
13340 6e 64 20 72 65 70 61 72 73 65 20 74 68 65 20 73  nd reparse the s
13350 63 68 65 6d 61 0a 20 20 20 20 2a 2f 0a 20 20 20  chema.    */.   
13360 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b   if( pTblName ){
13370 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
13380 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
13390 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b  , pIndex, iMem);
133a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
133b0 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
133c0 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
133d0 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
133e0 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20  OP_ParseSchema, 
133f0 69 44 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  iDb, 0,.        
13400 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
13410 22 6e 61 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e  "name='%q'", pIn
13420 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f  dex->zName), P3_
13430 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a  DYNAMIC);.    }.
13440 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61    }..  /* When a
13450 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74  dding an index t
13460 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
13470 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c  dices for a tabl
13480 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  e, make.  ** sur
13490 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61  e all indices la
134a0 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65  beled OE_Replace
134b0 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20   come after all 
134c0 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20  those labeled.  
134d0 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54  ** OE_Ignore.  T
134e0 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
134f0 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74   for the correct
13500 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50   operation of UP
13510 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e  DATE.  ** and IN
13520 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  SERT..  */.  if(
13530 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c   db->init.busy |
13540 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b  | pTblName==0 ){
13550 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72  .    if( onError
13560 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20  !=OE_Replace || 
13570 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a  pTab->pIndex==0.
13580 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62           || pTab
13590 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  ->pIndex->onErro
135a0 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a  r==OE_Replace){.
135b0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
135c0 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  ext = pTab->pInd
135d0 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  ex;.      pTab->
135e0 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b  pIndex = pIndex;
135f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13600 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20    Index *pOther 
13610 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
13620 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74        while( pOt
13630 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f  her->pNext && pO
13640 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45  ther->pNext->onE
13650 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
13660 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68   ){.        pOth
13670 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  er = pOther->pNe
13680 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
13690 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
136a0 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
136b0 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70  .      pOther->p
136c0 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20  Next = pIndex;. 
136d0 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 20     }.    pIndex 
136e0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
136f0 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65  lean up before e
13700 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63  xiting */.exit_c
13710 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69  reate_index:.  i
13720 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
13730 20 66 72 65 65 49 6e 64 65 78 28 70 49 6e 64 65   freeIndex(pInde
13740 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  x);.  }.  sqlite
13750 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
13760 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  pList);.  sqlite
13770 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
13780 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  TblName);.  sqli
13790 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
137a0 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
137b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
137c0 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73  ill drop an exis
137d0 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78  ting named index
137e0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
137f0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ** implements th
13800 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61  e DROP INDEX sta
13810 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
13820 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78  sqlite3DropIndex
13830 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
13840 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 29 7b  SrcList *pName){
13850 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
13860 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
13870 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
13880 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
13890 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
138a0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
138b0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
138c0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
138d0 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66  >nSrc==1 );.  if
138e0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
138f0 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
13900 50 61 72 73 65 29 20 29 20 72 65 74 75 72 6e 3b  Parse) ) return;
13910 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
13920 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
13930 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61   pName->a[0].zNa
13940 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  me, pName->a[0].
13950 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  zDatabase);.  if
13960 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20  ( pIndex==0 ){. 
13970 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13980 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
13990 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20  uch index: %S", 
139a0 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70  pName, 0);.    p
139b0 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
139c0 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  ma = 1;.    goto
139d0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
139e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64  ;.  }.  if( pInd
139f0 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b  ex->autoIndex ){
13a00 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
13a10 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
13a20 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
13a30 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20  ith UNIQUE ".   
13a40 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b     "or PRIMARY K
13a50 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61  EY constraint ca
13a60 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22  nnot be dropped"
13a70 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  , 0);.    goto e
13a80 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
13a90 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
13aa0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
13ab0 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
13ac0 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  t code = SQLITE_
13ad0 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  DROP_INDEX;.    
13ae0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
13af0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20  ndex->pTable;.  
13b00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
13b10 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e 64  b = db->aDb[pInd
13b20 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  ex->iDb].zName;.
13b30 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
13b40 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
13b50 42 4c 45 28 70 49 6e 64 65 78 2d 3e 69 44 62 29  BLE(pIndex->iDb)
13b60 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
13b70 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
13b80 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
13b90 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20  , zTab, 0, zDb) 
13ba0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
13bb0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
13bc0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e     }.    if( pIn
13bd0 64 65 78 2d 3e 69 44 62 20 29 20 63 6f 64 65 20  dex->iDb ) code 
13be0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
13bf0 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  MP_INDEX;.    if
13c00 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
13c10 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
13c20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
13c30 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
13c40 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
13c50 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
13c60 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
13c70 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
13c80 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
13c90 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72  the index and fr
13ca0 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
13cb0 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ble */.  v = sql
13cc0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
13cd0 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
13ce0 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 70 49      int iDb = pI
13cf0 6e 64 65 78 2d 3e 69 44 62 3b 0a 20 20 20 20 73  ndex->iDb;.    s
13d00 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
13d10 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
13d20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
13d30 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  .%s WHERE name=%
13d40 51 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61  Q",.       db->a
13d50 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
13d60 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
13d70 2c 0a 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ,.       pIndex-
13d80 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20  >zName.    );.  
13d90 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
13da0 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62  ookie(db, v, iDb
13db0 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f  );.    destroyRo
13dc0 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
13dd0 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62  Index->tnum, iDb
13de0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13df0 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70  beOp3(v, OP_Drop
13e00 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 70  Index, iDb, 0, p
13e10 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Index->zName, 0)
13e20 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70  ;.  }..exit_drop
13e30 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65  _index:.  sqlite
13e40 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
13e50 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
13e60 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65  Append a new ele
13e70 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65  ment to the give
13e80 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74  n IdList.  Creat
13e90 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69  e a new IdList i
13ea0 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a  f.** need be..**
13eb0 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74  .** A new IdList
13ec0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
13ed0 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
13ee0 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69  ) fails..*/.IdLi
13ef0 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
13f00 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a  tAppend(IdList *
13f10 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
13f20 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69  oken){.  if( pLi
13f30 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
13f40 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  st = sqliteMallo
13f50 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74  c( sizeof(IdList
13f60 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
13f70 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
13f80 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
13f90 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  loc = 0;.  }.  i
13fa0 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3e 3d 70  f( pList->nId>=p
13fb0 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  List->nAlloc ){.
13fc0 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
13fd0 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 70  t_item *a;.    p
13fe0 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  List->nAlloc = p
13ff0 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b  List->nAlloc*2 +
14000 20 35 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69   5;.    a = sqli
14010 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d  teRealloc(pList-
14020 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  >a, pList->nAllo
14030 63 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  c*sizeof(pList->
14040 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
14050 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   a==0 ){.      s
14060 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
14070 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  te(pList);.     
14080 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
14090 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
140a0 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  a;.  }.  memset(
140b0 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
140c0 3e 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >nId], 0, sizeof
140d0 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
140e0 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74    pList->a[pList
140f0 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->nId].zName = s
14100 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
14110 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20 20 70  ken(pToken);.  p
14120 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72  List->nId++;.  r
14130 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
14140 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
14150 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  ew table name to
14160 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69   the given SrcLi
14170 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
14180 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20  w SrcList if.** 
14190 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20  need be.  A new 
141a0 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64  entry is created
141b0 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
141c0 65 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69  even if pToken i
141d0 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20  s NULL..**.** A 
141e0 6e 65 77 20 53 72 63 4c 69 73 74 20 69 73 20 72  new SrcList is r
141f0 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
14200 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
14210 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61  ls..**.** If pDa
14220 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75  tabase is not nu
14230 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ll, it means tha
14240 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  t the table has 
14250 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64  an optional.** d
14260 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65  atabase name pre
14270 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  fix.  Like this:
14280 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c    "database.tabl
14290 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62 61  e".  The pDataba
142a0 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  se.** points to 
142b0 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
142c0 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f  nd the pTable po
142d0 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74 61  ints to the data
142e0 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68  base name..** Th
142f0 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e  e SrcList.a[].zN
14300 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c  ame field is fil
14310 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  led with the tab
14320 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69  le name which mi
14330 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d  ght.** come from
14340 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61 74   pTable (if pDat
14350 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f  abase is NULL) o
14360 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65  r from pDatabase
14370 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61  .  .** SrcList.a
14380 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20  [].zDatabase is 
14390 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
143a0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72  database name fr
143b0 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72  om pTable,.** or
143c0 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f   with NULL if no
143d0 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70 65   database is spe
143e0 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e  cified..**.** In
143f0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
14400 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a   call like this:
14410 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  .**.**         s
14420 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
14430 65 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a  end(A,B,0);.**.*
14440 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61  * Then B is a ta
14450 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
14460 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
14470 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20  s unspecified.  
14480 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b  If called.** lik
14490 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
144a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
144b0 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 43  ListAppend(A,B,C
144c0 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20  );.**.** Then C 
144d0 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  is the table nam
144e0 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64  e and B is the d
144f0 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f  atabase name..*/
14500 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
14510 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 53  3SrcListAppend(S
14520 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  rcList *pList, T
14530 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f  oken *pTable, To
14540 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 29 7b  ken *pDatabase){
14550 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
14560 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
14570 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
14580 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
14590 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
145a0 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20  f(SrcList) );.  
145b0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
145c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
145d0 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31  List->nAlloc = 1
145e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
145f0 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e  t->nSrc>=pList->
14600 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72  nAlloc ){.    Sr
14610 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20  cList *pNew;.   
14620 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a   pList->nAlloc *
14630 3d 20 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  = 2;.    pNew = 
14640 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
14650 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ist,.           
14660 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73      sizeof(*pLis
14670 74 29 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c  t) + (pList->nAl
14680 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c  loc-1)*sizeof(pL
14690 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  ist->a[0]) );.  
146a0 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
146b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72  .      sqlite3Sr
146c0 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  cListDelete(pLis
146d0 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
146e0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c   0;.    }.    pL
146f0 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
14700 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
14710 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d  ->a[pList->nSrc]
14720 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d  ;.  memset(pItem
14730 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73  , 0, sizeof(pLis
14740 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28  t->a[0]));.  if(
14750 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44   pDatabase && pD
14760 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b  atabase->z==0 ){
14770 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
14780 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44   0;.  }.  if( pD
14790 61 74 61 62 61 73 65 20 26 26 20 70 54 61 62 6c  atabase && pTabl
147a0 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a  e ){.    Token *
147b0 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73  pTemp = pDatabas
147c0 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  e;.    pDatabase
147d0 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70   = pTable;.    p
147e0 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20  Table = pTemp;. 
147f0 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   }.  pItem->zNam
14800 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
14810 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 29  romToken(pTable)
14820 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  ;.  pItem->zData
14830 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  base = sqlite3Na
14840 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 61 74  meFromToken(pDat
14850 61 62 61 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d  abase);.  pItem-
14860 3e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  >iCursor = -1;. 
14870 20 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a   pList->nSrc++;.
14880 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
14890 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
148a0 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74  cursors to all t
148b0 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69  ables in a SrcLi
148c0 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  st.*/.void sqlit
148d0 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
148e0 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50  ursors(Parse *pP
148f0 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
14900 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
14910 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
14920 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
14930 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
14940 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
14950 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
14960 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  em++){.    if( p
14970 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30  Item->iCursor>=0
14980 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49   ) break;.    pI
14990 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
149a0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
149b0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
149c0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73  elect ){.      s
149d0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
149e0 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
149f0 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  e, pItem->pSelec
14a00 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 7d 0a  t->pSrc);.    }.
14a10 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
14a20 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65   an alias to the
14a30 20 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65 72   last identifier
14a40 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69 64   on the given id
14a50 65 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a  entifier list..*
14a60 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
14a70 63 4c 69 73 74 41 64 64 41 6c 69 61 73 28 53 72  cListAddAlias(Sr
14a80 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  cList *pList, To
14a90 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
14aa0 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69  if( pList && pLi
14ab0 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20  st->nSrc>0 ){.  
14ac0 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74    pList->a[pList
14ad0 2d 3e 6e 53 72 63 2d 31 5d 2e 7a 41 6c 69 61 73  ->nSrc-1].zAlias
14ae0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
14af0 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b  omToken(pToken);
14b00 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
14b10 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a  lete an IdList..
14b20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49  */.void sqlite3I
14b30 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64 4c 69  dListDelete(IdLi
14b40 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
14b50 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
14b60 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
14b70 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
14b80 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
14b90 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
14ba0 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
14bb0 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
14bc0 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71  (pList->a);.  sq
14bd0 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b  liteFree(pList);
14be0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
14bf0 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c   the index in pL
14c00 69 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74  ist of the ident
14c10 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e  ifier named zId.
14c20 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69    Return -1.** i
14c30 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
14c40 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73  int sqlite3IdLis
14c50 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70  tIndex(IdList *p
14c60 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  List, const char
14c70 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
14c80 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
14c90 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  0 ) return -1;. 
14ca0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
14cb0 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
14cc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
14cd0 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
14ce0 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
14cf0 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
14d00 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
14d10 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
14d20 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74  n entire SrcList
14d30 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69   including all i
14d40 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 2e  ts substructure.
14d50 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14d60 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53 72  SrcListDelete(Sr
14d70 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
14d80 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
14d90 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
14da0 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
14db0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
14dc0 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
14dd0 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
14de0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
14df0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
14e00 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 44  teFree(pItem->zD
14e10 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71  atabase);.    sq
14e20 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e  liteFree(pItem->
14e30 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
14e40 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 41  teFree(pItem->zA
14e50 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lias);.    if( p
14e60 49 74 65 6d 2d 3e 70 54 61 62 20 26 26 20 70 49  Item->pTab && pI
14e70 74 65 6d 2d 3e 70 54 61 62 2d 3e 69 73 54 72 61  tem->pTab->isTra
14e80 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  nsient ){.      
14e90 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
14ea0 6c 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70 54 61  le(0, pItem->pTa
14eb0 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  b);.    }.    sq
14ec0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
14ed0 65 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  e(pItem->pSelect
14ee0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
14ef0 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e  prDelete(pItem->
14f00 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pOn);.    sqlite
14f10 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 49  3IdListDelete(pI
14f20 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
14f30 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
14f40 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
14f50 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74  Begin a transact
14f60 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
14f70 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74  te3BeginTransact
14f80 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
14f90 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20  e, int type){.  
14fa0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
14fb0 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b  dbe *v;.  int i;
14fc0 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
14fd0 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
14fe0 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  >db)==0 || db->a
14ff0 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
15000 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
15010 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
15020 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
15030 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
15040 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
15050 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
15060 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
15070 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29  "BEGIN", 0, 0) )
15080 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20   return;..  v = 
15090 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
150a0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76  Parse);.  if( !v
150b0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
150c0 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52   type!=TK_DEFERR
150d0 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ED ){.    for(i=
150e0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
150f0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
15100 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15110 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c  _Transaction, i,
15120 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55   (type==TK_EXCLU
15130 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 7d 0a  SIVE)+1);.    }.
15140 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
15150 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74  eAddOp(v, OP_Aut
15160 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a  oCommit, 0, 0);.
15170 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
15180 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
15190 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
151a0 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  mitTransaction(P
151b0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
151c0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
151d0 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
151e0 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
151f0 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
15200 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
15210 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
15220 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
15230 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
15240 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
15250 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
15260 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
15270 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
15280 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22  ACTION, "COMMIT"
15290 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
152a0 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
152b0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
152c0 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
152d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
152e0 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
152f0 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  t, 1, 0);.  }.}.
15300 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
15310 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
15320 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
15330 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e  lbackTransaction
15340 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
15350 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
15360 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66    Vdbe *v;..  if
15370 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
15380 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
15390 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  0 || db->aDb[0].
153a0 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBt==0 ) return;
153b0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
153c0 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
153d0 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
153e0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
153f0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
15400 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
15410 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42  NSACTION, "ROLLB
15420 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65  ACK", 0, 0) ) re
15430 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  turn;..  v = sql
15440 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
15450 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
15460 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15470 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43  ddOp(v, OP_AutoC
15480 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20  ommit, 1, 1);.  
15490 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
154a0 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61  sure the TEMP da
154b0 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61  tabase is open a
154c0 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  nd available for
154d0 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a   use.  Return.**
154e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
154f0 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e  rrors.  Leave an
15500 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
15510 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
15520 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
15530 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 4f  tic int sqlite3O
15540 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
15550 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
15560 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
15570 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
15580 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  ( db->aDb[1].pBt
15590 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ==0 && !pParse->
155a0 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69  explain ){.    i
155b0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  nt rc = sqlite3B
155c0 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20  treeFactory(db, 
155d0 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c  0, 0, MAX_PAGES,
155e0 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74   &db->aDb[1].pBt
155f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
15600 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15610 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15620 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
15630 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  e to open a temp
15640 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22  orary database "
15650 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66  .        "file f
15660 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f  or storing tempo
15670 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20  rary tables");. 
15680 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
15690 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
156a0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
156b0 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
156c0 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20  !db->autoCommit 
156d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
156e0 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
156f0 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e  rans(db->aDb[1].
15700 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  pBt, 1);.      i
15710 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15720 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
15730 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15740 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67  se, "unable to g
15750 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  et a write lock 
15760 6f 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  on ".          "
15770 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61  the temporary da
15780 74 61 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20  tabase file");. 
15790 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72         pParse->r
157a0 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
157b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
157c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
157d0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
157e0 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
157f0 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65  ode that will ve
15800 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
15810 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74  cookie and start
15820 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73  .** a read-trans
15830 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e  action for all n
15840 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  amed database fi
15850 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  les..**.** It is
15860 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
15870 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  all schema cooki
15880 65 73 20 62 65 20 76 65 72 69 66 69 65 64 20 61  es be verified a
15890 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74  nd all.** read t
158a0 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73  ransactions be s
158b0 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e  tarted before an
158c0 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70  ything else happ
158d0 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44  ens in.** the VD
158e0 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74  BE program.  But
158f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
15900 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  n be called afte
15910 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20  r much other.** 
15920 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67 65  code has been ge
15930 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72  nerated.  So her
15940 65 20 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a  e is what we do:
15950 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
15960 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
15970 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65  ne is called, we
15980 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f   code an OP_Goto
15990 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75   that.** will ju
159a0 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69  mp to a subrouti
159b0 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ne at the end of
159c0 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54   the program.  T
159d0 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64  hen we.** record
159e0 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20   every database 
159f0 74 68 61 74 20 6e 65 65 64 73 20 69 74 73 20 73  that needs its s
15a00 63 68 65 6d 61 20 76 65 72 69 66 69 65 64 20 69  chema verified i
15a10 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d  n the.** pParse-
15a20 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c  >cookieMask fiel
15a30 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72  d.  Later, after
15a40 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20   all other code 
15a50 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65  has been.** gene
15a60 72 61 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f  rated, the subro
15a70 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20  utine that does 
15a80 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  the cookie verif
15a90 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  ications and.** 
15aa0 73 74 61 72 74 73 20 74 68 65 20 74 72 61 6e 73  starts the trans
15ab0 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20  actions will be 
15ac0 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50  coded and the OP
15ad0 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a  _Goto P2 value.*
15ae0 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  * will be made t
15af0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20  o point to that 
15b00 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  subroutine.  The
15b10 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74   generation of t
15b20 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72  he.** cookie ver
15b30 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75  ification subrou
15b40 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e  tine code happen
15b50 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69  s in sqlite3Fini
15b60 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a  shCoding()..**.*
15b70 2a 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20  * If iDb<0 then 
15b80 63 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f  code the OP_Goto
15b90 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65   only - don't se
15ba0 74 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79  t flag to verify
15bb0 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f   the.** schema o
15bc0 6e 20 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e  n any databases.
15bd0 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
15be0 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74  ed to position t
15bf0 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61  he OP_Goto.** ea
15c00 72 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c  rly in the code,
15c10 20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20   before we know 
15c20 69 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  if any database 
15c30 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75  tables will be u
15c40 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
15c50 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
15c60 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
15c70 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
15c80 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
15c90 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61  dbe *v;.  int ma
15ca0 73 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  sk;..  v = sqlit
15cb0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
15cc0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
15cd0 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73  return;  /* This
15ce0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66   only happens if
15cf0 20 74 68 65 72 65 20 77 61 73 20 61 20 70 72 69   there was a pri
15d00 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62  or error */.  db
15d10 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
15d20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f   if( pParse->coo
15d30 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20  kieGoto==0 ){.  
15d40 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
15d50 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64  Goto = sqlite3Vd
15d60 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
15d70 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d  to, 0, 0)+1;.  }
15d80 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b  .  if( iDb>=0 ){
15d90 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62  .    assert( iDb
15da0 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  <db->nDb );.    
15db0 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
15dc0 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69  iDb].pBt!=0 || i
15dd0 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  Db==1 );.    ass
15de0 65 72 74 28 20 69 44 62 3c 33 32 20 29 3b 0a 20  ert( iDb<32 );. 
15df0 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62     mask = 1<<iDb
15e00 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 72 73  ;.    if( (pPars
15e10 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20  e->cookieMask & 
15e20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
15e30 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
15e40 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
15e50 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
15e60 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64  ieValue[iDb] = d
15e70 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65  b->aDb[iDb].sche
15e80 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20  ma_cookie;.     
15e90 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20   if( iDb==1 ){. 
15ea0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70         sqlite3Op
15eb0 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70  enTempDatabase(p
15ec0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
15ed0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
15ee0 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
15ef0 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61   code that prepa
15f00 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e  res for doing an
15f10 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a   operation that.
15f20 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
15f30 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
15f40 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15f50 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72   starts a new tr
15f60 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20  ansaction if we 
15f70 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  are not already 
15f80 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e  within.** a tran
15f90 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20  saction.  If we 
15fa0 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68  are already with
15fb0 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
15fc0 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f  , then a checkpo
15fd0 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66  int.** is set if
15fe0 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e   the setStatemen
15ff0 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
16000 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69  rue.  A checkpoi
16010 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nt should.** be 
16020 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f  set for operatio
16030 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61  ns that might fa
16040 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e  il (due to a con
16050 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66  straint) part of
16060 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f  .** the way thro
16070 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69  ugh and which wi
16080 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20  ll need to undo 
16090 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68  some writes with
160a0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a  out having to.**
160b0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68   rollback the wh
160c0 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ole transaction.
160d0 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73    For operations
160e0 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74   where all const
160f0 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65  raints.** can be
16100 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20   checked before 
16110 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20  any changes are 
16120 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
16130 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65  base, it is neve
16140 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74  r.** necessary t
16150 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61  o undo a write a
16160 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  nd the checkpoin
16170 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
16180 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  set..**.** Only 
16190 64 61 74 61 62 61 73 65 20 69 44 62 20 61 6e 64  database iDb and
161a0 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
161b0 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74  se are made writ
161c0 61 62 6c 65 20 62 79 20 74 68 69 73 20 63 61 6c  able by this cal
161d0 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c  l..** If iDb==0,
161e0 20 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 61   then the main a
161f0 6e 64 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  nd temp database
16200 73 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  s are made writa
16210 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62  ble.   If.** iDb
16220 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  ==1 then only th
16230 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
16240 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  is made writable
16250 2e 20 20 49 66 20 69 44 62 3e 31 20 74 68 65 6e  .  If iDb>1 then
16260 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65   the.** specifie
16270 64 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  d auxiliary data
16280 62 61 73 65 20 61 6e 64 20 74 68 65 20 74 65 6d  base and the tem
16290 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d  p database are m
162a0 61 64 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  ade writable..*/
162b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
162c0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
162d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
162e0 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74  int setStatement
162f0 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
16300 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
16310 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
16320 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
16330 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  urn;.  sqlite3Co
16340 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
16350 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70  Parse, iDb);.  p
16360 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
16370 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66   |= 1<<iDb;.  if
16380 28 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 26  ( setStatement &
16390 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  & pParse->nested
163a0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
163b0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
163c0 50 5f 53 74 61 74 65 6d 65 6e 74 2c 20 69 44 62  P_Statement, iDb
163d0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
163e0 69 44 62 21 3d 31 20 26 26 20 70 50 61 72 73 65  iDb!=1 && pParse
163f0 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  ->db->aDb[1].pBt
16400 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
16410 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
16420 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 73 65  ation(pParse, se
16430 74 53 74 61 74 65 6d 65 6e 74 2c 20 31 29 3b 0a  tStatement, 1);.
16440 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
16450 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
16460 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ./* .** Return t
16470 68 65 20 74 72 61 6e 73 69 65 6e 74 20 73 71 6c  he transient sql
16480 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63  ite3_value objec
16490 74 20 75 73 65 64 20 66 6f 72 20 65 6e 63 6f 64  t used for encod
164a0 69 6e 67 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a  ing conversions.
164b0 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 20 63 6f  ** during SQL co
164c0 6d 70 69 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 71  mpilation..*/.sq
164d0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c  lite3_value *sql
164e0 69 74 65 33 47 65 74 54 72 61 6e 73 69 65 6e 74  ite3GetTransient
164f0 56 61 6c 75 65 28 73 71 6c 69 74 65 33 20 2a 64  Value(sqlite3 *d
16500 62 29 7b 0a 20 20 69 66 28 20 21 64 62 2d 3e 70  b){.  if( !db->p
16510 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 64 62 2d  Value ){.    db-
16520 3e 70 56 61 6c 75 65 20 3d 20 73 71 6c 69 74 65  >pValue = sqlite
16530 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a 20 20 7d  3ValueNew();.  }
16540 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 70 56  .  return db->pV
16550 61 6c 75 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  alue;.}.#endif..
16560 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
16570 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65  ee if pIndex use
16580 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  s the collating 
16590 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20  sequence pColl. 
165a0 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20   Return.** true 
165b0 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66  if it does and f
165c0 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20  alse if it does 
165d0 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  not..*/.#ifndef 
165e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
165f0 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63  DEX.static int c
16600 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 43 6f  ollationMatch(Co
16610 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 20 49 6e  llSeq *pColl, In
16620 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20  dex *pIndex){.  
16630 69 6e 74 20 6e 20 3d 20 70 49 6e 64 65 78 2d 3e  int n = pIndex->
16640 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 3b 0a  keyInfo.nField;.
16650 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 70 70 20 3d    CollSeq **pp =
16660 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f   pIndex->keyInfo
16670 2e 61 43 6f 6c 6c 3b 0a 20 20 77 68 69 6c 65 28  .aColl;.  while(
16680 20 6e 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28 20   n-- ){.    if( 
16690 2a 70 70 3d 3d 70 43 6f 6c 6c 20 29 20 72 65 74  *pp==pColl ) ret
166a0 75 72 6e 20 31 3b 0a 20 20 20 20 70 70 2b 2b 3b  urn 1;.    pp++;
166b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
166c0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
166d0 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
166e0 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74  ndices of pTab t
166f0 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  hat use the coll
16700 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
16710 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c  Coll..** If pCol
16720 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
16730 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
16740 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e  of pTab..*/.#ifn
16750 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16760 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 72 65 69  REINDEX.void rei
16770 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20  ndexTable(Parse 
16780 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
16790 70 54 61 62 2c 20 43 6f 6c 6c 53 65 71 20 2a 70  pTab, CollSeq *p
167a0 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a  Coll){.  Index *
167b0 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  pIndex;         
167c0 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
167d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
167e0 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28   pTab */..  for(
167f0 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e  pIndex=pTab->pIn
16800 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e  dex; pIndex; pIn
16810 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78  dex=pIndex->pNex
16820 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  t){.    if( pCol
16830 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f  l==0 || collatio
16840 6e 4d 61 74 63 68 28 70 43 6f 6c 6c 2c 70 49 6e  nMatch(pColl,pIn
16850 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 73 71  dex) ){.      sq
16860 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
16870 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
16880 20 30 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a   0, pTab->iDb);.
16890 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66        sqlite3Ref
168a0 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
168b0 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
168c0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
168d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
168e0 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
168f0 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61   all tables in a
16900 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65  ll databases whe
16910 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65  re the.** indice
16920 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  s use the collat
16930 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
16940 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ll.  If pColl==0
16950 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a   then recompute.
16960 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65  ** all indices e
16970 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69  verywhere..*/.#i
16980 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16990 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 72  T_REINDEX.void r
169a0 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
169b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 43  Parse *pParse, C
169c0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a  ollSeq *pColl){.
169d0 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
169e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
169f0 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   A single databa
16a00 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  se */.  int iDb;
16a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
16a30 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
16a40 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
16a50 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
16a60 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
16a70 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
16a80 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20    HashElem *k;  
16a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16aa0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
16ab0 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20  r tables in pDb 
16ac0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
16ad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16ae0 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
16af0 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a  he database */..
16b00 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62    for(iDb=0, pDb
16b10 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62  =db->aDb; iDb<db
16b20 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44  ->nDb; iDb++, pD
16b30 62 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 44  b++){.    if( pD
16b40 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==0 ) continue;
16b50 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c  .      for(k=sql
16b60 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44  iteHashFirst(&pD
16b70 62 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b  b->tblHash);  k;
16b80 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   k=sqliteHashNex
16b90 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61  t(k)){.      pTa
16ba0 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69  b = (Table*)sqli
16bb0 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20  teHashData(k);. 
16bc0 20 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c       reindexTabl
16bd0 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
16be0 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  pColl);.    }.  
16bf0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
16c00 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
16c10 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20  for the REINDEX 
16c20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20  command..**.**  
16c30 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20        REINDEX   
16c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c50 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a           -- 1.**
16c60 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
16c70 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20   <collation>    
16c80 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a             -- 2.
16c90 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
16ca0 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
16cb0 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20  <tablename>  -- 
16cc0 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  3.**        REIN
16cd0 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
16ce0 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d  .?<indexname>  -
16cf0 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31  - 4.**.** Form 1
16d00 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69   causes all indi
16d10 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63  ces in all attac
16d20 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f  hed databases to
16d30 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20   be rebuilt..** 
16d40 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20  Form 2 rebuilds 
16d50 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
16d60 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61  ll databases tha
16d70 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a  t use the named.
16d80 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  ** collating fun
16d90 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20  ction.  Forms 3 
16da0 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68  and 4 rebuild th
16db0 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72  e named index or
16dc0 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20   all.** indices 
16dd0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
16de0 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e  the named table.
16df0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
16e00 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
16e10 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e  void sqlite3Rein
16e20 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
16e30 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  e, Token *pName1
16e40 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29  , Token *pName2)
16e50 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
16e60 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
16e70 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
16e80 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e  uence to be rein
16e90 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a  dexed, or NULL *
16ea0 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
16eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ec0 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62  /* Name of a tab
16ed0 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  le or index */. 
16ee0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
16ef0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16f00 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
16f10 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  base */.  Table 
16f20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
16f30 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
16f40 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
16f50 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
16f60 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
16f70 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
16f80 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
16f90 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  ab */.  int iDb;
16fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fb0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
16fc0 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
16fd0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
16fe0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
16ff0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
17000 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
17010 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d    Token *pObjNam
17020 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
17030 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
17040 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62  le or index to b
17050 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a  e reindexed */..
17060 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20    if( pName1==0 
17070 7c 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30 20  || pName1->z==0 
17080 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61  ){.    reindexDa
17090 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20  tabases(pParse, 
170a0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  0);.    return;.
170b0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d    }else if( pNam
170c0 65 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 32 2d  e2==0 || pName2-
170d0 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f  >z==0 ){.    pCo
170e0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
170f0 43 6f 6c 6c 53 65 71 28 64 62 2c 20 64 62 2d 3e  CollSeq(db, db->
17100 65 6e 63 2c 20 70 4e 61 6d 65 31 2d 3e 7a 2c 20  enc, pName1->z, 
17110 70 4e 61 6d 65 31 2d 3e 6e 2c 20 30 29 3b 0a 20  pName1->n, 0);. 
17120 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
17130 20 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74        reindexDat
17140 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 70  abases(pParse, p
17150 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74  Coll);.      ret
17160 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  urn;.    }.  }. 
17170 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
17180 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
17190 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
171a0 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  , &pObjName);.  
171b0 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
171c0 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  rn;.  z = sqlite
171d0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
171e0 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 7a 44 62 20  ObjName);.  zDb 
171f0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
17200 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73  Name;.  pTab = s
17210 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
17220 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69  db, z, zDb);.  i
17230 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72  f( pTab ){.    r
17240 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72  eindexTable(pPar
17250 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20  se, pTab, 0);.  
17260 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
17270 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
17280 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
17290 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
172a0 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69   z, zDb);.  sqli
172b0 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 69 66 28  teFree(z);.  if(
172c0 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73   pIndex ){.    s
172d0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
172e0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
172f0 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 0, iDb);.    s
17300 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
17310 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
17320 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72  , -1);.    retur
17330 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
17340 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
17350 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e   "unable to iden
17360 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20  tify the object 
17370 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 22  to be reindexed"
17380 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
17390 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
173a0 5f 41 4c 54 45 52 54 41 42 4c 45 0a 2f 2a 0a 2a  _ALTERTABLE./*.*
173b0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
173c0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
173d0 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 78 78   "ALTER TABLE xx
173e0 78 20 52 45 4e 41 4d 45 20 54 4f 20 79 79 79 22  x RENAME TO yyy"
173f0 20 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a   .** command. .*
17400 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 6c  /.void sqlite3Al
17410 74 65 72 52 65 6e 61 6d 65 54 61 62 6c 65 28 0a  terRenameTable(.
17420 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
17430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
17440 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 2a  arser context. *
17450 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
17460 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
17470 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 72 65   The table to re
17480 6e 61 6d 65 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  name. */.  Token
17490 20 2a 70 4e 61 6d 65 20 20 20 20 20 20 20 20 20   *pName         
174a0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
174b0 74 61 62 6c 65 20 6e 61 6d 65 2e 20 2a 2f 0a 29  table name. */.)
174c0 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  {.  int iDb;    
174d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
174e0 20 44 61 74 61 62 61 73 65 20 74 68 61 74 20 63   Database that c
174f0 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c  ontains the tabl
17500 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62  e */.  char *zDb
17510 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17520 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74 61   /* Name of data
17530 62 61 73 65 20 69 44 62 20 2a 2f 0a 20 20 54 61  base iDb */.  Ta
17540 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
17550 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
17560 20 62 65 69 6e 67 20 72 65 6e 61 6d 65 64 20 2a   being renamed *
17570 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  /.  char *zName 
17580 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
17590 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61 74 65 64   NULL-terminated
175a0 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 4e 61 6d   version of pNam
175b0 65 20 2a 2f 20 0a 20 20 63 68 61 72 20 2a 7a 57  e */ .  char *zW
175c0 68 65 72 65 20 3d 20 30 3b 20 20 20 20 20 20 20  here = 0;       
175d0 20 20 2f 2a 20 57 68 65 72 65 20 63 6c 61 75 73    /* Where claus
175e0 65 20 6f 66 20 73 63 68 65 6d 61 20 65 6c 65 6d  e of schema elem
175f0 65 6e 74 73 20 74 6f 20 72 65 70 61 72 73 65 20  ents to reparse 
17600 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
17610 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f   = pParse->db; /
17620 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
17630 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20  ction */.  Vdbe 
17640 2a 76 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  *v;.#ifndef SQLI
17650 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
17660 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 54 72 69    char *zTempTri
17670 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57  g = 0;      /* W
17680 68 65 72 65 20 63 6c 61 75 73 65 20 74 6f 20 6c  here clause to l
17690 6f 63 61 74 65 20 74 65 6d 70 20 74 72 69 67 67  ocate temp trigg
176a0 65 72 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ers */.#endif.  
176b0 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d  .  assert( pSrc-
176c0 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 0a 20 20 70  >nSrc==1 );..  p
176d0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
176e0 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
176f0 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d   pSrc->a[0].zNam
17700 65 2c 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 7a 44  e, pSrc->a[0].zD
17710 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20  atabase);.  if( 
17720 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69  !pTab ) goto exi
17730 74 5f 61 6c 74 65 72 5f 74 61 62 6c 65 3b 0a 20  t_alter_table;. 
17740 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62   iDb = pTab->iDb
17750 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  zDb = db->aD
17760 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20  b[iDb].zName;.. 
17770 20 2f 2a 20 47 65 74 20 61 20 4e 55 4c 4c 20 74   /* Get a NULL t
17780 65 72 6d 69 6e 61 74 65 64 20 76 65 72 73 69 6f  erminated versio
17790 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  n of the new tab
177a0 6c 65 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a 4e  le name. */.  zN
177b0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
177c0 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
177d0 29 3b 0a 20 20 69 66 28 20 21 7a 4e 61 6d 65 20  );.  if( !zName 
177e0 29 20 67 6f 74 6f 20 65 78 69 74 5f 61 6c 74 65  ) goto exit_alte
177f0 72 5f 74 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 43  r_table;..  /* C
17800 68 65 63 6b 20 74 68 61 74 20 61 20 74 61 62 6c  heck that a tabl
17810 65 20 6f 72 20 69 6e 64 65 78 20 6e 61 6d 65 64  e or index named
17820 20 27 7a 4e 61 6d 65 27 20 64 6f 65 73 20 6e 6f   'zName' does no
17830 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 0a  t already exist.
17840 20 20 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65    ** in database
17850 20 69 44 62 2e 20 49 66 20 73 6f 2c 20 74 68 69   iDb. If so, thi
17860 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a 20  s is an error.. 
17870 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
17880 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
17890 4e 61 6d 65 2c 20 7a 44 62 29 20 7c 7c 20 73 71  Name, zDb) || sq
178a0 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
178b0 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b, zName, zDb) )
178c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
178d0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
178e0 20 20 20 20 20 20 20 22 74 68 65 72 65 20 69 73         "there is
178f0 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72   already another
17900 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
17910 77 69 74 68 20 74 68 69 73 20 6e 61 6d 65 3a 20  with this name: 
17920 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
17930 20 67 6f 74 6f 20 65 78 69 74 5f 61 6c 74 65 72   goto exit_alter
17940 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _table;.  }..  /
17950 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69  * Make sure it i
17960 73 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 74  s not a system t
17970 61 62 6c 65 20 62 65 69 6e 67 20 61 6c 74 65 72  able being alter
17980 65 64 2c 20 6f 72 20 61 20 72 65 73 65 72 76 65  ed, or a reserve
17990 64 20 6e 61 6d 65 0a 20 20 2a 2a 20 74 68 61 74  d name.  ** that
179a0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 62 65   the table is be
179b0 69 6e 67 20 72 65 6e 61 6d 65 64 20 74 6f 2e 0a  ing renamed to..
179c0 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 72 6c 65    */.  if( strle
179d0 6e 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3e 36  n(pTab->zName)>6
179e0 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
179f0 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
17a00 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
17a10 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
17a20 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
17a30 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
17a40 6f 74 20 62 65 20 61 6c 74 65 72 65 64 22 2c 20  ot be altered", 
17a50 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
17a60 20 20 67 6f 74 6f 20 65 78 69 74 5f 61 6c 74 65    goto exit_alte
17a70 72 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  r_table;.  }.  i
17a80 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
17a90 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74  lite3CheckObject
17aa0 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61  Name(pParse, zNa
17ab0 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  me) ){.    goto 
17ac0 65 78 69 74 5f 61 6c 74 65 72 5f 74 61 62 6c 65  exit_alter_table
17ad0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
17ae0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
17af0 52 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 6e  RIZATION.  /* In
17b00 76 6f 6b 65 20 74 68 65 20 61 75 74 68 6f 72 69  voke the authori
17b10 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 2e  zation callback.
17b20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
17b30 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
17b40 65 2c 20 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f  e, SQLITE_ALTER_
17b50 54 41 42 4c 45 2c 20 7a 44 62 2c 20 70 54 61 62  TABLE, zDb, pTab
17b60 2d 3e 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20  ->zName, 0) ){. 
17b70 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 61 6c 74     goto exit_alt
17b80 65 72 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  er_table;.  }.#e
17b90 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  ndif..  /* Begin
17ba0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61   a transaction a
17bb0 6e 64 20 63 6f 64 65 20 74 68 65 20 56 65 72 69  nd code the Veri
17bc0 66 79 43 6f 6f 6b 69 65 20 66 6f 72 20 64 61 74  fyCookie for dat
17bd0 61 62 61 73 65 20 69 44 62 2e 20 0a 20 20 2a 2a  abase iDb. .  **
17be0 20 54 68 65 6e 20 6d 6f 64 69 66 79 20 74 68 65   Then modify the
17bf0 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 28   schema cookie (
17c00 73 69 6e 63 65 20 74 68 65 20 41 4c 54 45 52 20  since the ALTER 
17c10 54 41 42 4c 45 20 6d 6f 64 69 66 69 65 73 20 74  TABLE modifies t
17c20 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 29 2e  he.  ** schema).
17c30 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
17c40 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
17c50 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
17c60 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
17c70 61 6c 74 65 72 5f 74 61 62 6c 65 3b 0a 20 20 7d  alter_table;.  }
17c80 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  .  sqlite3BeginW
17c90 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
17ca0 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
17cb0 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
17cc0 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29  okie(db, v, iDb)
17cd0 3b 0a 0a 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74  ;..  /* Modify t
17ce0 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
17cf0 20 74 61 62 6c 65 20 74 6f 20 75 73 65 20 74 68   table to use th
17d00 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  e new table name
17d10 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65  . */.  sqlite3Ne
17d20 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
17d30 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20  ,.      "UPDATE 
17d40 25 51 2e 25 73 20 53 45 54 20 22 0a 23 69 66 64  %Q.%s SET ".#ifd
17d50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
17d60 52 49 47 47 45 52 0a 20 20 20 20 20 20 20 20 20  RIGGER.         
17d70 20 22 73 71 6c 20 3d 20 73 71 6c 69 74 65 5f 61   "sql = sqlite_a
17d80 6c 74 65 72 5f 74 61 62 6c 65 28 73 71 6c 2c 20  lter_table(sql, 
17d90 25 51 29 2c 20 22 0a 23 65 6c 73 65 0a 20 20 20  %Q), ".#else.   
17da0 20 20 20 20 20 20 20 22 73 71 6c 20 3d 20 43 41         "sql = CA
17db0 53 45 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  SE ".           
17dc0 20 22 57 48 45 4e 20 74 79 70 65 20 3d 20 27 74   "WHEN type = 't
17dd0 72 69 67 67 65 72 27 20 54 48 45 4e 20 73 71 6c  rigger' THEN sql
17de0 69 74 65 5f 61 6c 74 65 72 5f 74 72 69 67 67 65  ite_alter_trigge
17df0 72 28 73 71 6c 2c 20 25 51 29 22 0a 20 20 20 20  r(sql, %Q)".    
17e00 20 20 20 20 20 20 20 20 22 45 4c 53 45 20 73 71          "ELSE sq
17e10 6c 69 74 65 5f 61 6c 74 65 72 5f 74 61 62 6c 65  lite_alter_table
17e20 28 73 71 6c 2c 20 25 51 29 20 45 4e 44 2c 20 22  (sql, %Q) END, "
17e30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
17e40 20 20 22 74 62 6c 5f 6e 61 6d 65 20 3d 20 25 51    "tbl_name = %Q
17e50 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 6e  , ".          "n
17e60 61 6d 65 20 3d 20 43 41 53 45 20 22 0a 20 20 20  ame = CASE ".   
17e70 20 20 20 20 20 20 20 20 20 22 57 48 45 4e 20 74           "WHEN t
17e80 79 70 65 3d 27 74 61 62 6c 65 27 20 54 48 45 4e  ype='table' THEN
17e90 20 25 51 20 22 0a 20 20 20 20 20 20 20 20 20 20   %Q ".          
17ea0 20 20 22 57 48 45 4e 20 6e 61 6d 65 20 4c 49 4b    "WHEN name LIK
17eb0 45 20 27 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  E 'sqlite_autoin
17ec0 64 65 78 25 25 27 20 41 4e 44 20 74 79 70 65 3d  dex%%' AND type=
17ed0 27 69 6e 64 65 78 27 20 54 48 45 4e 20 22 0a 20  'index' THEN ". 
17ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 27 73               "'s
17ef0 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
17f00 27 20 7c 7c 20 25 51 20 7c 7c 20 73 75 62 73 74  ' || %Q || subst
17f10 72 28 6e 61 6d 65 2c 20 25 64 2b 31 38 2c 31 30  r(name, %d+18,10
17f20 29 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) ".            
17f30 22 45 4c 53 45 20 6e 61 6d 65 20 45 4e 44 20 22  "ELSE name END "
17f40 0a 20 20 20 20 20 20 22 57 48 45 52 45 20 74 62  .      "WHERE tb
17f50 6c 5f 6e 61 6d 65 3d 25 51 20 41 4e 44 20 22 0a  l_name=%Q AND ".
17f60 20 20 20 20 20 20 20 20 20 20 22 28 74 79 70 65            "(type
17f70 3d 27 74 61 62 6c 65 27 20 4f 52 20 74 79 70 65  ='table' OR type
17f80 3d 27 69 6e 64 65 78 27 20 4f 52 20 74 79 70 65  ='index' OR type
17f90 3d 27 74 72 69 67 67 65 72 27 29 3b 22 2c 20 0a  ='trigger');", .
17fa0 20 20 20 20 20 20 7a 44 62 2c 20 53 43 48 45 4d        zDb, SCHEM
17fb0 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 7a 4e  A_TABLE(iDb), zN
17fc0 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  ame, zName, zNam
17fd0 65 2c 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e, .#ifndef SQLI
17fe0 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
17ff0 7a 4e 61 6d 65 2c 0a 23 65 6e 64 69 66 0a 20 20  zName,.#endif.  
18000 20 20 20 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65      zName, strle
18010 6e 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 2c 20  n(pTab->zName), 
18020 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 29 3b  pTab->zName.  );
18030 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
18040 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
18050 45 4e 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  ENT.  /* If the 
18060 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
18070 74 61 62 6c 65 20 65 78 69 73 74 73 20 69 6e 20  table exists in 
18080 74 68 69 73 20 64 61 74 61 62 61 73 65 2c 20 74  this database, t
18090 68 65 6e 20 75 70 64 61 74 65 20 0a 20 20 2a 2a  hen update .  **
180a0 20 69 74 20 77 69 74 68 20 74 68 65 20 6e 65 77   it with the new
180b0 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 20 20 2a   table name..  *
180c0 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  /.  if( sqlite3F
180d0 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71  indTable(db, "sq
180e0 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 2c 20  lite_sequence", 
180f0 7a 44 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  zDb) ){.    sqli
18100 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
18110 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
18120 55 50 44 41 54 45 20 25 51 2e 73 71 6c 69 74 65  UPDATE %Q.sqlite
18130 5f 73 65 71 75 65 6e 63 65 20 73 65 74 20 6e 61  _sequence set na
18140 6d 65 20 3d 20 25 51 20 57 48 45 52 45 20 6e 61  me = %Q WHERE na
18150 6d 65 20 3d 20 25 51 22 2c 0a 20 20 20 20 20 20  me = %Q",.      
18160 20 20 7a 44 62 2c 20 7a 4e 61 6d 65 2c 20 70 54    zDb, zName, pT
18170 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  ab->zName);.  }.
18180 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
18190 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
181a0 47 45 52 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  GER.  /* If ther
181b0 65 20 61 72 65 20 54 45 4d 50 20 74 72 69 67 67  e are TEMP trigg
181c0 65 72 73 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  ers on this tabl
181d0 65 2c 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71  e, modify the sq
181e0 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
181f0 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 44 6f 6e  .  ** table. Don
18200 27 74 20 64 6f 20 74 68 69 73 20 69 66 20 74 68  't do this if th
18210 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 41 4c  e table being AL
18220 54 45 52 65 64 20 69 73 20 69 74 73 65 6c 66 20  TERed is itself 
18230 6c 6f 63 61 74 65 64 20 69 6e 0a 20 20 2a 2a 20  located in.  ** 
18240 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
18250 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44  e..  */.  if( iD
18260 62 21 3d 31 20 29 7b 0a 20 20 20 20 54 72 69 67  b!=1 ){.    Trig
18270 67 65 72 20 2a 70 54 72 69 67 3b 0a 20 20 20 20  ger *pTrig;.    
18280 63 68 61 72 20 2a 74 6d 70 20 3d 20 30 3b 0a 20  char *tmp = 0;. 
18290 20 20 20 66 6f 72 28 20 70 54 72 69 67 3d 70 54     for( pTrig=pT
182a0 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 20 70 54  ab->pTrigger; pT
182b0 72 69 67 3b 20 70 54 72 69 67 3d 70 54 72 69 67  rig; pTrig=pTrig
182c0 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
182d0 20 69 66 28 20 70 54 72 69 67 2d 3e 69 44 62 3d   if( pTrig->iDb=
182e0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =1 ){.        if
182f0 28 20 21 7a 54 65 6d 70 54 72 69 67 20 29 7b 0a  ( !zTempTrig ){.
18300 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 54            zTempT
18310 72 69 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20  rig = .         
18320 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
18330 6e 74 66 28 22 74 79 70 65 20 3d 20 27 74 72 69  ntf("type = 'tri
18340 67 67 65 72 27 20 41 4e 44 20 28 6e 61 6d 65 3d  gger' AND (name=
18350 25 51 22 2c 20 70 54 72 69 67 2d 3e 6e 61 6d 65  %Q", pTrig->name
18360 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
18370 7b 0a 20 20 20 20 20 20 20 20 20 20 74 6d 70 20  {.          tmp 
18380 3d 20 7a 54 65 6d 70 54 72 69 67 3b 0a 20 20 20  = zTempTrig;.   
18390 20 20 20 20 20 20 20 7a 54 65 6d 70 54 72 69 67         zTempTrig
183a0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
183b0 66 28 22 25 73 20 4f 52 20 6e 61 6d 65 3d 25 51  f("%s OR name=%Q
183c0 22 2c 20 7a 54 65 6d 70 54 72 69 67 2c 20 70 54  ", zTempTrig, pT
183d0 72 69 67 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  rig->name);.    
183e0 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
183f0 28 74 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  (tmp);.        }
18400 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18410 20 20 20 69 66 28 20 7a 54 65 6d 70 54 72 69 67     if( zTempTrig
18420 20 29 7b 0a 20 20 20 20 20 20 74 6d 70 20 3d 20   ){.      tmp = 
18430 7a 54 65 6d 70 54 72 69 67 3b 0a 20 20 20 20 20  zTempTrig;.     
18440 20 7a 54 65 6d 70 54 72 69 67 20 3d 20 73 71 6c   zTempTrig = sql
18450 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 73 29  ite3MPrintf("%s)
18460 22 2c 20 7a 54 65 6d 70 54 72 69 67 29 3b 0a 20  ", zTempTrig);. 
18470 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
18480 74 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tmp);.      sqli
18490 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
184a0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
184b0 20 20 22 55 50 44 41 54 45 20 73 71 6c 69 74 65    "UPDATE sqlite
184c0 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 53 45 54  _temp_master SET
184d0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
184e0 20 22 73 71 6c 20 3d 20 73 71 6c 69 74 65 5f 61   "sql = sqlite_a
184f0 6c 74 65 72 5f 74 72 69 67 67 65 72 28 73 71 6c  lter_trigger(sql
18500 2c 20 25 51 29 2c 20 22 0a 20 20 20 20 20 20 20  , %Q), ".       
18510 20 20 20 20 20 20 20 22 74 62 6c 5f 6e 61 6d 65         "tbl_name
18520 20 3d 20 25 51 20 22 0a 20 20 20 20 20 20 20 20   = %Q ".        
18530 20 20 20 20 20 20 22 57 48 45 52 45 20 25 73 3b        "WHERE %s;
18540 22 2c 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  ", zName, zName,
18550 20 7a 54 65 6d 70 54 72 69 67 29 3b 0a 20 20 20   zTempTrig);.   
18560 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
18570 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 65 6c 65   /* Drop the ele
18580 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d  ments of the in-
18590 6d 65 6d 6f 72 79 20 73 63 68 65 6d 61 20 74 68  memory schema th
185a0 61 74 20 72 65 66 65 72 65 64 20 74 6f 20 74 68  at refered to th
185b0 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 72 65 6e  e table.  ** ren
185c0 61 6d 65 64 20 61 6e 64 20 6c 6f 61 64 20 74 68  amed and load th
185d0 65 20 6e 65 77 20 76 65 72 73 69 6f 6e 73 20 66  e new versions f
185e0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
185f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
18600 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
18610 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18620 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20  MIT_TRIGGER.    
18630 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 3b 0a  Trigger *pTrig;.
18640 20 20 20 20 66 6f 72 28 20 70 54 72 69 67 3d 70      for( pTrig=p
18650 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 20 70  Tab->pTrigger; p
18660 54 72 69 67 3b 20 70 54 72 69 67 3d 70 54 72 69  Trig; pTrig=pTri
18670 67 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  g->pNext ){.    
18680 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 2d    assert( pTrig-
18690 3e 69 44 62 3d 3d 69 44 62 20 7c 7c 20 70 54 72  >iDb==iDb || pTr
186a0 69 67 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20  ig->iDb==1 );.  
186b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
186c0 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 54 72 69  p3(v, OP_DropTri
186d0 67 67 65 72 2c 20 70 54 72 69 67 2d 3e 69 44 62  gger, pTrig->iDb
186e0 2c 20 30 2c 20 70 54 72 69 67 2d 3e 6e 61 6d 65  , 0, pTrig->name
186f0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , 0);.    }.#end
18700 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  if.    sqlite3Vd
18710 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70  beOp3(v, OP_Drop
18720 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 70  Table, iDb, 0, p
18730 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
18740 20 20 20 20 7a 57 68 65 72 65 20 3d 20 73 71 6c      zWhere = sql
18750 69 74 65 33 4d 50 72 69 6e 74 66 28 22 74 62 6c  ite3MPrintf("tbl
18760 5f 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65  _name=%Q", zName
18770 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
18780 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73  beOp3(v, OP_Pars
18790 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
187a0 20 7a 57 68 65 72 65 2c 20 50 33 5f 44 59 4e 41   zWhere, P3_DYNA
187b0 4d 49 43 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  MIC);.#ifndef SQ
187c0 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
187d0 52 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 54  R.    if( zTempT
187e0 72 69 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  rig ){.      sql
187f0 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
18800 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 31  P_ParseSchema, 1
18810 2c 20 30 2c 20 7a 54 65 6d 70 54 72 69 67 2c 20  , 0, zTempTrig, 
18820 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P3_DYNAMIC);.   
18830 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
18840 73 71 6c 69 74 65 46 72 65 65 28 7a 54 65 6d 70  sqliteFree(zTemp
18850 54 72 69 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Trig);.#endif.  
18860 7d 0a 0a 65 78 69 74 5f 61 6c 74 65 72 5f 74 61  }..exit_alter_ta
18870 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72  ble:.  sqlite3Sr
18880 63 4c 69 73 74 44 65 6c 65 74 65 28 70 53 72 63  cListDelete(pSrc
18890 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
188a0 7a 4e 61 6d 65 29 3b 0a 7d 0a 23 65 6e 64 69 66  zName);.}.#endif
188b0 0a                                               .