/ Hex Artifact Content
Login

Artifact 306e49e1f6f19741a40c1bbc23140027aa4f8cc9:


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 38 39 20 32 30 30 34 2f 31 32 2f 30 37  1.289 2004/12/07
02f0: 20 31 32 3a 32 39 3a 31 38 20 64 72 68 20 45 78   12:29:18 drh Ex
0300: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0310: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0320: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
0330: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
0340: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
0350: 68 65 6e 20 61 20 6e 65 77 20 53 51 4c 20 73 74  hen a new SQL st
0360: 61 74 65 6d 65 6e 74 20 69 73 20 62 65 67 69 6e  atement is begin
0370: 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61  ning to.** be pa
0380: 72 73 65 64 2e 20 20 43 68 65 63 6b 20 74 6f 20  rsed.  Check to 
0390: 73 65 65 20 69 66 20 74 68 65 20 73 63 68 65 6d  see if the schem
03a0: 61 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  a for the databa
03b0: 73 65 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62  se needs.** to b
03c0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
03d0: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 61 6e  SQLITE_MASTER an
03e0: 64 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 4d 41  d SQLITE_TEMP_MA
03f0: 53 54 45 52 20 74 61 62 6c 65 73 2e 0a 2a 2a 20  STER tables..** 
0400: 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 65 6e  If it does, then
0410: 20 72 65 61 64 20 69 74 2e 0a 2a 2f 0a 76 6f 69   read it..*/.voi
0420: 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 50 61  d sqlite3BeginPa
0430: 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rse(Parse *pPars
0440: 65 2c 20 69 6e 74 20 65 78 70 6c 61 69 6e 46 6c  e, int explainFl
0450: 61 67 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 65  ag){.  pParse->e
0460: 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61 69 6e  xplain = explain
0470: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
0480: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nVar = 0;.}../*.
0490: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
04a0: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
04b0: 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61  a single SQL sta
04c0: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
04d0: 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20 61 20  ** parsed and a 
04e0: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 74 6f 20  VDBE program to 
04f0: 65 78 65 63 75 74 65 20 74 68 61 74 20 73 74 61  execute that sta
0500: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
0510: 2a 2a 20 70 72 65 70 61 72 65 64 2e 20 20 54 68  ** prepared.  Th
0520: 69 73 20 72 6f 75 74 69 6e 65 20 70 75 74 73 20  is routine puts 
0530: 74 68 65 20 66 69 6e 69 73 68 69 6e 67 20 74 6f  the finishing to
0540: 75 63 68 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  uches on the.** 
0550: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 6e 64  VDBE program and
0560: 20 72 65 73 65 74 73 20 74 68 65 20 70 50 61 72   resets the pPar
0570: 73 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  se structure for
0580: 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 70 61 72   the next.** par
0590: 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  se..**.** Note t
05a0: 68 61 74 20 69 66 20 61 6e 20 65 72 72 6f 72 20  hat if an error 
05b0: 6f 63 63 75 72 72 65 64 2c 20 69 74 20 6d 69 67  occurred, it mig
05c0: 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
05d0: 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63  hat.** no VDBE c
05e0: 6f 64 65 20 77 61 73 20 67 65 6e 65 72 61 74 65  ode was generate
05f0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
0600: 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 50  e3FinishCoding(P
0610: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
0620: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
0630: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
0640: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
0650: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
0660: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65    if( pParse->ne
0670: 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 0a  sted ) return;..
0680: 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 67 65    /* Begin by ge
0690: 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65 20 74 65  nerating some te
06a0: 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20 61  rmination code a
06b0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
06c0: 0a 20 20 2a 2a 20 76 64 62 65 20 70 72 6f 67 72  .  ** vdbe progr
06d0: 61 6d 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70  am.  */.  db = p
06e0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d  Parse->db;.  v =
06f0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0700: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
0710: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
0720: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 48  dbeAddOp(v, OP_H
0730: 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  alt, 0, 0);..   
0740: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
0750: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
0760: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
0770: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
0780: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
0790: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
07a0: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
07b0: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
07c0: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
07d0: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
07e0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
07f0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
0800: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
0810: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
0820: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
0830: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
0840: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
0850: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
0860: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
0870: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
0880: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  if( pParse->cook
0890: 69 65 47 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20  ieGoto>0 ){.    
08a0: 20 20 75 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20    u32 mask;.    
08b0: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
08c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
08d0: 67 65 50 32 28 76 2c 20 70 50 61 72 73 65 2d 3e  geP2(v, pParse->
08e0: 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 2c 20 73 71  cookieGoto-1, sq
08f0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
0900: 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 20 20  Addr(v));.      
0910: 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73 6b 3d  for(iDb=0, mask=
0920: 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  1; iDb<db->nDb; 
0930: 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b 29  mask<<=1, iDb++)
0940: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
0950: 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 63 6f  ask & pParse->co
0960: 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29 20 63  okieMask)==0 ) c
0970: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
0980: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
0990: 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74  p(v, OP_Transact
09a0: 69 6f 6e 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20  ion, iDb, (mask 
09b0: 26 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d  & pParse->writeM
09c0: 61 73 6b 29 21 3d 30 29 3b 0a 20 20 20 20 20 20  ask)!=0);.      
09d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
09e0: 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43  Op(v, OP_VerifyC
09f0: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 70 50 61 72  ookie, iDb, pPar
0a00: 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b  se->cookieValue[
0a10: 69 44 62 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iDb]);.      }. 
0a20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
0a30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
0a40: 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  , 0, pParse->coo
0a50: 6b 69 65 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a  kieGoto);.    }.
0a60: 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 20 4e 6f  .    /* Add a No
0a70: 2d 6f 70 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  -op that contain
0a80: 73 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  s the complete t
0a90: 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 69  ext of the compi
0aa0: 6c 65 64 20 53 51 4c 0a 20 20 20 20 2a 2a 20 73  led SQL.    ** s
0ab0: 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74 73 20  tatement as its 
0ac0: 50 33 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68  P3 argument.  Th
0ad0: 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e  is does not chan
0ae0: 67 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 61  ge the functiona
0af0: 6c 69 74 79 0a 20 20 20 20 2a 2a 20 6f 66 20 74  lity.    ** of t
0b00: 68 65 20 70 72 6f 67 72 61 6d 2e 20 0a 20 20 20  he program. .   
0b10: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
0b20: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
0b30: 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 74 72 61  ment sqlite3_tra
0b40: 63 65 28 29 20 66 75 6e 63 74 69 6f 6e 61 6c 69  ce() functionali
0b50: 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ty..    */.    s
0b60: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
0b70: 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20   OP_Noop, 0, 0, 
0b80: 70 50 61 72 73 65 2d 3e 7a 53 71 6c 2c 20 70 50  pParse->zSql, pP
0b90: 61 72 73 65 2d 3e 7a 54 61 69 6c 2d 70 50 61 72  arse->zTail-pPar
0ba0: 73 65 2d 3e 7a 53 71 6c 29 3b 0a 20 20 7d 0a 0a  se->zSql);.  }..
0bb0: 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 56 44  .  /* Get the VD
0bc0: 42 45 20 70 72 6f 67 72 61 6d 20 72 65 61 64 79  BE program ready
0bd0: 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 0a 20   for execution. 
0be0: 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26 20 70   */.  if( v && p
0bf0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
0c00: 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74 72 61 63  {.    FILE *trac
0c10: 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  e = (db->flags &
0c20: 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63   SQLITE_VdbeTrac
0c30: 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a  e)!=0 ? stdout :
0c40: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   0;.    sqlite3V
0c50: 64 62 65 54 72 61 63 65 28 76 2c 20 74 72 61 63  dbeTrace(v, trac
0c60: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
0c70: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20  dbeMakeReady(v, 
0c80: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 70 50  pParse->nVar, pP
0c90: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 33 2c 0a 20 20  arse->nMem+3,.  
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cb0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
0cc0: 54 61 62 2b 33 2c 20 70 50 61 72 73 65 2d 3e 65  Tab+3, pParse->e
0cd0: 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50 61  xplain);.    pPa
0ce0: 72 73 65 2d 3e 72 63 20 3d 20 70 50 61 72 73 65  rse->rc = pParse
0cf0: 2d 3e 6e 45 72 72 20 3f 20 53 51 4c 49 54 45 5f  ->nErr ? SQLITE_
0d00: 45 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f 44  ERROR : SQLITE_D
0d10: 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ONE;.    pParse-
0d20: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 30  >colNamesSet = 0
0d30: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
0d40: 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  arse->rc==SQLITE
0d50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 72 73  _OK ){.    pPars
0d60: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
0d70: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72  RROR;.  }.  pPar
0d80: 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20  se->nTab = 0;.  
0d90: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30  pParse->nMem = 0
0da0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74  ;.  pParse->nSet
0db0: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
0dc0: 6e 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  nAgg = 0;.  pPar
0dd0: 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20  se->nVar = 0;.  
0de0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
0df0: 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  sk = 0;.  pParse
0e00: 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30  ->cookieGoto = 0
0e10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74  ;.}../*.** Run t
0e20: 68 65 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f  he parser and co
0e30: 64 65 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63  de generator rec
0e40: 75 72 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65  ursively in orde
0e50: 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a  r to generate.**
0e60: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51   code for the SQ
0e70: 4c 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65  L statement give
0e80: 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  n onto the end o
0e90: 66 20 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e  f the pParse con
0ea0: 74 65 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  text.** currentl
0eb0: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
0ec0: 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20  tion.  When the 
0ed0: 70 61 72 73 65 72 20 69 73 20 72 75 6e 20 72 65  parser is run re
0ee0: 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69  cursively.** thi
0ef0: 73 20 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c  s way, the final
0f00: 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20   OP_Halt is not 
0f10: 61 70 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68  appended and oth
0f20: 65 72 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  er initializatio
0f30: 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a  n.** and finaliz
0f40: 61 74 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20  ation steps are 
0f50: 6f 6d 69 74 74 65 64 20 62 65 63 61 75 73 65 20  omitted because 
0f60: 74 68 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69  those are handli
0f70: 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74  ng by the.** out
0f80: 65 72 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a  ermost parser..*
0f90: 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68  *.** Not everyth
0fa0: 69 6e 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e  ing is nestable.
0fb0: 20 20 54 68 69 73 20 66 61 63 69 6c 69 74 79 20    This facility 
0fc0: 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70  is designed to p
0fd0: 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c  ermit.** INSERT,
0fe0: 20 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c   UPDATE, and DEL
0ff0: 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ETE operations a
1000: 67 61 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41  gainst SQLITE_MA
1010: 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61  STER.  Use.** ca
1020: 72 65 20 69 66 20 79 6f 75 20 64 65 63 69 64 65  re if you decide
1030: 20 74 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74   to try to use t
1040: 68 69 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  his routine for 
1050: 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f  some other purpo
1060: 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ses..*/.void sql
1070: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
1080: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
1090: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
10a0: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
10b0: 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a  ist ap;.  char *
10c0: 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  zSql;.  int rc;.
10d0: 23 20 64 65 66 69 6e 65 20 53 41 56 45 5f 53 5a  # define SAVE_SZ
10e0: 20 20 28 73 69 7a 65 6f 66 28 50 61 72 73 65 29    (sizeof(Parse)
10f0: 20 2d 20 6f 66 66 73 65 74 6f 66 28 50 61 72 73   - offsetof(Pars
1100: 65 2c 6e 56 61 72 29 29 0a 20 20 63 68 61 72 20  e,nVar)).  char 
1110: 73 61 76 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d  saveBuf[SAVE_SZ]
1120: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
1130: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
1140: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1150: 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20 20  ->nested<10 );  
1160: 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c  /* Nesting shoul
1170: 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d  d only be of lim
1180: 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20 20  ited depth */.  
1190: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
11a0: 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  rmat);.  zSql = 
11b0: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
11c0: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
11d0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66  va_end(ap);.  if
11e0: 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
11f0: 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20   return;   /* A 
1200: 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  malloc must have
1210: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20   failed */.  }. 
1220: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b   pParse->nested+
1230: 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65  +;.  memcpy(save
1240: 42 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56  Buf, &pParse->nV
1250: 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20  ar, SAVE_SZ);.  
1260: 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e  memset(&pParse->
1270: 6e 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a  nVar, 0, SAVE_SZ
1280: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1290: 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73  3RunParser(pPars
12a0: 65 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 73  e, zSql, 0);.  s
12b0: 71 6c 69 74 65 46 72 65 65 28 7a 53 71 6c 29 3b  qliteFree(zSql);
12c0: 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61 72 73  .  memcpy(&pPars
12d0: 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65 42 75 66  e->nVar, saveBuf
12e0: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50  , SAVE_SZ);.  pP
12f0: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a  arse->nested--;.
1300: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
1310: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
1320: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
1330: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
1340: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
1350: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
1360: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
1370: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
1380: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
1390: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
13a0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
13b0: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
13c0: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
13d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
13e0: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
13f0: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
1400: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
1410: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
1420: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
1430: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
1440: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
1450: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
1460: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
1470: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
1480: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
1490: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
14a0: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
14b0: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
14c0: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
14d0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
14e0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
14f0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
1500: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
1510: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
1520: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
1530: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1540: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
1550: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
1560: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
1570: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d  ;.  assert( zNam
1580: 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
1590: 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  ( (db->flags & S
15a0: 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65  QLITE_Initialize
15b0: 64 29 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62  d) || db->init.b
15c0: 75 73 79 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  usy );.  for(i=0
15d0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
15e0: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  ){.    int j = (
15f0: 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20  i<2) ? i^1 : i; 
1600: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
1610: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
1620: 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73      if( zDatabas
1630: 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  e!=0 && sqlite3S
1640: 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65  trICmp(zDatabase
1650: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61  , db->aDb[j].zNa
1660: 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  me) ) continue;.
1670: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
1680: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62  ashFind(&db->aDb
1690: 5b 6a 5d 2e 74 62 6c 48 61 73 68 2c 20 7a 4e 61  [j].tblHash, zNa
16a0: 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  me, strlen(zName
16b0: 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20  )+1);.    if( p 
16c0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
16d0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
16e0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
16f0: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
1700: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
1710: 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
1720: 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67  abase.** table g
1730: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
1740: 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   that table and 
1750: 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65  (optionally) the
1760: 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20   name of the.** 
1770: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
1780: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20  ing the table.  
1790: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
17a0: 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20  ot found.  Also 
17b0: 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  leave an.** erro
17c0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
17d0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
17e0: 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
17f0: 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
1800: 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69  routine and sqli
1810: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69  te3FindTable() i
1820: 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72  s that this.** r
1830: 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e  outine leaves an
1840: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
1850: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
1860: 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74  g where.** sqlit
1870: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f  e3FindTable() do
1880: 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65  es not..*/.Table
1890: 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54   *sqlite3LocateT
18a0: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
18b0: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
18c0: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
18d0: 72 20 2a 7a 44 62 61 73 65 29 7b 0a 20 20 54 61  r *zDbase){.  Ta
18e0: 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65  ble *p;..  /* Re
18f0: 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
1900: 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72  schema. If an er
1910: 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76  ror occurs, leav
1920: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
1930: 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65  ge.  ** and code
1940: 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
1950: 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  eturn NULL. */. 
1960: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
1970: 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
1980: 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
1990: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
19a0: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e    p = sqlite3Fin
19b0: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  dTable(pParse->d
19c0: 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65  b, zName, zDbase
19d0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
19e0: 0a 20 20 20 20 69 66 28 20 7a 44 62 61 73 65 20  .    if( zDbase 
19f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1a00: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1a10: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
1a20: 20 25 73 2e 25 73 22 2c 20 7a 44 62 61 73 65 2c   %s.%s", zDbase,
1a30: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
1a40: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  se if( sqlite3Fi
1a50: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
1a60: 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30  db, zName, 0)!=0
1a70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1a80: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1a90: 2c 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20  , "table \"%s\" 
1aa0: 69 73 20 6e 6f 74 20 69 6e 20 64 61 74 61 62 61  is not in databa
1ab0: 73 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20  se \"%s\"",.    
1ac0: 20 20 20 20 20 7a 4e 61 6d 65 2c 20 7a 44 62 61       zName, zDba
1ad0: 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  se);.    }else{.
1ae0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1af0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
1b00: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
1b10: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  ", zName);.    }
1b20: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65  .    pParse->che
1b30: 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
1b40: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
1b50: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
1b60: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
1b70: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
1b80: 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69  ibes .** a parti
1b90: 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65  cular index give
1ba0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
1bb0: 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20  at index.** and 
1bc0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
1bd0: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f  database that co
1be0: 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78  ntains the index
1bf0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ..** Return NULL
1c00: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
1c10: 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73  *.** If zDatabas
1c20: 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61  e is 0, all data
1c30: 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68  bases are search
1c40: 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61  ed for the.** ta
1c50: 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73  ble and the firs
1c60: 74 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78  t matching index
1c70: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28   is returned.  (
1c80: 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66  No checking.** f
1c90: 6f 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64  or duplicate ind
1ca0: 65 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65  ex names is done
1cb0: 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f  .)  The search o
1cc0: 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20  rder is.** TEMP 
1cd0: 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e  first, then MAIN
1ce0: 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c  , then any auxil
1cf0: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61  iary databases a
1d00: 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68  dded.** using th
1d10: 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64  e ATTACH command
1d20: 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  ..*/.Index *sqli
1d30: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c  te3FindIndex(sql
1d40: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
1d50: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
1d60: 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
1d70: 20 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20   Index *p = 0;. 
1d80: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
1d90: 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  ( (db->flags & S
1da0: 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65  QLITE_Initialize
1db0: 64 29 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62  d) || db->init.b
1dc0: 75 73 79 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  usy );.  for(i=0
1dd0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
1de0: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  ){.    int j = (
1df0: 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20  i<2) ? i^1 : i; 
1e00: 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20   /* Search TEMP 
1e10: 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20  before MAIN */. 
1e20: 20 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71     if( zDb && sq
1e30: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62  lite3StrICmp(zDb
1e40: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61  , db->aDb[j].zNa
1e50: 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  me) ) continue;.
1e60: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
1e70: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62  ashFind(&db->aDb
1e80: 5b 6a 5d 2e 69 64 78 48 61 73 68 2c 20 7a 4e 61  [j].idxHash, zNa
1e90: 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  me, strlen(zName
1ea0: 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20  )+1);.    if( p 
1eb0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
1ec0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
1ed0: 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65  * Reclaim the me
1ee0: 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20  mory used by an 
1ef0: 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20  index.*/.static 
1f00: 76 6f 69 64 20 66 72 65 65 49 6e 64 65 78 28 49  void freeIndex(I
1f10: 6e 64 65 78 20 2a 70 29 7b 0a 20 20 73 71 6c 69  ndex *p){.  sqli
1f20: 74 65 46 72 65 65 28 70 2d 3e 7a 43 6f 6c 41 66  teFree(p->zColAf
1f30: 66 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  f);.  sqliteFree
1f40: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (p);.}../*.** Re
1f50: 6d 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20 69  move the given i
1f60: 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e  ndex from the in
1f70: 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c 20  dex hash table, 
1f80: 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73 20  and free.** its 
1f90: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
1fa0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64  s..**.** The ind
1fb0: 65 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ex is removed fr
1fc0: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1fd0: 68 61 73 68 20 74 61 62 6c 65 73 20 62 75 74 0a  hash tables but.
1fe0: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c  ** it is not unl
1ff0: 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 54  inked from the T
2000: 61 62 6c 65 20 74 68 61 74 20 69 74 20 69 6e 64  able that it ind
2010: 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69  exes..** Unlinki
2020: 6e 67 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c  ng from the Tabl
2030: 65 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 62  e must be done b
2040: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
2050: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
2060: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c  c void sqliteDel
2070: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  eteIndex(sqlite3
2080: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b   *db, Index *p){
2090: 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a  .  Index *pOld;.
20a0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
20b0: 20 26 26 20 70 2d 3e 7a 4e 61 6d 65 21 3d 30 20   && p->zName!=0 
20c0: 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  );.  pOld = sqli
20d0: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64  te3HashInsert(&d
20e0: 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69  b->aDb[p->iDb].i
20f0: 64 78 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65  dxHash, p->zName
2100: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2110: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 6c              strl
2120: 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20  en(p->zName)+1, 
2130: 30 29 3b 0a 20 20 69 66 28 20 70 4f 6c 64 21 3d  0);.  if( pOld!=
2140: 30 20 26 26 20 70 4f 6c 64 21 3d 70 20 29 7b 0a  0 && pOld!=p ){.
2150: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
2160: 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70  nsert(&db->aDb[p
2170: 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20  ->iDb].idxHash, 
2180: 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pOld->zName,.   
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e 7a    strlen(pOld->z
21b0: 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b 0a  Name)+1, pOld);.
21c0: 20 20 7d 0a 20 20 66 72 65 65 49 6e 64 65 78 28    }.  freeIndex(
21d0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  p);.}../*.** Unl
21e0: 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 69 6e  ink the given in
21f0: 64 65 78 20 66 72 6f 6d 20 69 74 73 20 74 61 62  dex from its tab
2200: 6c 65 2c 20 74 68 65 6e 20 72 65 6d 6f 76 65 0a  le, then remove.
2210: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f  ** the index fro
2220: 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68  m the index hash
2230: 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20   table and free 
2240: 69 74 73 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 74  its memory.** st
2250: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
2260: 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41  d sqlite3UnlinkA
2270: 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  ndDeleteIndex(sq
2280: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
2290: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
22a0: 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64  zIdxName){.  Ind
22b0: 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ex *pIndex;.  in
22c0: 74 20 6c 65 6e 3b 0a 0a 20 20 6c 65 6e 20 3d 20  t len;..  len = 
22d0: 73 74 72 6c 65 6e 28 7a 49 64 78 4e 61 6d 65 29  strlen(zIdxName)
22e0: 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  ;.  pIndex = sql
22f0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
2300: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 69 64 78  db->aDb[iDb].idx
2310: 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20  Hash, zIdxName, 
2320: 6c 65 6e 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28  len+1, 0);.  if(
2330: 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 69   pIndex ){.    i
2340: 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  f( pIndex->pTabl
2350: 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65  e->pIndex==pInde
2360: 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  x ){.      pInde
2370: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
2380: 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  x = pIndex->pNex
2390: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
23a0: 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
23b0: 20 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78      for(p=pIndex
23c0: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
23d0: 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21  ; p && p->pNext!
23e0: 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e  =pIndex; p=p->pN
23f0: 65 78 74 29 7b 7d 0a 20 20 20 20 20 20 69 66 28  ext){}.      if(
2400: 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d   p && p->pNext==
2410: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
2420: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e    p->pNext = pIn
2430: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
2440: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72    }.    }.    fr
2450: 65 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  eeIndex(pIndex);
2460: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
2470: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
2480: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
2490: 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68  ** Erase all sch
24a0: 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ema information 
24b0: 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  from the in-memo
24c0: 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f  ry hash tables o
24d0: 66 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 64 61  f.** a single da
24e0: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
24f0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2500: 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72  to reclaim memor
2510: 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20  y.** before the 
2520: 64 61 74 61 62 61 73 65 20 63 6c 6f 73 65 73 2e  database closes.
2530: 20 20 49 74 20 69 73 20 61 6c 73 6f 20 63 61 6c    It is also cal
2540: 6c 65 64 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  led during a rol
2550: 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72  lback.** if ther
2560: 65 20 77 65 72 65 20 73 63 68 65 6d 61 20 63 68  e were schema ch
2570: 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65  anges during the
2580: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20   transaction or 
2590: 69 66 20 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63  if a.** schema-c
25a0: 6f 6f 6b 69 65 20 6d 69 73 6d 61 74 63 68 20 6f  ookie mismatch o
25b0: 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ccurs..**.** If 
25c0: 69 44 62 3c 3d 30 20 74 68 65 6e 20 72 65 73 65  iDb<=0 then rese
25d0: 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  t the internal s
25e0: 63 68 65 6d 61 20 74 61 62 6c 65 73 20 66 6f 72  chema tables for
25f0: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a   all database.**
2600: 20 66 69 6c 65 73 2e 20 20 49 66 20 69 44 62 3e   files.  If iDb>
2610: 3d 32 20 74 68 65 6e 20 72 65 73 65 74 20 74 68  =2 then reset th
2620: 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  e internal schem
2630: 61 20 66 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a  a for only the.*
2640: 2a 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e  * single file in
2650: 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  dicated..*/.void
2660: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
2670: 65 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69  ernalSchema(sqli
2680: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
2690: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  ){.  HashElem *p
26a0: 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 74 65 6d  Elem;.  Hash tem
26b0: 70 31 3b 0a 20 20 48 61 73 68 20 74 65 6d 70 32  p1;.  Hash temp2
26c0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20  ;.  int i, j;.. 
26d0: 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
26e0: 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
26f0: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
2700: 20 7e 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c   ~SQLITE_Initial
2710: 69 7a 65 64 3b 0a 20 20 66 6f 72 28 69 3d 69 44  ized;.  for(i=iD
2720: 62 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  b; i<db->nDb; i+
2730: 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20  +){.    Db *pDb 
2740: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
2750: 20 20 20 74 65 6d 70 31 20 3d 20 70 44 62 2d 3e     temp1 = pDb->
2760: 74 62 6c 48 61 73 68 3b 0a 20 20 20 20 74 65 6d  tblHash;.    tem
2770: 70 32 20 3d 20 70 44 62 2d 3e 74 72 69 67 48 61  p2 = pDb->trigHa
2780: 73 68 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48  sh;.    sqlite3H
2790: 61 73 68 49 6e 69 74 28 26 70 44 62 2d 3e 74 72  ashInit(&pDb->tr
27a0: 69 67 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48  igHash, SQLITE_H
27b0: 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a  ASH_STRING, 0);.
27c0: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43      sqlite3HashC
27d0: 6c 65 61 72 28 26 70 44 62 2d 3e 61 46 4b 65 79  lear(&pDb->aFKey
27e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61  );.    sqlite3Ha
27f0: 73 68 43 6c 65 61 72 28 26 70 44 62 2d 3e 69 64  shClear(&pDb->id
2800: 78 48 61 73 68 29 3b 0a 20 20 20 20 66 6f 72 28  xHash);.    for(
2810: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
2820: 46 69 72 73 74 28 26 74 65 6d 70 32 29 3b 20 70  First(&temp2); p
2830: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
2840: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
2850: 29 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  )){.      sqlite
2860: 33 44 65 6c 65 74 65 54 72 69 67 67 65 72 28 28  3DeleteTrigger((
2870: 54 72 69 67 67 65 72 2a 29 73 71 6c 69 74 65 48  Trigger*)sqliteH
2880: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 29 3b  ashData(pElem));
2890: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
28a0: 65 33 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d  e3HashClear(&tem
28b0: 70 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p2);.    sqlite3
28c0: 48 61 73 68 49 6e 69 74 28 26 70 44 62 2d 3e 74  HashInit(&pDb->t
28d0: 62 6c 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48  blHash, SQLITE_H
28e0: 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a  ASH_STRING, 0);.
28f0: 20 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71      for(pElem=sq
2900: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74  liteHashFirst(&t
2910: 65 6d 70 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45  emp1); pElem; pE
2920: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
2930: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
2940: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
2950: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
2960: 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  Elem);.      sql
2970: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
2980: 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d  db, pTab);.    }
2990: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
29a0: 43 6c 65 61 72 28 26 74 65 6d 70 31 29 3b 0a 20  Clear(&temp1);. 
29b0: 20 20 20 70 44 62 2d 3e 70 53 65 71 54 61 62 20     pDb->pSeqTab 
29c0: 3d 20 30 3b 0a 20 20 20 20 44 62 43 6c 65 61 72  = 0;.    DbClear
29d0: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20  Property(db, i, 
29e0: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
29f0: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3e 30 20  ;.    if( iDb>0 
2a00: 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20  ) return;.  }.  
2a10: 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20 29  assert( iDb==0 )
2a20: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
2a30: 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43   ~SQLITE_InternC
2a40: 68 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20 49 66  hanges;..  /* If
2a50: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
2a60: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
2a70: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 73  tabase files has
2a80: 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20   been closed,.  
2a90: 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74  ** then remove t
2aa0: 68 65 6e 20 66 72 6f 6d 20 74 68 65 20 61 75 78  hen from the aux
2ab0: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
2ac0: 6c 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74  list.  We take t
2ad0: 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e  he.  ** opportun
2ae0: 69 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68  ity to do this h
2af0: 65 72 65 20 73 69 6e 63 65 20 77 65 20 68 61 76  ere since we hav
2b00: 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61  e just deleted a
2b10: 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73  ll of the.  ** s
2b20: 63 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65  chema hash table
2b30: 73 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20  s and therefore 
2b40: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d  do not have to m
2b50: 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a  ake any changes.
2b60: 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74    ** to any of t
2b70: 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
2b80: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  /.  for(i=0; i<d
2b90: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
2ba0: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
2bb0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
2bc0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
2bd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
2be0: 20 70 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44   pDb->pAux && pD
2bf0: 62 2d 3e 78 46 72 65 65 41 75 78 20 29 20 70 44  b->xFreeAux ) pD
2c00: 62 2d 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d  b->xFreeAux(pDb-
2c10: 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44  >pAux);.      pD
2c20: 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20  b->pAux = 0;.   
2c30: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a   }.  }.  for(i=j
2c40: 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =2; i<db->nDb; i
2c50: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
2c60: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
2c70: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
2c80: 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20  Db->pBt==0 ){.  
2c90: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
2ca0: 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db->zName);.    
2cb0: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30    pDb->zName = 0
2cc0: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
2cd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2ce0: 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  j<i ){.      db-
2cf0: 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44  >aDb[j] = db->aD
2d00: 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b[i];.    }.    
2d10: 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  j++;.  }.  memse
2d20: 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30  t(&db->aDb[j], 0
2d30: 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69  , (db->nDb-j)*si
2d40: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29  zeof(db->aDb[j])
2d50: 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a  );.  db->nDb = j
2d60: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c  ;.  if( db->nDb<
2d70: 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64  =2 && db->aDb!=d
2d80: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a  b->aDbStatic ){.
2d90: 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61      memcpy(db->a
2da0: 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44  DbStatic, db->aD
2db0: 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b, 2*sizeof(db->
2dc0: 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71  aDb[0]));.    sq
2dd0: 6c 69 74 65 46 72 65 65 28 64 62 2d 3e 61 44 62  liteFree(db->aDb
2de0: 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d  );.    db->aDb =
2df0: 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a   db->aDbStatic;.
2e00: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
2e10: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2e20: 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 20 72  led whenever a r
2e30: 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20  ollback occurs. 
2e40: 20 49 66 20 74 68 65 72 65 20 77 65 72 65 0a 2a   If there were.*
2e50: 2a 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  * schema changes
2e60: 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e   during the tran
2e70: 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65  saction, then we
2e80: 20 68 61 76 65 20 74 6f 20 72 65 73 65 74 20 74   have to reset t
2e90: 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68  he.** internal h
2ea0: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 72  ash tables and r
2eb0: 65 6c 6f 61 64 20 74 68 65 6d 20 66 72 6f 6d 20  eload them from 
2ec0: 64 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  disk..*/.void sq
2ed0: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74  lite3RollbackInt
2ee0: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c  ernalChanges(sql
2ef0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28  ite3 *db){.  if(
2f00: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
2f10: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
2f20: 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  s ){.    sqlite3
2f30: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
2f40: 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a  ema(db, 0);.  }.
2f50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2f60: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2f70: 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63  when a commit oc
2f80: 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  curs..*/.void sq
2f90: 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
2fa0: 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74  nalChanges(sqlit
2fb0: 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66  e3 *db){.  db->f
2fc0: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
2fd0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d  InternChanges;.}
2fe0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
2ff0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
3000: 72 6f 6d 20 61 20 74 61 62 6c 65 20 6f 72 20 76  rom a table or v
3010: 69 65 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  iew..*/.static v
3020: 6f 69 64 20 73 71 6c 69 74 65 52 65 73 65 74 43  oid sqliteResetC
3030: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65  olumnNames(Table
3040: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74   *pTable){.  int
3050: 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43   i;.  Column *pC
3060: 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  ol;.  assert( pT
3070: 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72  able!=0 );.  for
3080: 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 6c  (i=0, pCol=pTabl
3090: 65 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 6c  e->aCol; i<pTabl
30a0: 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  e->nCol; i++, pC
30b0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  ol++){.    sqlit
30c0: 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  eFree(pCol->zNam
30d0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  e);.    sqlite3E
30e0: 78 70 72 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e  xprDelete(pCol->
30f0: 70 44 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69  pDflt);.    sqli
3100: 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79  teFree(pCol->zTy
3110: 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  pe);.  }.  sqlit
3120: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
3130: 6f 6c 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61  ol);.  pTable->a
3140: 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  Col = 0;.  pTabl
3150: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a  e->nCol = 0;.}..
3160: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
3170: 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72   memory data str
3180: 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74  uctures associat
3190: 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
31a0: 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20  n.** Table.  No 
31b0: 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
31c0: 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73   to disk by this
31d0: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
31e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
31f0: 74 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61  t deletes the da
3200: 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  ta structure.  I
3210: 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e  t does not unlin
3220: 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64  k.** the table d
3230: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72  ata structure fr
3240: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
3250: 65 2e 20 20 4e 6f 72 20 64 6f 65 73 20 69 74 20  e.  Nor does it 
3260: 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67  remove.** foreig
3270: 6e 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 65 20  n keys from the 
3280: 73 71 6c 69 74 65 2e 61 46 4b 65 79 20 68 61 73  sqlite.aFKey has
3290: 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74  h table.  But it
32a0: 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a   does destroy.**
32b0: 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
32c0: 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65  es of the indice
32d0: 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65  s and foreign ke
32e0: 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
32f0: 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  th .** the table
3300: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20  ..**.** Indices 
3310: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
3320: 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 75 6e  the table are un
3330: 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20  linked from the 
3340: 22 64 62 22 0a 2a 2a 20 64 61 74 61 20 73 74 72  "db".** data str
3350: 75 63 74 75 72 65 20 69 66 20 64 62 21 3d 4e 55  ucture if db!=NU
3360: 4c 4c 2e 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c  LL.  If db==NULL
3370: 2c 20 69 6e 64 69 63 65 73 20 61 74 74 61 63 68  , indices attach
3380: 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62  ed to.** the tab
3390: 6c 65 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20  le are deleted, 
33a0: 62 75 74 20 69 74 20 69 73 20 61 73 73 75 6d 65  but it is assume
33b0: 64 20 74 68 65 79 20 68 61 76 65 20 61 6c 72 65  d they have alre
33c0: 61 64 79 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69  ady been.** unli
33d0: 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nked..*/.void sq
33e0: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
33f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
3400: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
3410: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a  Index *pIndex, *
3420: 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70  pNext;.  FKey *p
3430: 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79  FKey, *pNextFKey
3440: 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  ;..  if( pTable=
3450: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
3460: 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e  /* Delete all in
3470: 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
3480: 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65   with this table
3490: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64  .  */.  for(pInd
34a0: 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e  ex = pTable->pIn
34b0: 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e  dex; pIndex; pIn
34c0: 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  dex=pNext){.    
34d0: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
34e0: 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72  pNext;.    asser
34f0: 74 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d  t( pIndex->iDb==
3500: 70 54 61 62 6c 65 2d 3e 69 44 62 20 7c 7c 20 28  pTable->iDb || (
3510: 70 54 61 62 6c 65 2d 3e 69 44 62 3d 3d 30 20 26  pTable->iDb==0 &
3520: 26 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 31  & pIndex->iDb==1
3530: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44  ) );.    sqliteD
3540: 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70  eleteIndex(db, p
3550: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Index);.  }..  /
3560: 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 66 6f 72  * Delete all for
3570: 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69  eign keys associ
3580: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74  ated with this t
3590: 61 62 6c 65 2e 20 20 54 68 65 20 6b 65 79 73 0a  able.  The keys.
35a0: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65    ** should have
35b0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 75 6e   already been un
35c0: 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20  linked from the 
35d0: 64 62 2d 3e 61 46 4b 65 79 20 68 61 73 68 20 74  db->aFKey hash t
35e0: 61 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72  able .  */.  for
35f0: 28 70 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70  (pFKey=pTable->p
3600: 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b  FKey; pFKey; pFK
3610: 65 79 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20  ey=pNextFKey){. 
3620: 20 20 20 70 4e 65 78 74 46 4b 65 79 20 3d 20 70     pNextFKey = p
3630: 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b  FKey->pNextFrom;
3640: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
3650: 62 6c 65 2d 3e 69 44 62 3c 64 62 2d 3e 6e 44 62  ble->iDb<db->nDb
3660: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
3670: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
3680: 26 64 62 2d 3e 61 44 62 5b 70 54 61 62 6c 65 2d  &db->aDb[pTable-
3690: 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 0a 20 20 20  >iDb].aFKey,.   
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b0: 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a          pFKey->z
36c0: 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46 4b 65 79  To, strlen(pFKey
36d0: 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79  ->zTo)+1)!=pFKey
36e0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   );.    sqliteFr
36f0: 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 0a  ee(pFKey);.  }..
3700: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
3710: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
3720: 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73  itself..  */.  s
3730: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
3740: 4e 61 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20  Names(pTable);. 
3750: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
3760: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  le->zName);.  sq
3770: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
3780: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c  >zColAff);.  sql
3790: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
37a0: 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74  (pTable->pSelect
37b0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
37c0: 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pTable);.}../*.*
37d0: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
37e0: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
37f0: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
3800: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
3810: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
3820: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
3830: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
3840: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
3850: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
3860: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
3870: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
3880: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
3890: 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61  *zTabName){.  Ta
38a0: 62 6c 65 20 2a 70 3b 0a 20 20 46 4b 65 79 20 2a  ble *p;.  FKey *
38b0: 70 46 31 2c 20 2a 70 46 32 3b 0a 20 20 44 62 20  pF1, *pF2;.  Db 
38c0: 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
38d0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
38e0: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
38f0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  b<db->nDb );.  a
3900: 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20  ssert( zTabName 
3910: 26 26 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 20 29  && zTabName[0] )
3920: 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
3930: 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73  Db[iDb];.  p = s
3940: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
3950: 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20  (&pDb->tblHash, 
3960: 7a 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  zTabName, strlen
3970: 28 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 20 30 29  (zTabName)+1, 0)
3980: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
3990: 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65   for(pF1=p->pFKe
39a0: 79 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d  y; pF1; pF1=pF1-
39b0: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
39c0: 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72     int nTo = str
39d0: 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20  len(pF1->zTo) + 
39e0: 31 3b 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73  1;.      pF2 = s
39f0: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
3a00: 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d  pDb->aFKey, pF1-
3a10: 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20  >zTo, nTo);.    
3a20: 20 20 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29    if( pF2==pF1 )
3a30: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3a40: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62  3HashInsert(&pDb
3a50: 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54  ->aFKey, pF1->zT
3a60: 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65  o, nTo, pF1->pNe
3a70: 78 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xtTo);.      }el
3a80: 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  se{.        whil
3a90: 65 28 20 70 46 32 20 26 26 20 70 46 32 2d 3e 70  e( pF2 && pF2->p
3aa0: 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b 20 70  NextTo!=pF1 ){ p
3ab0: 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b  F2=pF2->pNextTo;
3ac0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
3ad0: 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  F2 ){.          
3ae0: 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70  pF2->pNextTo = p
3af0: 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20  F1->pNextTo;.   
3b00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
3b10: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
3b20: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
3b30: 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c  p);.  }.  db->fl
3b40: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
3b50: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
3b60: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f  /*.** Given a to
3b70: 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74  ken, return a st
3b80: 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73  ring that consis
3b90: 74 73 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f  ts of the text o
3ba0: 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 20  f that.** token 
3bb0: 77 69 74 68 20 61 6e 79 20 71 75 6f 74 61 74 69  with any quotati
3bc0: 6f 6e 73 20 72 65 6d 6f 76 65 64 2e 20 20 53 70  ons removed.  Sp
3bd0: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
3be0: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
3bf0: 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ** is obtained f
3c00: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
3c10: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
3c20: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
3c30: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  ing.** function.
3c40: 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72  .**.** Tokens ar
3c50: 65 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 70 6f  e really just po
3c60: 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20  inters into the 
3c70: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78  original SQL tex
3c80: 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20  t and so.** are 
3c90: 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61  not \000 termina
3ca0: 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20  ted and are not 
3cb0: 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65  persistent.  The
3cc0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
3cd0: 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d  .** is \000 term
3ce0: 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65  inated and is pe
3cf0: 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61  rsistent..*/.cha
3d00: 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72  r *sqlite3NameFr
3d10: 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70  omToken(Token *p
3d20: 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
3d30: 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d  Name;.  if( pNam
3d40: 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  e ){.    zName =
3d50: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
3d60: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
3d70: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  n);.    sqlite3D
3d80: 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
3d90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d   }else{.    zNam
3da0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
3db0: 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  urn zName;.}../*
3dc0: 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c  .** Open the sql
3dd0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
3de0: 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62   stored in datab
3df0: 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66  ase number iDb f
3e00: 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54  or.** writing. T
3e10: 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e  he table is open
3e20: 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20  ed using cursor 
3e30: 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
3e40: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
3e50: 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  e(Vdbe *v, int i
3e60: 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  Db){.  sqlite3Vd
3e70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
3e80: 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a  teger, iDb, 0);.
3e90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3ea0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  Op(v, OP_OpenWri
3eb0: 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f  te, 0, MASTER_RO
3ec0: 4f 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  OT);.  sqlite3Vd
3ed0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
3ee0: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20  tNumColumns, 0, 
3ef0: 35 29 3b 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61  5); /* sqlite_ma
3f00: 73 74 65 72 20 68 61 73 20 35 20 63 6f 6c 75 6d  ster has 5 colum
3f10: 6e 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ns */.}../*.** T
3f20: 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  he token *pName 
3f30: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d  contains the nam
3f40: 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  e of a database 
3f50: 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f  (either "main" o
3f60: 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74  r.** "temp" or t
3f70: 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74  he name of an at
3f80: 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73  tached db). This
3f90: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
3fa0: 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66   the.** index of
3fb0: 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62   the named datab
3fc0: 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d  ase in db->aDb[]
3fd0: 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e  , or -1 if the n
3fe0: 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73  amed db .** does
3ff0: 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69   not exist..*/.i
4000: 6e 74 20 66 69 6e 64 44 62 28 73 71 6c 69 74 65  nt findDb(sqlite
4010: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
4020: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  ame){.  int i;  
4030: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
4040: 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  se number */.  i
4050: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  nt n;         /*
4060: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
4070: 63 74 65 72 73 20 69 6e 20 74 68 65 20 6e 61 6d  cters in the nam
4080: 65 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20  e */.  Db *pDb; 
4090: 20 20 20 20 20 20 2f 2a 20 41 20 64 61 74 61 62        /* A datab
40a0: 61 73 65 20 77 68 6f 73 65 20 6e 61 6d 65 20 73  ase whose name s
40b0: 70 61 63 65 20 69 73 20 62 65 69 6e 67 20 73 65  pace is being se
40c0: 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 68 61 72  arched */.  char
40d0: 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61   *zName;   /* Na
40e0: 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68  me we are search
40f0: 69 6e 67 20 66 6f 72 20 2a 2f 0a 0a 20 20 7a 4e  ing for */..  zN
4100: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
4110: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
4120: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  );.  if( zName )
4130: 7b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e  {.    n = strlen
4140: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72  (zName);.    for
4150: 28 70 44 62 3d 64 62 2d 3e 61 44 62 2c 20 69 3d  (pDb=db->aDb, i=
4160: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
4170: 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 20  +, pDb++){.     
4180: 20 69 66 28 20 6e 3d 3d 73 74 72 6c 65 6e 28 70   if( n==strlen(p
4190: 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 30 3d  Db->zName) && 0=
41a0: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
41b0: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  pDb->zName, zNam
41c0: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  e) ){.        sq
41d0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
41e0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
41f0: 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
4200: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
4210: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65  zName);.  }.  re
4220: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 20 54  turn -1;.}../* T
4230: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
4240: 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d 65   or trigger name
4250: 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
4260: 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74  is routine via t
4270: 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20  okens.** pName1 
4280: 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74  and pName2. If t
4290: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61  he table name wa
42a0: 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  s fully qualifie
42b0: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  d, for example:.
42c0: 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42  **.** CREATE TAB
42d0: 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29  LE xxx.yyy (...)
42e0: 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e  ;.** .** Then pN
42f0: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
4300: 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  xxx" and pName2 
4310: 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74  "yyy". On the ot
4320: 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74  her hand if.** t
4330: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73  he table name is
4340: 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69   not fully quali
4350: 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a  fied, i.e.:.**.*
4360: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79  * CREATE TABLE y
4370: 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54  yy(...);.**.** T
4380: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
4390: 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70  t to "yyy" and p
43a0: 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a  Name2 is ""..**.
43b0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
43c0: 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71 75  sets the *ppUnqu
43d0: 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f  al pointer to po
43e0: 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e  int at the token
43f0: 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70   (pName1 or.** p
4400: 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72  Name2) that stor
4410: 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  es the unqualifi
4420: 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20  ed table name.  
4430: 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  The index of the
4440: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78 78  .** database "xx
4450: 78 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  x" is returned..
4460: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 77  */.int sqlite3Tw
4470: 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61 72  oPartName(.  Par
4480: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4490: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
44a0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
44b0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
44c0: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
44d0: 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69 6e   /* The "xxx" in
44e0: 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79   the name "xxx.y
44f0: 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a  yy" or "xxx" */.
4500: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
4510: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79 79        /* The "yy
4520: 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22  y" in the name "
4530: 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f  xxx.yyy" */.  To
4540: 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20  ken **pUnqual   
4550: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 75    /* Write the u
4560: 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65 63  nqualified objec
4570: 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29  t name here */.)
4580: 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  {.  int iDb;    
4590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45a0: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
45b0: 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20 2a  ing the object *
45c0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
45d0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
45e0: 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70   if( pName2 && p
45f0: 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20  Name2->n>0 ){.  
4600: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69    assert( !db->i
4610: 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20  nit.busy );.    
4620: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
4630: 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 66 69 6e  2;.    iDb = fin
4640: 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b  dDb(db, pName1);
4650: 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29  .    if( iDb<0 )
4660: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
4670: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4680: 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73  "unknown databas
4690: 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a  e %T", pName1);.
46a0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
46b0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75  rr++;.      retu
46c0: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn -1;.    }.  }
46d0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
46e0: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
46f0: 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75  0 || db->init.bu
4700: 73 79 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20  sy );.    iDb = 
4710: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20  db->init.iDb;.  
4720: 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61    *pUnqual = pNa
4730: 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  me1;.  }.  retur
4740: 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n iDb;.}../*.** 
4750: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4760: 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66  used to check if
4770: 20 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e   the UTF-8 strin
4780: 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67  g zName is a leg
4790: 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65  al.** unqualifie
47a0: 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77  d name for a new
47b0: 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28   schema object (
47c0: 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69  table, index, vi
47d0: 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72  ew or.** trigger
47e0: 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65  ). All names are
47f0: 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74 68   legal except th
4800: 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e 20 77  ose that begin w
4810: 69 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a  ith the string.*
4820: 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20  * "sqlite_" (in 
4830: 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20  upper, lower or 
4840: 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54 68 69  mixed case). Thi
4850: 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  s portion of the
4860: 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73   namespace.** is
4870: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e   reserved for in
4880: 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69  ternal use..*/.i
4890: 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  nt sqlite3CheckO
48a0: 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20  bjectName(Parse 
48b0: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
48c0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
48d0: 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e  f( !pParse->db->
48e0: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61  init.busy && pPa
48f0: 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a  rse->nested==0 .
4900: 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d            && 0==
4910: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
4920: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
4930: 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  , 7) ){.    sqli
4940: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4950: 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65  se, "object name
4960: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e   reserved for in
4970: 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c  ternal use: %s",
4980: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74   zName);.    ret
4990: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
49a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
49b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
49c0: 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75  ** Begin constru
49d0: 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  cting a new tabl
49e0: 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
49f0: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
4a00: 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  s is.** the firs
4a10: 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74  t of several act
4a20: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ion routines tha
4a30: 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20  t get called in 
4a40: 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61  response.** to a
4a50: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
4a60: 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72  atement.  In par
4a70: 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f  ticular, this ro
4a80: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a  utine is called.
4a90: 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20  ** after seeing 
4aa0: 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20  tokens "CREATE" 
4ab0: 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20  and "TABLE" and 
4ac0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  the table name. 
4ad0: 20 54 68 65 0a 2a 2a 20 70 53 74 61 72 74 20 74   The.** pStart t
4ae0: 6f 6b 65 6e 20 69 73 20 74 68 65 20 43 52 45 41  oken is the CREA
4af0: 54 45 20 61 6e 64 20 70 4e 61 6d 65 20 69 73 20  TE and pName is 
4b00: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  the table name. 
4b10: 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66   The isTemp.** f
4b20: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
4b30: 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  he table should 
4b40: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
4b50: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
4b60: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74  ase.** file inst
4b70: 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61  ead of in the ma
4b80: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
4b90: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
4ba0: 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20  lly the case.** 
4bb0: 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20  when the "TEMP" 
4bc0: 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b  or "TEMPORARY" k
4bd0: 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e  eyword occurs in
4be0: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41   between.** CREA
4bf0: 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a  TE and TABLE..**
4c00: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c  .** The new tabl
4c10: 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74  e record is init
4c20: 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20  ialized and put 
4c30: 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  in pParse->pNewT
4c40: 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65  able..** As more
4c50: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
4c60: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
4c70: 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69  s parsed, additi
4c80: 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72  onal action.** r
4c90: 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20  outines will be 
4ca0: 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f  called to add mo
4cb0: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  re information t
4cc0: 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a  o this record..*
4cd0: 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
4ce0: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
4cf0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
4d00: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
4d10: 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  ) routine.** is 
4d20: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65  called to comple
4d30: 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  te the construct
4d40: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ion of the new t
4d50: 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a  able record..*/.
4d60: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61 72  void sqlite3Star
4d70: 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  tTable(.  Parse 
4d80: 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
4d90: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
4da0: 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c    Token *pStart,
4db0: 20 20 20 2f 2a 20 54 68 65 20 22 43 52 45 41 54     /* The "CREAT
4dc0: 45 22 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f  E" token */.  To
4dd0: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f  ken *pName1,   /
4de0: 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20  * First part of 
4df0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
4e00: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
4e10: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
4e20: 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61  ,   /* Second pa
4e30: 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f  rt of the name o
4e40: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  f the table or v
4e50: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  iew */.  int isT
4e60: 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  emp,      /* Tru
4e70: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 54  e if this is a T
4e80: 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  EMP table */.  i
4e90: 6e 74 20 69 73 56 69 65 77 20 20 20 20 20 20 20  nt isView       
4ea0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
4eb0: 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 29 7b 0a  is a VIEW */.){.
4ec0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
4ed0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
4ee0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
4ef0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
4f00: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
4f10: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b  e *v;.  int iDb;
4f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
4f30: 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63  base number to c
4f40: 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  reate the table 
4f50: 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  in */.  Token *p
4f60: 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75  Name;    /* Unqu
4f70: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
4f80: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65  the table to cre
4f90: 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ate */..  /* The
4fa0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
4fb0: 61 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69 73  ame to create is
4fc0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
4fd0: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65  routine via toke
4fe0: 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61  ns.  ** pName1 a
4ff0: 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68  nd pName2. If th
5000: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73  e table name was
5010: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5020: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20  , for example:. 
5030: 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20   **.  ** CREATE 
5040: 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e  TABLE xxx.yyy (.
5050: 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ..);.  ** .  ** 
5060: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
5070: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
5080: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
5090: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
50a0: 69 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  if.  ** the tabl
50b0: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
50c0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
50d0: 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  .e.:.  **.  ** C
50e0: 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28  REATE TABLE yyy(
50f0: 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ...);.  **.  ** 
5100: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
5110: 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20  et to "yyy" and 
5120: 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20  pName2 is ""..  
5130: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  **.  ** The call
5140: 20 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20   below sets the 
5150: 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f  pName pointer to
5160: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f   point at the to
5170: 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20  ken (pName1 or. 
5180: 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74   ** pName2) that
5190: 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75   stores the unqu
51a0: 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61  alified table na
51b0: 6d 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65  me. The variable
51c0: 20 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74   iDb is.  ** set
51d0: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
51e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
51f0: 61 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  at the table or 
5200: 76 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20  view is to be.  
5210: 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20  ** created in.. 
5220: 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   */.  iDb = sqli
5230: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
5240: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
5250: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
5260: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
5270: 74 75 72 6e 3b 0a 20 20 69 66 28 20 69 73 54 65  turn;.  if( isTe
5280: 6d 70 20 26 26 20 69 44 62 3e 31 20 29 7b 0a 20  mp && iDb>1 ){. 
5290: 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e     /* If creatin
52a0: 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20  g a temp table, 
52b0: 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74  the name may not
52c0: 20 62 65 20 71 75 61 6c 69 66 69 65 64 20 2a 2f   be qualified */
52d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
52e0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 65  rMsg(pParse, "te
52f0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61  mporary table na
5300: 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61  me must be unqua
5310: 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 70 50  lified");.    pP
5320: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
5330: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
5340: 69 66 28 20 69 73 54 65 6d 70 20 29 20 69 44 62  if( isTemp ) iDb
5350: 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d   = 1;..  pParse-
5360: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70  >sNameToken = *p
5370: 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  Name;.  zName = 
5380: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
5390: 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69  oken(pName);.  i
53a0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
53b0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49  turn;.  if( SQLI
53c0: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
53d0: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
53e0: 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
53f0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
5400: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
5410: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d  n;.  }.  if( db-
5420: 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69  >init.iDb==1 ) i
5430: 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64  sTemp = 1;.#ifnd
5440: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
5450: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61  UTHORIZATION.  a
5460: 73 73 65 72 74 28 20 28 69 73 54 65 6d 70 20 26  ssert( (isTemp &
5470: 20 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20   1)==isTemp );. 
5480: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b   {.    int code;
5490: 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  .    char *zDb =
54a0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
54b0: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ame;.    if( sql
54c0: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
54d0: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53  arse, SQLITE_INS
54e0: 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ERT, SCHEMA_TABL
54f0: 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44  E(isTemp), 0, zD
5500: 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  b) ){.      sqli
5510: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
5520: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
5530: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
5540: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  w ){.      if( i
5550: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
5560: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
5570: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b  REATE_TEMP_VIEW;
5580: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5590: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
55a0: 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b  ITE_CREATE_VIEW;
55b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
55c0: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73  se{.      if( is
55d0: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
55e0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
55f0: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b  EATE_TEMP_TABLE;
5600: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5610: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
5620: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
5630: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5640: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
5650: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
5660: 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c   code, zName, 0,
5670: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 73   zDb) ){.      s
5680: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
5690: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
56a0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
56b0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
56c0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e   the new table n
56d0: 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c  ame does not col
56e0: 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69  lide with an exi
56f0: 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78  sting.  ** index
5700: 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69   or table name i
5710: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
5720: 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65  ase.  Issue an e
5730: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a  rror message if.
5740: 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 0a 20 20    ** it does..  
5750: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
5760: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
5770: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20  chema(pParse) ) 
5780: 72 65 74 75 72 6e 3b 0a 20 20 70 54 61 62 6c 65  return;.  pTable
5790: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
57a0: 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64  ble(db, zName, d
57b0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
57c0: 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  e);.  if( pTable
57d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
57e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
57f0: 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64  "table %T alread
5800: 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65  y exists", pName
5810: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
5820: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  e(zName);.    re
5830: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
5840: 28 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 46  (pIdx = sqlite3F
5850: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
5860: 6d 65 2c 20 30 29 29 21 3d 30 20 26 26 20 0a 20  me, 0))!=0 && . 
5870: 20 20 20 20 20 28 20 69 44 62 3d 3d 30 20 7c 7c       ( iDb==0 ||
5880: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29   !db->init.busy)
5890: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
58a0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
58b0: 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
58c0: 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64  y an index named
58d0: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
58e0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
58f0: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  me);.    return;
5900: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20  .  }.  pTable = 
5910: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
5920: 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
5930: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
5940: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  {.    pParse->rc
5950: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
5960: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
5970: 72 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  r++;.    sqliteF
5980: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
5990: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54  return;.  }.  pT
59a0: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e  able->zName = zN
59b0: 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  ame;.  pTable->n
59c0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  Col = 0;.  pTabl
59d0: 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  e->aCol = 0;.  p
59e0: 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d  Table->iPKey = -
59f0: 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49 6e  1;.  pTable->pIn
5a00: 64 65 78 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  dex = 0;.  pTabl
5a10: 65 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  e->iDb = iDb;.  
5a20: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  if( pParse->pNew
5a30: 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65 33 44  Table ) sqlite3D
5a40: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
5a50: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
5a60: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  );.  pParse->pNe
5a70: 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  wTable = pTable;
5a80: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
5a90: 73 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69  s the magic sqli
5aa0: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
5ab0: 65 20 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e  e used by autoin
5ac0: 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68  crement,.  ** th
5ad0: 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e  en record a poin
5ae0: 74 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ter to this tabl
5af0: 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  e in the main da
5b00: 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
5b10: 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e  .  ** so that IN
5b20: 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68  SERT can find th
5b30: 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a  e table easily..
5b40: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
5b50: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
5b60: 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 73 74 72  REMENT.  if( str
5b70: 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  cmp(zName, "sqli
5b80: 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30  te_sequence")==0
5b90: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b   ){.    db->aDb[
5ba0: 69 44 62 5d 2e 70 53 65 71 54 61 62 20 3d 20 70  iDb].pSeqTab = p
5bb0: 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69  Table;.  }.#endi
5bc0: 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  f..  /* Begin ge
5bd0: 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64  nerating the cod
5be0: 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65  e that will inse
5bf0: 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  rt the table rec
5c00: 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ord into.  ** th
5c10: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
5c20: 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20  table.  Note in 
5c30: 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20  particular that 
5c40: 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64  we must go ahead
5c50: 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61  .  ** and alloca
5c60: 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  te the record nu
5c70: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
5c80: 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42  le entry now.  B
5c90: 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50  efore any.  ** P
5ca0: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
5cb0: 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72  IQUE keywords ar
5cc0: 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65  e parsed.  Those
5cd0: 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63   keywords will c
5ce0: 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65  ause.  ** indice
5cf0: 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  s to be created 
5d00: 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65  and the table re
5d10: 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62  cord must come b
5d20: 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20  efore the .  ** 
5d30: 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c  indices.  Hence,
5d40: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
5d50: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
5d60: 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
5d70: 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a  ed.  ** now..  *
5d80: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
5d90: 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73  t.busy && (v = s
5da0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
5db0: 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20  arse))!=0 ){.   
5dc0: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
5dd0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
5de0: 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 20 20  se, 0, iDb);..  
5df0: 20 20 2f 2a 20 45 76 65 72 79 20 74 69 6d 65 20    /* Every time 
5e00: 61 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 63  a new table is c
5e10: 72 65 61 74 65 64 20 74 68 65 20 66 69 6c 65 2d  reated the file-
5e20: 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 61 6e  format.    ** an
5e30: 64 20 65 6e 63 6f 64 69 6e 67 20 6d 65 74 61 2d  d encoding meta-
5e40: 76 61 6c 75 65 73 20 61 72 65 20 73 65 74 20 69  values are set i
5e50: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
5e60: 69 6e 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 74  in.    ** case t
5e70: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
5e80: 20 74 61 62 6c 65 20 63 72 65 61 74 65 64 2e 0a   table created..
5e90: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
5ea0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5eb0: 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 66  P_Integer, db->f
5ec0: 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 30 29 3b 0a  ile_format, 0);.
5ed0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5ee0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
5ef0: 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20  okie, iDb, 1);. 
5f00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5f10: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
5f20: 72 2c 20 64 62 2d 3e 65 6e 63 2c 20 30 29 3b 0a  r, db->enc, 0);.
5f30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5f40: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
5f50: 6f 6b 69 65 2c 20 69 44 62 2c 20 34 29 3b 0a 0a  okie, iDb, 4);..
5f60: 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74      /* This just
5f70: 20 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65   creates a place
5f80: 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69  -holder record i
5f90: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
5fa0: 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  ter table..    *
5fb0: 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65  * The record cre
5fc0: 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ated does not co
5fd0: 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79  ntain anything y
5fe0: 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  et.  It will be 
5ff0: 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20  replaced.    ** 
6000: 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72  by the real entr
6010: 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61  y in code genera
6020: 74 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e  ted at sqlite3En
6030: 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a  dTable()..    **
6040: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  .    ** The rowi
6050: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e  d for the new en
6060: 74 72 79 20 69 73 20 6c 65 66 74 20 6f 6e 20 74  try is left on t
6070: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
6080: 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ack..    ** The 
6090: 72 6f 77 69 64 20 76 61 6c 75 65 20 69 73 20 6e  rowid value is n
60a0: 65 65 64 65 64 20 62 79 20 74 68 65 20 63 6f 64  eeded by the cod
60b0: 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 45 6e  e that sqlite3En
60c0: 64 54 61 62 6c 65 20 77 69 6c 6c 0a 20 20 20 20  dTable will.    
60d0: 2a 2a 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20  ** generate..   
60e0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   */.    sqlite3O
60f0: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76  penMasterTable(v
6100: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
6110: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6120: 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20  OP_NewRecno, 0, 
6130: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
6140: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
6150: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  up, 0, 0);.    s
6160: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6170: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
6180: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
6190: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
61a0: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30  _PutIntKey, 0, 0
61b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
61c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
61d0: 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  ose, 0, 0);.  }.
61e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
61f0: 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65  ew column to the
6200: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
6210: 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
6220: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ed..**.** The pa
6230: 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
6240: 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72  routine once for
6250: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63   each column dec
6260: 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61  laration.** in a
6270: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
6280: 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65  atement.  sqlite
6290: 33 53 74 61 72 74 54 61 62 6c 65 28 29 20 67 65  3StartTable() ge
62a0: 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72  ts called.** fir
62b0: 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73  st to get things
62c0: 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68   going.  Then th
62d0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
62e0: 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a  lled for each.**
62f0: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64   column..*/.void
6300: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
6310: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
6320: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
6330: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
6340: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  t i;.  char *z;.
6350: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
6360: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
6370: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
6380: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d   ) return;.  z =
6390: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
63a0: 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20  Token(pName);.  
63b0: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
63c0: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
63d0: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
63e0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
63f0: 72 49 43 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c  rICmp(z, p->aCol
6400: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
6410: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
6420: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6430: 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e  duplicate column
6440: 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a   name: %s", z);.
6450: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
6460: 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (z);.      retur
6470: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  n;.    }.  }.  i
6480: 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78  f( (p->nCol & 0x
6490: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c  7)==0 ){.    Col
64a0: 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61  umn *aNew;.    a
64b0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
64c0: 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70  loc( p->aCol, (p
64d0: 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66  ->nCol+8)*sizeof
64e0: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
64f0: 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
6500: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 2d 3e   return;.    p->
6510: 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d  aCol = aNew;.  }
6520: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43  .  pCol = &p->aC
6530: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d  ol[p->nCol];.  m
6540: 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73  emset(pCol, 0, s
6550: 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d  izeof(p->aCol[0]
6560: 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  ));.  pCol->zNam
6570: 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66  e = z;. .  /* If
6580: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70   there is no typ
6590: 65 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c  e specified, col
65a0: 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64 65  umns have the de
65b0: 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20  fault affinity. 
65c0: 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74   ** 'NONE'. If t
65d0: 68 65 72 65 20 69 73 20 61 20 74 79 70 65 20 73  here is a type s
65e0: 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73  pecified, then s
65f0: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54  qlite3AddColumnT
6600: 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20  ype() will.  ** 
6610: 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74 20 74  be called next t
6620: 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69  o set pCol->affi
6630: 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a  nity correctly..
6640: 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66    */.  pCol->aff
6650: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
6660: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 43 6f 6c 2d  FF_NONE;.  pCol-
6670: 3e 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d  >pColl = pParse-
6680: 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a  >db->pDfltColl;.
6690: 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a    p->nCol++;.}..
66a0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
66b0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
66c0: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
66d0: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
66e0: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
66f0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
6700: 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e  ement.  A "NOT N
6710: 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20  ULL" constraint 
6720: 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e  has.** been seen
6730: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54   on a column.  T
6740: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
6750: 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61   the notNull fla
6760: 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  g on.** the colu
6770: 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  mn currently und
6780: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
6790: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
67a0: 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65  AddNotNull(Parse
67b0: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e   *pParse, int on
67c0: 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20  Error){.  Table 
67d0: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  *p;.  int i;.  i
67e0: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
67f0: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
6800: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
6810: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69  >nCol-1;.  if( i
6820: 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d  >=0 ) p->aCol[i]
6830: 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72  .notNull = onErr
6840: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  or;.}../*.** Thi
6850: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
6860: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
6870: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
6880: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
6890: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
68a0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  LE statement.  T
68b0: 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20  he pFirst token 
68c0: 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
68d0: 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71  token in the seq
68e0: 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20  uence of tokens 
68f0: 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68  that describe th
6900: 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a  e type of the.**
6910: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
6920: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
6930: 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73  tion.   pLast is
6940: 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a   the last token.
6950: 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e  ** in the sequen
6960: 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e  ce.  Use this in
6970: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e  formation to con
6980: 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a  struct a string.
6990: 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ** that contains
69a0: 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66   the typename of
69b0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   the column and 
69c0: 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e  store that strin
69d0: 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a  g.** in zType..*
69e0: 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  / .void sqlite3A
69f0: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72  ddColumnType(Par
6a00: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
6a10: 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e  n *pFirst, Token
6a20: 20 2a 70 4c 61 73 74 29 7b 0a 20 20 54 61 62 6c   *pLast){.  Tabl
6a30: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  e *p;.  int i, j
6a40: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61  ;.  int n;.  cha
6a50: 72 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20 20 43 6f  r *z, **pz;.  Co
6a60: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66  lumn *pCol;.  if
6a70: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
6a80: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
6a90: 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e  eturn;.  i = p->
6aa0: 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c  nCol-1;.  if( i<
6ab0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43  0 ) return;.  pC
6ac0: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d  ol = &p->aCol[i]
6ad0: 3b 0a 20 20 70 7a 20 3d 20 26 70 43 6f 6c 2d 3e  ;.  pz = &pCol->
6ae0: 7a 54 79 70 65 3b 0a 20 20 6e 20 3d 20 70 4c 61  zType;.  n = pLa
6af0: 73 74 2d 3e 6e 20 2b 20 28 70 4c 61 73 74 2d 3e  st->n + (pLast->
6b00: 7a 20 2d 20 70 46 69 72 73 74 2d 3e 7a 29 3b 0a  z - pFirst->z);.
6b10: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
6b20: 7a 54 79 70 65 3d 3d 30 20 29 3b 0a 20 20 7a 20  zType==0 );.  z 
6b30: 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20  = pCol->zType = 
6b40: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
6b50: 25 2e 2a 73 22 2c 20 6e 2c 20 70 46 69 72 73 74  %.*s", n, pFirst
6b60: 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  ->z);.  if( z==0
6b70: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
6b80: 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  (i=j=0; z[i]; i+
6b90: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20  +){.    int c = 
6ba0: 7a 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 69 73  z[i];.    if( is
6bb0: 73 70 61 63 65 28 63 29 20 29 20 63 6f 6e 74 69  space(c) ) conti
6bc0: 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20  nue;.    z[j++] 
6bd0: 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20  = c;.  }.  z[j] 
6be0: 3d 20 30 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66  = 0;.  pCol->aff
6bf0: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41  inity = sqlite3A
6c00: 66 66 69 6e 69 74 79 54 79 70 65 28 7a 2c 20 6e  ffinityType(z, n
6c10: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
6c20: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
6c30: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
6c40: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
6c50: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
6c60: 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  mn.** of the tab
6c70: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
6c80: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
6c90: 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76  .**.** Default v
6ca0: 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73  alue expressions
6cb0: 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e   must be constan
6cc0: 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78 63  t.  Raise an exc
6cd0: 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a  eption if this.*
6ce0: 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  * is not the cas
6cf0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
6d00: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
6d10: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
6d20: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
6d30: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
6d40: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
6d50: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
6d60: 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66 61  d sqlite3AddDefa
6d70: 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a  ultValue(Parse *
6d80: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
6d90: 78 70 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  xpr){.  Table *p
6da0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
6db0: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
6dc0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
6dd0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
6de0: 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b  Col = &(p->aCol[
6df0: 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 69  p->nCol-1]);.  i
6e00: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  f( !sqlite3ExprI
6e10: 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29  sConstant(pExpr)
6e20: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
6e30: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6e40: 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f  "default value o
6e50: 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73  f column [%s] is
6e60: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a   not constant",.
6e70: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e          pCol->zN
6e80: 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
6e90: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
6ea0: 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66 6c 74  lete(pCol->pDflt
6eb0: 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66  );.    pCol->pDf
6ec0: 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  lt = sqlite3Expr
6ed0: 44 75 70 28 70 45 78 70 72 29 3b 0a 20 20 20 20  Dup(pExpr);.    
6ee0: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
6ef0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
6f00: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  0, 0);.  }.  sql
6f10: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
6f20: 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
6f30: 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52  Designate the PR
6f40: 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68  IMARY KEY for th
6f50: 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20  e table.  pList 
6f60: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d  is a list of nam
6f70: 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e  es .** of column
6f80: 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  s that form the 
6f90: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
6fa0: 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20   pList is NULL, 
6fb0: 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74  then the.** most
6fc0: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
6fd0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
6fe0: 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61  ble is the prima
6ff0: 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20  ry key..**.** A 
7000: 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61  table can have a
7010: 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61  t most one prima
7020: 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20  ry key.  If the 
7030: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
7040: 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b  s.** a primary k
7050: 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20  ey (and this is 
7060: 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61  the second prima
7070: 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65  ry key) then cre
7080: 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e  ate an.** error.
7090: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52  .**.** If the PR
70a0: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20  IMARY KEY is on 
70b0: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
70c0: 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69  whose datatype i
70d0: 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68  s INTEGER,.** th
70e0: 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74  en we will try t
70f0: 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d  o use that colum
7100: 6e 20 61 73 20 74 68 65 20 72 6f 77 20 69 64 2e  n as the row id.
7110: 20 20 28 45 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a    (Exception:.**
7120: 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63   For backwards c
7130: 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
7140: 68 20 6f 6c 64 65 72 20 64 61 74 61 62 61 73 65  h older database
7150: 73 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  s, do not do thi
7160: 73 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65  s.** if the file
7170: 20 66 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e 20   format version 
7180: 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74  number is less t
7190: 68 61 6e 20 31 2e 29 20 20 53 65 74 20 74 68 65  han 1.)  Set the
71a0: 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20   Table.iPKey.** 
71b0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62  field of the tab
71c0: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
71d0: 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20  ction to be the 
71e0: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
71f0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
7200: 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62  KEY column.  Tab
7210: 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20  le.iPKey is set 
7220: 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69  to -1 if there i
7230: 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20  s.** no INTEGER 
7240: 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a  PRIMARY KEY..**.
7250: 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73  ** If the key is
7260: 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
7270: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
7280: 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  n create a uniqu
7290: 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74  e.** index for t
72a0: 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65  he key.  No inde
72b0: 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72  x is created for
72c0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
72d0: 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   KEYs..*/.void s
72e0: 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79  qlite3AddPrimary
72f0: 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
7300: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
7310: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
7320: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
7330: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69  ,  /* List of fi
7340: 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20  eld names to be 
7350: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
7360: 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
7370: 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
7380: 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63  h a uniqueness c
7390: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74  onflict */.  int
73a0: 20 61 75 74 6f 49 6e 63 20 20 20 20 20 20 20 2f   autoInc       /
73b0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41 55  * True if the AU
73c0: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77  TOINCREMENT keyw
73d0: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
73e0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
73f0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
7400: 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  wTable;.  char *
7410: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zType = 0;.  int
7420: 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20   iCol = -1, i;. 
7430: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67   if( pTab==0 ) g
7440: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
7450: 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62  exit;.  if( pTab
7460: 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a  ->hasPrimKey ){.
7470: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7480: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
7490: 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22     "table \"%s\"
74a0: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
74b0: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c  ne primary key",
74c0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
74d0: 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f     goto primary_
74e0: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  key_exit;.  }.  
74f0: 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79  pTab->hasPrimKey
7500: 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 1;.  if( pLis
7510: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c  t==0 ){.    iCol
7520: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20   = pTab->nCol - 
7530: 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  1;.    pTab->aCo
7540: 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65  l[iCol].isPrimKe
7550: 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 1;.  }else{.
7560: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
7570: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
7580: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f  ){.      for(iCo
7590: 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
75a0: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
75b0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
75c0: 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  e3StrICmp(pList-
75d0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61  >a[i].zName, pTa
75e0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
75f0: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
7600: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7610: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7620: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61      if( iCol<pTa
7630: 62 2d 3e 6e 43 6f 6c 20 29 20 70 54 61 62 2d 3e  b->nCol ) pTab->
7640: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69  aCol[iCol].isPri
7650: 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  mKey = 1;.    }.
7660: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e      if( pList->n
7670: 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20  Expr>1 ) iCol = 
7680: 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43  -1;.  }.  if( iC
7690: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
76a0: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
76b0: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
76c0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
76d0: 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65 20    }.  if( zType 
76e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
76f0: 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45  p(zType, "INTEGE
7700: 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54  R")==0 ){.    pT
7710: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c  ab->iPKey = iCol
7720: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43  ;.    pTab->keyC
7730: 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20  onf = onError;. 
7740: 20 20 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63     pTab->autoInc
7750: 20 3d 20 61 75 74 6f 49 6e 63 3b 0a 20 20 7d 65   = autoInc;.  }e
7760: 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20  lse if( autoInc 
7770: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
7780: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
7790: 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33  MENT.    sqlite3
77a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
77b0: 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20   "AUTOINCREMENT 
77c0: 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20  is only allowed 
77d0: 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22  on an ".       "
77e0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
77f0: 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  KEY");.#endif.  
7800: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
7810: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  e3CreateIndex(pP
7820: 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70  arse, 0, 0, 0, p
7830: 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30  List, onError, 0
7840: 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  , 0);.    pList 
7850: 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72  = 0;.  }..primar
7860: 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71  y_key_exit:.  sq
7870: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
7880: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65  ete(pList);.  re
7890: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  turn;.}../*.** S
78a0: 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  et the collation
78b0: 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65   function of the
78c0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70   most recently p
78d0: 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75  arsed table colu
78e0: 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c  mn.** to the Col
78f0: 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76  lSeq given..*/.v
7900: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
7910: 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20  llateType(Parse 
7920: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
7930: 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20  har *zType, int 
7940: 6e 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20  nType){.  Table 
7950: 2a 70 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  *p;.  Index *pId
7960: 78 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  x;.  CollSeq *pC
7970: 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  oll;.  int i;.. 
7980: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
7990: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
79a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
79b0: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20 20 70 43  p->nCol-1;..  pC
79c0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  oll = sqlite3Loc
79d0: 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
79e0: 65 2c 20 7a 54 79 70 65 2c 20 6e 54 79 70 65 29  e, zType, nType)
79f0: 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 70  ;.  p->aCol[i].p
7a00: 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 0a 20  Coll = pColl;.. 
7a10: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
7a20: 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61 73  n is declared as
7a30: 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59   "<name> PRIMARY
7a40: 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79   KEY COLLATE <ty
7a50: 70 65 3e 22 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  pe>",.  ** then 
7a60: 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76  an index may hav
7a70: 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f  e been created o
7a80: 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65  n this column be
7a90: 66 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20 63 6f  fore the.  ** co
7aa0: 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73  llation type was
7ab0: 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20   added. Correct 
7ac0: 74 68 69 73 20 69 66 20 69 74 20 69 73 20 74 68  this if it is th
7ad0: 65 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 66  e case..  */.  f
7ae0: 6f 72 28 70 49 64 78 20 3d 20 70 2d 3e 70 49 6e  or(pIdx = p->pIn
7af0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
7b00: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
7b10: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
7b20: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
7b30: 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
7b40: 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 20 70 49 64  lumn[0]==i ) pId
7b50: 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
7b60: 5b 30 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 7d  [0] = pColl;.  }
7b70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
7b80: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65   and return an e
7b90: 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 64 62  ntry from the db
7ba0: 2e 61 43 6f 6c 6c 53 65 71 20 68 61 73 68 20 74  .aCollSeq hash t
7bb0: 61 62 6c 65 2e 20 49 66 20 74 68 65 20 65 6e 74  able. If the ent
7bc0: 72 79 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  ry.** specified 
7bd0: 62 79 20 7a 4e 61 6d 65 20 61 6e 64 20 6e 4e 61  by zName and nNa
7be0: 6d 65 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 20  me is not found 
7bf0: 61 6e 64 20 70 61 72 61 6d 65 74 65 72 20 27 63  and parameter 'c
7c00: 72 65 61 74 65 27 20 69 73 0a 2a 2a 20 74 72 75  reate' is.** tru
7c10: 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  e, then create a
7c20: 20 6e 65 77 20 65 6e 74 72 79 2e 20 4f 74 68 65   new entry. Othe
7c30: 72 77 69 73 65 20 72 65 74 75 72 6e 20 4e 55 4c  rwise return NUL
7c40: 4c 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 70 6f  L..**.** Each po
7c50: 69 6e 74 65 72 20 73 74 6f 72 65 64 20 69 6e 20  inter stored in 
7c60: 74 68 65 20 73 71 6c 69 74 65 33 2e 61 43 6f 6c  the sqlite3.aCol
7c70: 6c 53 65 71 20 68 61 73 68 20 74 61 62 6c 65 20  lSeq hash table 
7c80: 63 6f 6e 74 61 69 6e 73 20 61 6e 0a 2a 2a 20 61  contains an.** a
7c90: 72 72 61 79 20 6f 66 20 74 68 72 65 65 20 43 6f  rray of three Co
7ca0: 6c 6c 53 65 71 20 73 74 72 75 63 74 75 72 65 73  llSeq structures
7cb0: 2e 20 54 68 65 20 66 69 72 73 74 20 69 73 20 74  . The first is t
7cc0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
7cd0: 75 65 6e 63 65 0a 2a 2a 20 70 72 65 66 66 65 72  uence.** preffer
7ce0: 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 74  red for UTF-8, t
7cf0: 68 65 20 73 65 63 6f 6e 64 20 55 54 46 2d 31 36  he second UTF-16
7d00: 6c 65 2c 20 61 6e 64 20 74 68 65 20 74 68 69 72  le, and the thir
7d10: 64 20 55 54 46 2d 31 36 62 65 2e 0a 2a 2a 0a 2a  d UTF-16be..**.*
7d20: 2a 20 53 74 6f 72 65 64 20 69 6d 6d 65 64 69 61  * Stored immedia
7d30: 74 65 6c 79 20 61 66 74 65 72 20 74 68 65 20 74  tely after the t
7d40: 68 72 65 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  hree collation s
7d50: 65 71 75 65 6e 63 65 73 20 69 73 20 61 20 63 6f  equences is a co
7d60: 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c  py of.** the col
7d70: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
7d80: 6e 61 6d 65 2e 20 41 20 70 6f 69 6e 74 65 72 20  name. A pointer 
7d90: 74 6f 20 74 68 69 73 20 73 74 72 69 6e 67 20 69  to this string i
7da0: 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 65  s stored in.** e
7db0: 61 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ach collation se
7dc0: 71 75 65 6e 63 65 20 73 74 72 75 63 74 75 72 65  quence structure
7dd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c  ..*/.static Coll
7de0: 53 65 71 20 2a 20 66 69 6e 64 43 6f 6c 6c 53 65  Seq * findCollSe
7df0: 71 45 6e 74 72 79 28 0a 20 20 73 71 6c 69 74 65  qEntry(.  sqlite
7e00: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
7e10: 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  har *zName,.  in
7e20: 74 20 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 63  t nName,.  int c
7e30: 72 65 61 74 65 0a 29 7b 0a 20 20 43 6f 6c 6c 53  reate.){.  CollS
7e40: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 66 28  eq *pColl;.  if(
7e50: 20 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e 61 6d 65   nName<0 ) nName
7e60: 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   = strlen(zName)
7e70: 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ;.  pColl = sqli
7e80: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
7e90: 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65  >aCollSeq, zName
7ea0: 2c 20 6e 4e 61 6d 65 29 3b 0a 0a 20 20 69 66 28  , nName);..  if(
7eb0: 20 30 3d 3d 70 43 6f 6c 6c 20 26 26 20 63 72 65   0==pColl && cre
7ec0: 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  ate ){.    pColl
7ed0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
7ee0: 20 33 2a 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c   3*sizeof(*pColl
7ef0: 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 20 29 3b  ) + nName + 1 );
7f00: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
7f10: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 30 5d  {.      pColl[0]
7f20: 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  .zName = (char*)
7f30: 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20  &pColl[3];.     
7f40: 20 70 43 6f 6c 6c 5b 30 5d 2e 65 6e 63 20 3d 20   pColl[0].enc = 
7f50: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
7f60: 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e 7a 4e 61 6d     pColl[1].zNam
7f70: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c  e = (char*)&pCol
7f80: 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c  l[3];.      pCol
7f90: 6c 5b 31 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54  l[1].enc = SQLIT
7fa0: 45 5f 55 54 46 31 36 4c 45 3b 0a 20 20 20 20 20  E_UTF16LE;.     
7fb0: 20 70 43 6f 6c 6c 5b 32 5d 2e 7a 4e 61 6d 65 20   pColl[2].zName 
7fc0: 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 5b  = (char*)&pColl[
7fd0: 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b  3];.      pColl[
7fe0: 32 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  2].enc = SQLITE_
7ff0: 55 54 46 31 36 42 45 3b 0a 20 20 20 20 20 20 6d  UTF16BE;.      m
8000: 65 6d 63 70 79 28 70 43 6f 6c 6c 5b 30 5d 2e 7a  emcpy(pColl[0].z
8010: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Name, zName, nNa
8020: 6d 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  me);.      pColl
8030: 5b 30 5d 2e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d  [0].zName[nName]
8040: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
8050: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64  te3HashInsert(&d
8060: 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 70 43 6f  b->aCollSeq, pCo
8070: 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 6e 4e 61  ll[0].zName, nNa
8080: 6d 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  me, pColl);.    
8090: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
80a0: 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  Coll;.}../*.** P
80b0: 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70  arameter zName p
80c0: 6f 69 6e 74 73 20 74 6f 20 61 20 55 54 46 2d 38  oints to a UTF-8
80d0: 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 20   encoded string 
80e0: 6e 4e 61 6d 65 20 62 79 74 65 73 20 6c 6f 6e 67  nName bytes long
80f0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
8100: 43 6f 6c 6c 53 65 71 2a 20 70 6f 69 6e 74 65 72  CollSeq* pointer
8110: 20 66 6f 72 20 74 68 65 20 63 6f 6c 6c 61 74 69   for the collati
8120: 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
8130: 64 20 7a 4e 61 6d 65 0a 2a 2a 20 66 6f 72 20 74  d zName.** for t
8140: 68 65 20 65 6e 63 6f 64 69 6e 67 20 27 65 6e 63  he encoding 'enc
8150: 27 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  ' from the datab
8160: 61 73 65 20 27 64 62 27 2e 0a 2a 2a 0a 2a 2a 20  ase 'db'..**.** 
8170: 49 66 20 74 68 65 20 65 6e 74 72 79 20 73 70 65  If the entry spe
8180: 63 69 66 69 65 64 20 69 73 20 6e 6f 74 20 66 6f  cified is not fo
8190: 75 6e 64 20 61 6e 64 20 27 63 72 65 61 74 65 27  und and 'create'
81a0: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 63   is true, then c
81b0: 72 65 61 74 65 20 61 0a 2a 2a 20 6e 65 77 20 65  reate a.** new e
81c0: 6e 74 72 79 2e 20 20 4f 74 68 65 72 77 69 73 65  ntry.  Otherwise
81d0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
81e0: 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65  .CollSeq *sqlite
81f0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 0a 20 20  3FindCollSeq(.  
8200: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 75  sqlite3 *db,.  u
8210: 38 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74 20 63  8 enc,.  const c
8220: 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  har *zName,.  in
8230: 74 20 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 63  t nName,.  int c
8240: 72 65 61 74 65 0a 29 7b 0a 20 20 43 6f 6c 6c 53  reate.){.  CollS
8250: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 66 69 6e 64  eq *pColl = find
8260: 43 6f 6c 6c 53 65 71 45 6e 74 72 79 28 64 62 2c  CollSeqEntry(db,
8270: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 63   zName, nName, c
8280: 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74  reate);.  assert
8290: 28 20 53 51 4c 49 54 45 5f 55 54 46 38 3d 3d 31  ( SQLITE_UTF8==1
82a0: 20 26 26 20 53 51 4c 49 54 45 5f 55 54 46 31 36   && SQLITE_UTF16
82b0: 4c 45 3d 3d 32 20 26 26 20 53 51 4c 49 54 45 5f  LE==2 && SQLITE_
82c0: 55 54 46 31 36 42 45 3d 3d 33 20 29 3b 0a 20 20  UTF16BE==3 );.  
82d0: 61 73 73 65 72 74 28 20 65 6e 63 3e 3d 53 51 4c  assert( enc>=SQL
82e0: 49 54 45 5f 55 54 46 38 20 26 26 20 65 6e 63 3c  ITE_UTF8 && enc<
82f0: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20  =SQLITE_UTF16BE 
8300: 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  );.  if( pColl )
8310: 20 70 43 6f 6c 6c 20 2b 3d 20 65 6e 63 2d 31 3b   pColl += enc-1;
8320: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
8330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
8340: 20 74 68 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 20   the 'collation 
8350: 6e 65 65 64 65 64 27 20 63 61 6c 6c 62 61 63 6b  needed' callback
8360: 20 74 6f 20 72 65 71 75 65 73 74 20 61 20 63 6f   to request a co
8370: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
8380: 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62  .** in the datab
8390: 61 73 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  ase text encodin
83a0: 67 20 6f 66 20 6e 61 6d 65 20 7a 4e 61 6d 65 2c  g of name zName,
83b0: 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a   length nName..*
83c0: 2a 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  * If the collati
83d0: 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2f 0a 73  on sequence.*/.s
83e0: 74 61 74 69 63 20 76 6f 69 64 20 63 61 6c 6c 43  tatic void callC
83f0: 6f 6c 6c 4e 65 65 64 65 64 28 73 71 6c 69 74 65  ollNeeded(sqlite
8400: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
8410: 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e  r *zName, int nN
8420: 61 6d 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ame){.  assert( 
8430: 21 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64  !db->xCollNeeded
8440: 20 7c 7c 20 21 64 62 2d 3e 78 43 6f 6c 6c 4e 65   || !db->xCollNe
8450: 65 64 65 64 31 36 20 29 3b 0a 20 20 69 66 28 20  eded16 );.  if( 
8460: 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e 61 6d 65 20  nName<0 ) nName 
8470: 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
8480: 0a 20 20 69 66 28 20 64 62 2d 3e 78 43 6f 6c 6c  .  if( db->xColl
8490: 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20 63 68  Needed ){.    ch
84a0: 61 72 20 2a 7a 45 78 74 65 72 6e 61 6c 20 3d 20  ar *zExternal = 
84b0: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 7a 4e  sqliteStrNDup(zN
84c0: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20  ame, nName);.   
84d0: 20 69 66 28 20 21 7a 45 78 74 65 72 6e 61 6c 20   if( !zExternal 
84e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 64 62  ) return;.    db
84f0: 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 28 64 62  ->xCollNeeded(db
8500: 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  ->pCollNeededArg
8510: 2c 20 64 62 2c 20 28 69 6e 74 29 64 62 2d 3e 65  , db, (int)db->e
8520: 6e 63 2c 20 7a 45 78 74 65 72 6e 61 6c 29 3b 0a  nc, zExternal);.
8530: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
8540: 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20 7d 0a 20  External);.  }. 
8550: 20 69 66 28 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65   if( db->xCollNe
8560: 65 64 65 64 31 36 20 29 7b 0a 20 20 20 20 63 68  eded16 ){.    ch
8570: 61 72 20 63 6f 6e 73 74 20 2a 7a 45 78 74 65 72  ar const *zExter
8580: 6e 61 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nal;.    sqlite3
8590: 5f 76 61 6c 75 65 20 2a 70 54 6d 70 20 3d 20 73  _value *pTmp = s
85a0: 71 6c 69 74 65 33 47 65 74 54 72 61 6e 73 69 65  qlite3GetTransie
85b0: 6e 74 56 61 6c 75 65 28 64 62 29 3b 0a 20 20 20  ntValue(db);.   
85c0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
85d0: 53 74 72 28 70 54 6d 70 2c 20 2d 31 2c 20 7a 4e  Str(pTmp, -1, zN
85e0: 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  ame, SQLITE_UTF8
85f0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
8600: 3b 0a 20 20 20 20 7a 45 78 74 65 72 6e 61 6c 20  ;.    zExternal 
8610: 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
8620: 78 74 28 70 54 6d 70 2c 20 53 51 4c 49 54 45 5f  xt(pTmp, SQLITE_
8630: 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20  UTF16NATIVE);.  
8640: 20 20 69 66 28 20 21 7a 45 78 74 65 72 6e 61 6c    if( !zExternal
8650: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 64   ) return;.    d
8660: 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  b->xCollNeeded16
8670: 28 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64  (db->pCollNeeded
8680: 41 72 67 2c 20 64 62 2c 20 28 69 6e 74 29 64 62  Arg, db, (int)db
8690: 2d 3e 65 6e 63 2c 20 7a 45 78 74 65 72 6e 61 6c  ->enc, zExternal
86a0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
86b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
86c0: 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20 63 6f  called if the co
86d0: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
86e0: 66 61 69 6c 73 20 74 6f 20 64 65 6c 69 76 65 72  fails to deliver
86f0: 20 61 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20   a.** collation 
8700: 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  function in the 
8710: 62 65 73 74 20 65 6e 63 6f 64 69 6e 67 20 62 75  best encoding bu
8720: 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 6f  t there may be o
8730: 74 68 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a  ther versions.**
8740: 20 6f 66 20 74 68 69 73 20 63 6f 6c 6c 61 74 69   of this collati
8750: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 28 66 6f 72  on function (for
8760: 20 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f   other text enco
8770: 64 69 6e 67 73 29 20 61 76 61 69 6c 61 62 6c 65  dings) available
8780: 2e 20 55 73 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20  . Use one.** of 
8790: 74 68 65 73 65 20 69 6e 73 74 65 61 64 20 69 66  these instead if
87a0: 20 74 68 65 79 20 65 78 69 73 74 2e 20 41 76 6f   they exist. Avo
87b0: 69 64 20 61 20 55 54 46 2d 38 20 3c 2d 3e 20 55  id a UTF-8 <-> U
87c0: 54 46 2d 31 36 20 63 6f 6e 76 65 72 73 69 6f 6e  TF-16 conversion
87d0: 20 69 66 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2e   if.** possible.
87e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
87f0: 79 6e 74 68 43 6f 6c 6c 53 65 71 28 50 61 72 73  ynthCollSeq(Pars
8800: 65 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c 53  e *pParse, CollS
8810: 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 43 6f  eq *pColl){.  Co
8820: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 32 3b 0a 20  llSeq *pColl2;. 
8830: 20 63 68 61 72 20 2a 7a 20 3d 20 70 43 6f 6c 6c   char *z = pColl
8840: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  ->zName;.  int n
8850: 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20   = strlen(z);.  
8860: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
8870: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
8880: 69 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  i;.  static cons
8890: 74 20 75 38 20 61 45 6e 63 5b 5d 20 3d 20 7b 20  t u8 aEnc[] = { 
88a0: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20  SQLITE_UTF16BE, 
88b0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20  SQLITE_UTF16LE, 
88c0: 53 51 4c 49 54 45 5f 55 54 46 38 20 7d 3b 0a 20  SQLITE_UTF8 };. 
88d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 3b 20 69   for(i=0; i<3; i
88e0: 2b 2b 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 32 20  ++){.    pColl2 
88f0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
8900: 6c 53 65 71 28 64 62 2c 20 61 45 6e 63 5b 69 5d  lSeq(db, aEnc[i]
8910: 2c 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 20 20  , z, n, 0);.    
8920: 69 66 28 20 70 43 6f 6c 6c 32 2d 3e 78 43 6d 70  if( pColl2->xCmp
8930: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  !=0 ){.      mem
8940: 63 70 79 28 70 43 6f 6c 6c 2c 20 70 43 6f 6c 6c  cpy(pColl, pColl
8950: 32 2c 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  2, sizeof(CollSe
8960: 71 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  q));.      retur
8970: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
8980: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61   }.  }.  if( pPa
8990: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
89a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
89b0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
89c0: 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  such collation s
89d0: 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73 22 2c 20  equence: %.*s", 
89e0: 6e 2c 20 7a 29 3b 0a 20 20 7d 0a 20 20 70 50 61  n, z);.  }.  pPa
89f0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 72  rse->nErr++;.  r
8a00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
8a10: 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OR;.}../*.** Thi
8a20: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8a30: 6c 65 64 20 6f 6e 20 61 20 63 6f 6c 6c 61 74 69  led on a collati
8a40: 6f 6e 20 73 65 71 75 65 6e 63 65 20 62 65 66 6f  on sequence befo
8a50: 72 65 20 69 74 20 69 73 20 75 73 65 64 20 74 6f  re it is used to
8a60: 0a 2a 2a 20 63 68 65 63 6b 20 74 68 61 74 20 69  .** check that i
8a70: 74 20 69 73 20 64 65 66 69 6e 65 64 2e 20 41 6e  t is defined. An
8a80: 20 75 6e 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61   undefined colla
8a90: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 65 78  tion sequence ex
8aa0: 69 73 74 73 20 77 68 65 6e 0a 2a 2a 20 61 20 64  ists when.** a d
8ab0: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 61 64 65  atabase is loade
8ac0: 64 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  d that contains 
8ad0: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
8ae0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
8af0: 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 6e  s.** that have n
8b00: 6f 74 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20  ot been defined 
8b10: 62 79 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  by sqlite3_creat
8b20: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 29 20 65 74  e_collation() et
8b30: 63 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 71 75  c..**.** If requ
8b40: 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  ired, this routi
8b50: 6e 65 20 63 61 6c 6c 73 20 74 68 65 20 27 63 6f  ne calls the 'co
8b60: 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 27 20  llation needed' 
8b70: 63 61 6c 6c 62 61 63 6b 20 74 6f 0a 2a 2a 20 72  callback to.** r
8b80: 65 71 75 65 73 74 20 61 20 64 65 66 69 6e 69 74  equest a definit
8b90: 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61  ion of the colla
8ba0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 49  ting sequence. I
8bb0: 66 20 74 68 69 73 20 64 6f 65 73 6e 27 74 20 77  f this doesn't w
8bc0: 6f 72 6b 2c 20 0a 2a 2a 20 61 6e 20 65 71 75 69  ork, .** an equi
8bd0: 76 61 6c 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67  valent collating
8be0: 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20 75   sequence that u
8bf0: 73 65 73 20 61 20 74 65 78 74 20 65 6e 63 6f 64  ses a text encod
8c00: 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ing different.**
8c10: 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 64   from the main d
8c20: 61 74 61 62 61 73 65 20 69 73 20 73 75 62 73 74  atabase is subst
8c30: 69 74 75 74 65 64 2c 20 69 66 20 6f 6e 65 20 69  ituted, if one i
8c40: 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a  s available..*/.
8c50: 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b  int sqlite3Check
8c60: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
8c70: 50 61 72 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a  Parse, CollSeq *
8c80: 70 43 6f 6c 6c 29 7b 0a 20 20 69 66 28 20 70 43  pColl){.  if( pC
8c90: 6f 6c 6c 20 26 26 20 21 70 43 6f 6c 6c 2d 3e 78  oll && !pColl->x
8ca0: 43 6d 70 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  Cmp ){.    /* No
8cb0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
8cc0: 6e 63 65 20 6f 66 20 74 68 69 73 20 74 79 70 65  nce of this type
8cd0: 20 66 6f 72 20 74 68 69 73 20 65 6e 63 6f 64 69   for this encodi
8ce0: 6e 67 20 69 73 20 72 65 67 69 73 74 65 72 65 64  ng is registered
8cf0: 2e 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 20 74 68  ..    ** Call th
8d00: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
8d10: 6f 72 79 20 74 6f 20 73 65 65 20 69 66 20 69 74  ory to see if it
8d20: 20 63 61 6e 20 73 75 70 70 6c 79 20 75 73 20 77   can supply us w
8d30: 69 74 68 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a  ith one..    */.
8d40: 20 20 20 20 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64      callCollNeed
8d50: 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ed(pParse->db, p
8d60: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72  Coll->zName, str
8d70: 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  len(pColl->zName
8d80: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f  ));.    if( !pCo
8d90: 6c 6c 2d 3e 78 43 6d 70 20 26 26 20 73 79 6e 74  ll->xCmp && synt
8da0: 68 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  hCollSeq(pParse,
8db0: 20 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   pColl) ){.     
8dc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
8dd0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
8de0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8df0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  OK;.}../*.** Cal
8e00: 6c 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f  l sqlite3CheckCo
8e10: 6c 6c 53 65 71 28 29 20 66 6f 72 20 61 6c 6c 20  llSeq() for all 
8e20: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
8e30: 63 65 73 20 69 6e 20 61 6e 20 69 6e 64 65 78 2c  ces in an index,
8e40: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
8e50: 76 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20  verify that all 
8e60: 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 63 6f  the necessary co
8e70: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
8e80: 73 20 61 72 65 0a 2a 2a 20 6c 6f 61 64 65 64 2e  s are.** loaded.
8e90: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
8ea0: 68 65 63 6b 49 6e 64 65 78 43 6f 6c 6c 53 65 71  heckIndexCollSeq
8eb0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8ec0: 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
8ed0: 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20  if( pIdx ){.    
8ee0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
8ef0: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
8f00: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
8f10: 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65 63   if( sqlite3Chec
8f20: 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  kCollSeq(pParse,
8f30: 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61   pIdx->keyInfo.a
8f40: 43 6f 6c 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20  Coll[i]) ){.    
8f50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8f60: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
8f70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
8f80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8f90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
8fa0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
8fb0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
8fc0: 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73  ence for databas
8fd0: 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a  e native text.**
8fe0: 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69   encoding identi
8ff0: 66 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69  fied by the stri
9000: 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68  ng zName, length
9010: 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   nName..**.** If
9020: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
9030: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
9040: 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
9050: 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c  le, or not avail
9060: 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64  able.** in the d
9070: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65  atabase native e
9080: 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c  ncoding, the col
9090: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69  lation factory i
90a0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20  s invoked to.** 
90b0: 72 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74  request it. If t
90c0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
90d0: 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75  tory does not su
90e0: 70 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75  pply such a sequ
90f0: 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65  ence,.** and the
9100: 20 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61   sequence is ava
9110: 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65  ilable in anothe
9120: 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c  r text encoding,
9130: 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a   then that is.**
9140: 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
9150: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76  d..**.** If no v
9160: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72  ersions of the r
9170: 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
9180: 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65  ons sequence are
9190: 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a   available, or.*
91a0: 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20  * another error 
91b0: 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
91c0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20  returned and an 
91d0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72  error message wr
91e0: 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50  itten into.** pP
91f0: 61 72 73 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  arse..*/.CollSeq
9200: 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43   *sqlite3LocateC
9210: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
9220: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
9230: 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61   *zName, int nNa
9240: 6d 65 29 7b 0a 20 20 75 38 20 65 6e 63 20 3d 20  me){.  u8 enc = 
9250: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b  pParse->db->enc;
9260: 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d  .  u8 initbusy =
9270: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69   pParse->db->ini
9280: 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65  t.busy;.  CollSe
9290: 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
92a0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 70 50  e3FindCollSeq(pP
92b0: 61 72 73 65 2d 3e 64 62 2c 20 65 6e 63 2c 20 7a  arse->db, enc, z
92c0: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 69 6e 69  Name, nName, ini
92d0: 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20 6e 4e  tbusy);.  if( nN
92e0: 61 6d 65 3c 30 20 29 20 6e 4e 61 6d 65 20 3d 20  ame<0 ) nName = 
92f0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20  strlen(zName);. 
9300: 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26   if( !initbusy &
9310: 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43  & (!pColl || !pC
9320: 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20  oll->xCmp) ){.  
9330: 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f    /* No collatio
9340: 6e 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68  n sequence of th
9350: 69 73 20 74 79 70 65 20 66 6f 72 20 74 68 69 73  is type for this
9360: 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 72 65 67   encoding is reg
9370: 69 73 74 65 72 65 64 2e 0a 20 20 20 20 2a 2a 20  istered..    ** 
9380: 43 61 6c 6c 20 74 68 65 20 63 6f 6c 6c 61 74 69  Call the collati
9390: 6f 6e 20 66 61 63 74 6f 72 79 20 74 6f 20 73 65  on factory to se
93a0: 65 20 69 66 20 69 74 20 63 61 6e 20 73 75 70 70  e if it can supp
93b0: 6c 79 20 75 73 20 77 69 74 68 20 6f 6e 65 2e 0a  ly us with one..
93c0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 6c 6c 43      */.    callC
93d0: 6f 6c 6c 4e 65 65 64 65 64 28 70 50 61 72 73 65  ollNeeded(pParse
93e0: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  ->db, zName, nNa
93f0: 6d 65 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  me);.    pColl =
9400: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
9410: 53 65 71 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Seq(pParse->db, 
9420: 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  enc, zName, nNam
9430: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  e, 0);.    if( p
9440: 43 6f 6c 6c 20 26 26 20 21 70 43 6f 6c 6c 2d 3e  Coll && !pColl->
9450: 78 43 6d 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a  xCmp ){.      /*
9460: 20 54 68 65 72 65 20 6d 61 79 20 62 65 20 61 20   There may be a 
9470: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 63  version of the c
9480: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
9490: 65 20 74 68 61 74 20 72 65 71 75 69 72 65 73 0a  e that requires.
94a0: 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 6c 61        ** transla
94b0: 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 65 6e 63  tion between enc
94c0: 6f 64 69 6e 67 73 2e 20 53 65 61 72 63 68 20 66  odings. Search f
94d0: 6f 72 20 69 74 20 77 69 74 68 20 73 79 6e 74 68  or it with synth
94e0: 43 6f 6c 6c 53 65 71 28 29 2e 0a 20 20 20 20 20  CollSeq()..     
94f0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 79   */.      if( sy
9500: 6e 74 68 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  nthCollSeq(pPars
9510: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, pColl) ){.   
9520: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
9530: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9540: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 68 69 6e  ..  /* If nothin
9550: 67 20 68 61 73 20 62 65 65 6e 20 66 6f 75 6e 64  g has been found
9560: 2c 20 77 72 69 74 65 20 74 68 65 20 65 72 72 6f  , write the erro
9570: 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 70  r message into p
9580: 50 61 72 73 65 20 2a 2f 0a 20 20 69 66 28 20 21  Parse */.  if( !
9590: 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70 43  initbusy && (!pC
95a0: 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78  oll || !pColl->x
95b0: 43 6d 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20  Cmp) ){.    if( 
95c0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
95d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
95e0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
95f0: 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74   "no such collat
9600: 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 2e  ion sequence: %.
9610: 2a 73 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d  *s", nName, zNam
9620: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  e);.    }.    pC
9630: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  oll = 0;.  }.  r
9640: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
9650: 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65  ../*.** Scan the
9660: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d   column type nam
9670: 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20  e zType (length 
9680: 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72  nType) and retur
9690: 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61  n the.** associa
96a0: 74 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70  ted affinity typ
96b0: 65 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74  e..*/.char sqlit
96c0: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 63  e3AffinityType(c
96d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
96e0: 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20  , int nType){.  
96f0: 69 6e 74 20 6e 2c 20 69 3b 0a 20 20 73 74 61 74  int n, i;.  stat
9700: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
9710: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
9720: 20 2a 7a 53 75 62 3b 20 20 2f 2a 20 4b 65 79 77   *zSub;  /* Keyw
9730: 6f 72 64 73 20 73 75 62 73 74 72 69 6e 67 20 74  ords substring t
9740: 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a  o search for */.
9750: 20 20 20 20 63 68 61 72 20 6e 53 75 62 3b 20 20      char nSub;  
9760: 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68         /* length
9770: 20 6f 66 20 7a 53 75 62 20 2a 2f 0a 20 20 20 20   of zSub */.    
9780: 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20  char affinity;  
9790: 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 74     /* Affinity t
97a0: 6f 20 72 65 74 75 72 6e 20 69 66 20 69 74 20 6d  o return if it m
97b0: 61 74 63 68 65 73 20 2a 2f 0a 20 20 7d 20 73 75  atches */.  } su
97c0: 62 73 74 72 69 6e 67 73 5b 5d 20 3d 20 7b 0a 20  bstrings[] = {. 
97d0: 20 20 20 7b 22 49 4e 54 22 2c 20 20 33 2c 20 53     {"INT",  3, S
97e0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
97f0: 52 7d 2c 0a 20 20 20 20 7b 22 43 48 41 52 22 2c  R},.    {"CHAR",
9800: 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54   4, SQLITE_AFF_T
9810: 45 58 54 7d 2c 0a 20 20 20 20 7b 22 43 4c 4f 42  EXT},.    {"CLOB
9820: 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46  ", 4, SQLITE_AFF
9830: 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22 54 45  _TEXT},.    {"TE
9840: 58 54 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41  XT", 4, SQLITE_A
9850: 46 46 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22  FF_TEXT},.    {"
9860: 42 4c 4f 42 22 2c 20 34 2c 20 53 51 4c 49 54 45  BLOB", 4, SQLITE
9870: 5f 41 46 46 5f 4e 4f 4e 45 7d 2c 0a 20 20 7d 3b  _AFF_NONE},.  };
9880: 0a 0a 20 20 69 66 28 20 6e 54 79 70 65 3d 3d 30  ..  if( nType==0
9890: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
98a0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
98b0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
98c0: 3c 73 69 7a 65 6f 66 28 73 75 62 73 74 72 69 6e  <sizeof(substrin
98d0: 67 73 29 2f 73 69 7a 65 6f 66 28 73 75 62 73 74  gs)/sizeof(subst
98e0: 72 69 6e 67 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b  rings[0]); i++){
98f0: 0a 20 20 20 20 69 6e 74 20 63 31 20 3d 20 73 75  .    int c1 = su
9900: 62 73 74 72 69 6e 67 73 5b 69 5d 2e 7a 53 75 62  bstrings[i].zSub
9910: 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20 63 32 20  [0];.    int c2 
9920: 3d 20 74 6f 6c 6f 77 65 72 28 63 31 29 3b 0a 20  = tolower(c1);. 
9930: 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 6e     int limit = n
9940: 54 79 70 65 20 2d 20 73 75 62 73 74 72 69 6e 67  Type - substring
9950: 73 5b 69 5d 2e 6e 53 75 62 3b 0a 20 20 20 20 63  s[i].nSub;.    c
9960: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73  onst char *z = s
9970: 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 7a 53 75  ubstrings[i].zSu
9980: 62 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20  b;.    for(n=0; 
9990: 6e 3c 3d 6c 69 6d 69 74 3b 20 6e 2b 2b 29 7b 0a  n<=limit; n++){.
99a0: 20 20 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 54        int c = zT
99b0: 79 70 65 5b 6e 5d 3b 0a 20 20 20 20 20 20 69 66  ype[n];.      if
99c0: 28 20 28 63 3d 3d 63 31 20 7c 7c 20 63 3d 3d 63  ( (c==c1 || c==c
99d0: 32 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2).             
99e0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
99f0: 4e 49 43 6d 70 28 26 7a 54 79 70 65 5b 6e 5d 2c  NICmp(&zType[n],
9a00: 20 7a 2c 20 73 75 62 73 74 72 69 6e 67 73 5b 69   z, substrings[i
9a10: 5d 2e 6e 53 75 62 29 20 29 7b 0a 20 20 20 20 20  ].nSub) ){.     
9a20: 20 20 20 72 65 74 75 72 6e 20 73 75 62 73 74 72     return substr
9a30: 69 6e 67 73 5b 69 5d 2e 61 66 66 69 6e 69 74 79  ings[i].affinity
9a40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9a50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
9a60: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
9a70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
9a80: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
9a90: 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  l increment the 
9aa0: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a  schema cookie..*
9ab0: 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20  *.** The schema 
9ac0: 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74  cookie is used t
9ad0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e  o determine when
9ae0: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
9af0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
9b00: 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20  changes.  After 
9b10: 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e  each schema chan
9b20: 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  ge, the cookie v
9b30: 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  alue.** changes.
9b40: 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73    When a process
9b50: 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65   first reads the
9b60: 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72   schema it recor
9b70: 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65  ds the.** cookie
9b80: 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77  .  Thereafter, w
9b90: 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20  henever it goes 
9ba0: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
9bb0: 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68  tabase,.** it ch
9bc0: 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20  ecks the cookie 
9bd0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
9be0: 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20   schema has not 
9bf0: 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65  changed.** since
9c00: 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61   it was last rea
9c10: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c  d..**.** This pl
9c20: 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65  an is not comple
9c30: 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f  tely bullet-proo
9c40: 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62  f.  It is possib
9c50: 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63  le for.** the sc
9c60: 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d  hema to change m
9c70: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e  ultiple times an
9c80: 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65  d for the cookie
9c90: 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61   to be.** set ba
9ca0: 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75  ck to prior valu
9cb0: 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63  e.  But schema c
9cc0: 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65  hanges are infre
9cd0: 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65  quent.** and the
9ce0: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
9cf0: 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65  hitting the same
9d00: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73   cookie value is
9d10: 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63   only.** 1 chanc
9d20: 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77  e in 2^32.  So w
9d30: 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68  e're safe enough
9d40: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9d50: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71  3ChangeCookie(sq
9d60: 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
9d70: 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  *v, int iDb){.  
9d80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9d90: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
9da0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68  db->aDb[iDb].sch
9db0: 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 30 29  ema_cookie+1, 0)
9dc0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
9dd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
9de0: 6f 6b 69 65 2c 20 69 44 62 2c 20 30 29 3b 0a 7d  okie, iDb, 0);.}
9df0: 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20  ../*.** Measure 
9e00: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
9e10: 61 72 61 63 74 65 72 73 20 6e 65 65 64 65 64 20  aracters needed 
9e20: 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67 69  to output the gi
9e30: 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65  ven.** identifie
9e40: 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72  r.  The number r
9e50: 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73  eturned includes
9e60: 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64   any quotes used
9e70: 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74  .** but does not
9e80: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c   include the nul
9e90: 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a  l terminator..**
9ea0: 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65  .** The estimate
9eb0: 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65   is conservative
9ec0: 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c  .  It might be l
9ed0: 61 72 67 65 72 20 74 68 61 74 20 77 68 61 74 20  arger that what 
9ee0: 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65  is.** really nee
9ef0: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ded..*/.static i
9f00: 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63  nt identLength(c
9f10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
9f20: 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d   int n;.  for(n=
9f30: 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29  0; *z; n++, z++)
9f40: 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22  {.    if( *z=='"
9f50: 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a  ' ){ n++; }.  }.
9f60: 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a    return n + 2;.
9f70: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
9f80: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74  n identifier ont
9f90: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
9fa0: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20   given string.  
9fb0: 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61  Add.** quote cha
9fc0: 72 61 63 74 65 72 73 20 61 73 20 6e 65 65 64 65  racters as neede
9fd0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
9fe0: 64 20 69 64 65 6e 74 50 75 74 28 63 68 61 72 20  d identPut(char 
9ff0: 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63  *z, int *pIdx, c
a000: 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e  har *zSignedIden
a010: 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  t){.  unsigned c
a020: 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75  har *zIdent = (u
a030: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53  nsigned char*)zS
a040: 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e  ignedIdent;.  in
a050: 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74  t i, j, needQuot
a060: 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a  e;.  i = *pIdx;.
a070: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
a080: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
a090: 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49 64  if( !isalnum(zId
a0a0: 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e  ent[j]) && zIden
a0b0: 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61  t[j]!='_' ) brea
a0c0: 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f  k;.  }.  needQuo
a0d0: 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d 21  te =  zIdent[j]!
a0e0: 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28 7a 49  =0 || isdigit(zI
a0f0: 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20  dent[0]).       
a100: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
a110: 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65  lite3KeywordCode
a120: 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f  (zIdent, j)!=TK_
a130: 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64 51 75  ID;.  if( needQu
a140: 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  ote ) z[i++] = '
a150: 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  "';.  for(j=0; z
a160: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
a170: 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64      z[i++] = zId
a180: 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  ent[j];.    if( 
a190: 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29  zIdent[j]=='"' )
a1a0: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
a1b0: 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f   }.  if( needQuo
a1c0: 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  te ) z[i++] = '"
a1d0: 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20  ';.  z[i] = 0;. 
a1e0: 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f   *pIdx = i;.}../
a1f0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
a200: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
a210: 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61  tement appropria
a220: 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  te for the given
a230: 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f  .** table.  Memo
a240: 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74  ry to hold the t
a250: 65 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65  ext of the state
a260: 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64  ment is obtained
a270: 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  .** from sqliteM
a280: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
a290: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
a2a0: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
a2b0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  n..*/.static cha
a2c0: 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74  r *createTableSt
a2d0: 6d 74 28 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  mt(Table *p){.  
a2e0: 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63  int i, k, n;.  c
a2f0: 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68  har *zStmt;.  ch
a300: 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32  ar *zSep, *zSep2
a310: 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20 43  , *zEnd, *z;.  C
a320: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e  olumn *pCol;.  n
a330: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   = 0;.  for(pCol
a340: 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b   = p->aCol, i=0;
a350: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c   i<p->nCol; i++,
a360: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20   pCol++){.    n 
a370: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
a380: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
a390: 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65   z = pCol->zType
a3a0: 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20  ;.    if( z ){. 
a3b0: 20 20 20 20 20 6e 20 2b 3d 20 28 73 74 72 6c 65       n += (strle
a3c0: 6e 28 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d  n(z) + 1);.    }
a3d0: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e  .  }.  n += iden
a3e0: 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65  tLength(p->zName
a3f0: 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b  );.  if( n<50 ){
a400: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a  .    zSep = "";.
a410: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b      zSep2 = ",";
a420: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b  .    zEnd = ")";
a430: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53  .  }else{.    zS
a440: 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20  ep = "\n  ";.   
a450: 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22   zSep2 = ",\n  "
a460: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e  ;.    zEnd = "\n
a470: 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33  )";.  }.  n += 3
a480: 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20  5 + 6*p->nCol;. 
a490: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d   zStmt = sqliteM
a4a0: 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b 0a 20  allocRaw( n );. 
a4b0: 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20   if( zStmt==0 ) 
a4c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 74 72 63  return 0;.  strc
a4d0: 70 79 28 7a 53 74 6d 74 2c 20 70 2d 3e 69 44 62  py(zStmt, p->iDb
a4e0: 3d 3d 31 20 3f 20 22 43 52 45 41 54 45 20 54 45  ==1 ? "CREATE TE
a4f0: 4d 50 20 54 41 42 4c 45 20 22 20 3a 20 22 43 52  MP TABLE " : "CR
a500: 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20  EATE TABLE ");. 
a510: 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d   k = strlen(zStm
a520: 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a  t);.  identPut(z
a530: 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61  Stmt, &k, p->zNa
a540: 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b  me);.  zStmt[k++
a550: 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70  ] = '(';.  for(p
a560: 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30  Col=p->aCol, i=0
a570: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
a580: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73  , pCol++){.    s
a590: 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c  trcpy(&zStmt[k],
a5a0: 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d   zSep);.    k +=
a5b0: 20 73 74 72 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b   strlen(&zStmt[k
a5c0: 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a  ]);.    zSep = z
a5d0: 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50  Sep2;.    identP
a5e0: 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43  ut(zStmt, &k, pC
a5f0: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
a600: 69 66 28 20 28 7a 20 3d 20 70 43 6f 6c 2d 3e 7a  if( (z = pCol->z
a610: 54 79 70 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Type)!=0 ){.    
a620: 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27    zStmt[k++] = '
a630: 20 27 3b 0a 20 20 20 20 20 20 73 74 72 63 70 79   ';.      strcpy
a640: 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 29 3b 0a  (&zStmt[k], z);.
a650: 20 20 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65        k += strle
a660: 6e 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n(z);.    }.  }.
a670: 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b    strcpy(&zStmt[
a680: 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74  k], zEnd);.  ret
a690: 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a  urn zStmt;.}../*
a6a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a6b0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
a6c0: 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22  port the final "
a6d0: 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  )" that terminat
a6e0: 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54  es.** a CREATE T
a6f0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
a700: 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
a710: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f  structure that o
a720: 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74  ther action rout
a730: 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62  ines have been b
a740: 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64  uilding.** is ad
a750: 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ded to the inter
a760: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c  nal hash tables,
a770: 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   assuming no err
a780: 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75  ors have.** occu
a790: 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  rred..**.** An e
a7a0: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62  ntry for the tab
a7b0: 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68  le is made in th
a7c0: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f  e master table o
a7d0: 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a  n disk, unless.*
a7e0: 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  * this is a temp
a7f0: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64  orary table or d
a800: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e  b->init.busy==1.
a810: 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e    When db->init.
a820: 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65  busy==1.** it me
a830: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
a840: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
a850: 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75  ster table becau
a860: 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f  se we just.** co
a870: 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64  nnected to the d
a880: 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75  atabase or becau
a890: 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  se the sqlite_ma
a8a0: 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a  ster table has.*
a8b0: 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67  * recently chang
a8c0: 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79  es, so the entry
a8d0: 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
a8e0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
a8f0: 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f  n.** the sqlite_
a900: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57  master table.  W
a910: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
a920: 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e   create it again
a930: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
a940: 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20  Select argument 
a950: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
a960: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
a970: 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63  routine.** was c
a980: 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
a990: 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  a table generate
a9a0: 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52  d from a .** "CR
a9b0: 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41  EATE TABLE ... A
a9c0: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74  S SELECT ..." st
a9d0: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f  atement.  The co
a9e0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a  lumn names of.**
a9f0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77   the new table w
aa00: 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65  ill match the re
aa10: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
aa20: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
aa30: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
aa40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
aa50: 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65 6c 65  oken *pEnd, Sele
aa60: 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
aa70: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69  Table *p;.  sqli
aa80: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
aa90: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45  ->db;..  if( (pE
aaa0: 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74  nd==0 && pSelect
aab0: 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ==0) || pParse->
aac0: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f  nErr || sqlite3_
aad0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
aae0: 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50  return;.  p = pP
aaf0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
ab00: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
ab10: 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
ab20: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
ab30: 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a  || !pSelect );..
ab40: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
ab50: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69  init.busy is 1 i
ab60: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
ab70: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
ab80: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
ab90: 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
aba0: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
abb0: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
abc0: 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
abd0: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
abe0: 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
abf0: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
ac00: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
ac10: 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
ac20: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69  from the db->ini
ac30: 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  t.newTnum field.
ac40: 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
ac50: 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  er.  ** should h
ac60: 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65  ave been put the
ac70: 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
ac80: 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
ac90: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
aca0: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
acb0: 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69   p->tnum = db->i
acc0: 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d  nit.newTnum;.  }
acd0: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e  ..  /* If not in
ace0: 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e  itializing, then
acf0: 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64   create a record
ad00: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
ad10: 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53  le.  ** in the S
ad20: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
ad30: 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  le of the databa
ad40: 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64 20  se.  The record 
ad50: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
ad60: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65 6e  the new table en
ad70: 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  try should alrea
ad80: 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74 61  dy be on the sta
ad90: 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ck..  **.  ** If
ada0: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f   this is a TEMPO
adb0: 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74  RARY table, writ
adc0: 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f  e the entry into
add0: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20   the auxiliary. 
ade0: 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64   ** file instead
adf0: 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   of into the mai
ae00: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
ae10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
ae20: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
ae30: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62    int n;.    Vdb
ae40: 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a  e *v;.    char *
ae50: 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69  zType;    /* "vi
ae60: 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a  ew" or "table" *
ae70: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  /.    char *zTyp
ae80: 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20  e2;   /* "VIEW" 
ae90: 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20  or "TABLE" */.  
aea0: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20    char *zStmt;  
aeb0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
aec0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72   CREATE TABLE or
aed0: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
aee0: 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76  tement */..    v
aef0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
af00: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
af10: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
af20: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ;..    sqlite3Vd
af30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
af40: 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  ose, 0, 0);..   
af50: 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72   /* Create the r
af60: 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20  ootpage for the 
af70: 6e 65 77 20 74 61 62 6c 65 20 61 6e 64 20 70 75  new table and pu
af80: 73 68 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 73  sh it onto the s
af90: 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 41 20 76  tack..    ** A v
afa0: 69 65 77 20 68 61 73 20 6e 6f 20 72 6f 6f 74 70  iew has no rootp
afb0: 61 67 65 2c 20 73 6f 20 6a 75 73 74 20 70 75 73  age, so just pus
afc0: 68 20 61 20 7a 65 72 6f 20 6f 6e 74 6f 20 74 68  h a zero onto th
afd0: 65 20 73 74 61 63 6b 20 66 6f 72 0a 20 20 20 20  e stack for.    
afe0: 2a 2a 20 76 69 65 77 73 2e 20 20 49 6e 69 74 69  ** views.  Initi
aff0: 61 6c 69 7a 65 20 7a 54 79 70 65 20 61 74 20 74  alize zType at t
b000: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20  he same time..  
b010: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
b020: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
b030: 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72      /* A regular
b040: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
b050: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b060: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
b070: 6c 65 2c 20 70 2d 3e 69 44 62 2c 20 30 29 3b 0a  le, p->iDb, 0);.
b080: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74        zType = "t
b090: 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79  able";.      zTy
b0a0: 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 20  pe2 = "TABLE";. 
b0b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b0c0: 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20  /* A view */.   
b0d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b0e0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
b0f0: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 0, 0);.      
b100: 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a  zType = "view";.
b110: 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
b120: 56 49 45 57 22 3b 0a 20 20 20 20 7d 0a 0a 20 20  VIEW";.    }..  
b130: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
b140: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  a CREATE TABLE x
b150: 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c  x AS SELECT ...,
b160: 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45 4c   execute the SEL
b170: 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  ECT.    ** state
b180: 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ment to populate
b190: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20   the new table. 
b1a0: 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  The root-page nu
b1b0: 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20  mber for the.   
b1c0: 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73   ** new table is
b1d0: 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74   on the top of t
b1e0: 68 65 20 76 64 62 65 20 73 74 61 63 6b 2e 0a 20  he vdbe stack.. 
b1f0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63     **.    ** Onc
b200: 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73  e the SELECT has
b210: 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73   been coded by s
b220: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20  qlite3Select(), 
b230: 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a  it is in a.    *
b240: 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65  * suitable state
b250: 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68   to query for th
b260: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
b270: 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75  nd types to be u
b280: 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  sed.    ** by th
b290: 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20  e new table..   
b2a0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c   */.    if( pSel
b2b0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62  ect ){.      Tab
b2c0: 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20 20  le *pSelTab;.   
b2d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b2e0: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
b2f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
b300: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b310: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e 69  OP_Integer, p->i
b320: 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  Db, 0);.      sq
b330: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b340: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
b350: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  1, 0);.      pPa
b360: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20  rse->nTab = 2;. 
b370: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
b380: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
b390: 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31  ct, SRT_Table, 1
b3a0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
b3b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b3c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
b3d0: 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 1, 0);.      
b3e0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
b3f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
b400: 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
b410: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
b420: 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65  t(pParse, 0, pSe
b430: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69  lect);.        i
b440: 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20  f( pSelTab==0 ) 
b450: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
b460: 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d  assert( p->aCol=
b470: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =0 );.        p-
b480: 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
b490: 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70  >nCol;.        p
b4a0: 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->aCol = pSelTab
b4b0: 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->aCol;.        
b4c0: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
b4d0: 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  0;.        pSelT
b4e0: 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
b4f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
b500: 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c  eteTable(0, pSel
b510: 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
b520: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70    }..    /* Comp
b530: 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ute the complete
b540: 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
b550: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ATE statement */
b560: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
b570: 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   ){.      zStmt 
b580: 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d  = createTableStm
b590: 74 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  t(p);.    }else{
b5a0: 0a 20 20 20 20 20 20 6e 20 3d 20 41 64 64 72 28  .      n = Addr(
b5b0: 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28  pEnd->z) - Addr(
b5c0: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
b5d0: 65 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20  en.z) + 1;.     
b5e0: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
b5f0: 4d 50 72 69 6e 74 66 28 22 43 52 45 41 54 45 20  MPrintf("CREATE 
b600: 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32  %s %.*s", zType2
b610: 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61  , n, pParse->sNa
b620: 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20  meToken.z);.    
b630: 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74  }..    /* A slot
b640: 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20   for the record 
b650: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
b660: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68   allocated in th
b670: 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  e .    ** SQLITE
b680: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
b690: 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20  We just need to 
b6a0: 75 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74  update that slot
b6b0: 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a   with all.    **
b6c0: 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
b6d0: 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64   we've collected
b6e0: 2e 20 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  .  The rowid for
b6f0: 20 74 68 65 20 70 72 65 61 6c 6c 6f 63 61 74 65   the preallocate
b700: 64 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73  d.    ** slot is
b710: 20 74 68 65 20 32 6e 64 20 69 74 65 6d 20 6f 6e   the 2nd item on
b720: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54 68 65   the stack.  The
b730: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
b740: 6b 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  k is the.    ** 
b750: 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20 74 68  root page for th
b760: 65 20 6e 65 77 20 74 61 62 6c 65 20 28 6f 72 20  e new table (or 
b770: 61 20 30 20 69 66 20 74 68 69 73 20 69 73 20 61  a 0 if this is a
b780: 20 76 69 65 77 29 2e 0a 20 20 20 20 2a 2f 0a 20   view)..    */. 
b790: 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
b7a0: 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
b7b0: 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
b7c0: 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53 45  s ".         "SE
b7d0: 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d  T type='%s', nam
b7e0: 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25  e=%Q, tbl_name=%
b7f0: 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 30 2c 20  Q, rootpage=#0, 
b800: 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20  sql=%Q ".       
b810: 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 31 22  "WHERE rowid=#1"
b820: 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
b830: 70 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  p->iDb].zName, S
b840: 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 2d 3e 69  CHEMA_TABLE(p->i
b850: 44 62 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65  Db),.      zType
b860: 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65  ,.      p->zName
b870: 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65  ,.      p->zName
b880: 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20  ,.      zStmt.  
b890: 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46    );.    sqliteF
b8a0: 72 65 65 28 7a 53 74 6d 74 29 3b 0a 20 20 20 20  ree(zStmt);.    
b8b0: 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
b8c0: 6b 69 65 28 64 62 2c 20 76 2c 20 70 2d 3e 69 44  kie(db, v, p->iD
b8d0: 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
b8e0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
b8f0: 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68  REMENT.    /* Ch
b900: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
b910: 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
b920: 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  an sqlite_sequen
b930: 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20  ce table for.   
b940: 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63   ** keeping trac
b950: 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65  k of autoincreme
b960: 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a  nt keys..    */.
b970: 20 20 20 20 69 66 28 20 70 2d 3e 61 75 74 6f 49      if( p->autoI
b980: 6e 63 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a  nc ){.      Db *
b990: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70  pDb = &db->aDb[p
b9a0: 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 20 20 69 66  ->iDb];.      if
b9b0: 28 20 70 44 62 2d 3e 70 53 65 71 54 61 62 3d 3d  ( pDb->pSeqTab==
b9c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
b9d0: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
b9e0: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
b9f0: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
ba00: 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %Q.sqlite_sequen
ba10: 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20  ce(name,seq)",. 
ba20: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e           pDb->zN
ba30: 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ame.        );. 
ba40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
ba50: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61  dif..    /* Repa
ba60: 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 74  rse everything t
ba70: 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74  o update our int
ba80: 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63  ernal data struc
ba90: 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c  tures */.    sql
baa0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
bab0: 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 70  P_ParseSchema, p
bac0: 2d 3e 69 44 62 2c 20 30 2c 0a 20 20 20 20 20 20  ->iDb, 0,.      
bad0: 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
bae0: 28 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22  ("tbl_name='%q'"
baf0: 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44  ,p->zName), P3_D
bb00: 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20  YNAMIC);.  }... 
bb10: 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c   /* Add the tabl
bb20: 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e to the in-memo
bb30: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
bb40: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
bb50: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  e..  */.  if( db
bb60: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
bb70: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
bb80: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c  {.    Table *pOl
bb90: 64 3b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b  d;.    FKey *pFK
bba0: 65 79 3b 20 0a 20 20 20 20 44 62 20 2a 70 44 62  ey; .    Db *pDb
bbb0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69   = &db->aDb[p->i
bbc0: 44 62 5d 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20  Db];.    pOld = 
bbd0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
bbe0: 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c  t(&pDb->tblHash,
bbf0: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   p->zName, strle
bc00: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70  n(p->zName)+1, p
bc10: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20  );.    if( pOld 
bc20: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
bc30: 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20   p==pOld );  /* 
bc40: 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
bc50: 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48   failed inside H
bc60: 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20  ashInsert() */. 
bc70: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
bc80: 20 7d 0a 20 20 20 20 66 6f 72 28 70 46 4b 65 79   }.    for(pFKey
bc90: 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79  =p->pFKey; pFKey
bca0: 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70  ; pFKey=pFKey->p
bcb0: 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20  NextFrom){.     
bcc0: 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65   int nTo = strle
bcd0: 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20  n(pFKey->zTo) + 
bce0: 31 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  1;.      pFKey->
bcf0: 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69 74 65  pNextTo = sqlite
bd00: 33 48 61 73 68 46 69 6e 64 28 26 70 44 62 2d 3e  3HashFind(&pDb->
bd10: 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54  aFKey, pFKey->zT
bd20: 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73  o, nTo);.      s
bd30: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
bd40: 28 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46  (&pDb->aFKey, pF
bd50: 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70  Key->zTo, nTo, p
bd60: 46 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  FKey);.    }.   
bd70: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
bd80: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  le = 0;.    db->
bd90: 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62  nTable++;.    db
bda0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
bdb0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
bdc0: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
bdd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
bde0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  ./*.** The parse
bdf0: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
be00: 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  tine in order to
be10: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49   create a new VI
be20: 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  EW.*/.void sqlit
be30: 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20  e3CreateView(.  
be40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
be50: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
be60: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
be70: 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20  oken *pBegin,   
be80: 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
be90: 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
bea0: 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  s the statement 
beb0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
bec0: 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e1,     /* The t
bed0: 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
bee0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
bef0: 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  view */.  Token 
bf00: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
bf10: 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
bf20: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
bf30: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53   the view */.  S
bf40: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
bf50: 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74    /* A SELECT st
bf60: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c  atement that wil
bf70: 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
bf80: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
bf90: 73 54 65 6d 70 20 20 20 20 20 20 20 20 20 2f 2a  sTemp         /*
bfa0: 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50   TRUE for a TEMP
bfb0: 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 29 7b  ORARY view */.){
bfc0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
bfd0: 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  nt n;.  const un
bfe0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a  signed char *z;.
bff0: 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20    Token sEnd;.  
c000: 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20  DbFixer sFix;.  
c010: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 0a 20  Token *pName;.. 
c020: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
c030: 6c 65 28 70 50 61 72 73 65 2c 20 70 42 65 67 69  le(pParse, pBegi
c040: 6e 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  n, pName1, pName
c050: 32 2c 20 69 73 54 65 6d 70 2c 20 31 29 3b 0a 20  2, isTemp, 1);. 
c060: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
c070: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
c080: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
c090: 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
c0a0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
c0b0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
c0c0: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
c0d0: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
c0e0: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
c0f0: 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
c100: 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e  if( sqlite3FixIn
c110: 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
c120: 2c 20 70 2d 3e 69 44 62 2c 20 22 76 69 65 77 22  , p->iDb, "view"
c130: 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20  , pName).    && 
c140: 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74  sqlite3FixSelect
c150: 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29  (&sFix, pSelect)
c160: 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
c170: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
c180: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
c190: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  rn;.  }..  /* Ma
c1a0: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
c1b0: 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73   entire SELECT s
c1c0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
c1d0: 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
c1e0: 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66    ** This will f
c1f0: 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70  orce all the Exp
c200: 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73  r.token.z values
c210: 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
c220: 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
c230: 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f  d rather than po
c240: 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74  int to the input
c250: 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20   string - which 
c260: 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20  means that.  ** 
c270: 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73  they will persis
c280: 74 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  t after the curr
c290: 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
c2a0: 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e  () call returns.
c2b0: 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65  .  */.  p->pSele
c2c0: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
c2d0: 63 74 44 75 70 28 70 53 65 6c 65 63 74 29 3b 0a  ctDup(pSelect);.
c2e0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
c2f0: 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a  elete(pSelect);.
c300: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64    if( !pParse->d
c310: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
c320: 20 20 20 20 73 71 6c 69 74 65 33 56 69 65 77 47      sqlite3ViewG
c330: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
c340: 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20  arse, p);.  }.. 
c350: 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65   /* Locate the e
c360: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
c370: 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e   VIEW statement.
c380: 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e    Make sEnd poin
c390: 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e  t to.  ** the en
c3a0: 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d  d..  */.  sEnd =
c3b0: 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f   pParse->sLastTo
c3c0: 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e  ken;.  if( sEnd.
c3d0: 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e  z[0]!=0 && sEnd.
c3e0: 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20  z[0]!=';' ){.   
c3f0: 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e   sEnd.z += sEnd.
c400: 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20  n;.  }.  sEnd.n 
c410: 3d 20 30 3b 0a 20 20 6e 20 3d 20 73 45 6e 64 2e  = 0;.  n = sEnd.
c420: 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20  z - pBegin->z;. 
c430: 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69   z = (const unsi
c440: 67 6e 65 64 20 63 68 61 72 2a 29 70 42 65 67 69  gned char*)pBegi
c450: 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e  n->z;.  while( n
c460: 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27  >0 && (z[n-1]=='
c470: 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b  ;' || isspace(z[
c480: 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d  n-1])) ){ n--; }
c490: 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e  .  sEnd.z = &z[n
c4a0: 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  -1];.  sEnd.n = 
c4b0: 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c  1;..  /* Use sql
c4c0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74  ite3EndTable() t
c4d0: 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74  o add the view t
c4e0: 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  o the SQLITE_MAS
c4f0: 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  TER table */.  s
c500: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70  qlite3EndTable(p
c510: 50 61 72 73 65 2c 20 26 73 45 6e 64 2c 20 30 29  Parse, &sEnd, 0)
c520: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ;.  return;.}.#e
c530: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
c540: 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66  MIT_VIEW */..#if
c550: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c560: 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20  _VIEW./*.** The 
c570: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
c580: 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79  pTable is really
c590: 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69   a VIEW.  Fill i
c5a0: 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a  n the names of.*
c5b0: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  * the columns of
c5c0: 20 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65   the view in the
c5d0: 20 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72   pTable structur
c5e0: 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  e.  Return the n
c5f0: 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f  umber.** of erro
c600: 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  rs.  If an error
c610: 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61   is seen leave a
c620: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
c630: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
c640: 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
c650: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
c660: 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ames(Parse *pPar
c670: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  se, Table *pTabl
c680: 65 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  e){.  ExprList *
c690: 70 45 4c 69 73 74 3b 0a 20 20 53 65 6c 65 63 74  pEList;.  Select
c6a0: 20 2a 70 53 65 6c 3b 0a 20 20 54 61 62 6c 65 20   *pSel;.  Table 
c6b0: 2a 70 53 65 6c 54 61 62 3b 0a 20 20 69 6e 74 20  *pSelTab;.  int 
c6c0: 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73  nErr = 0;..  ass
c6d0: 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a  ert( pTable );..
c6e0: 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20    /* A positive 
c6f0: 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63  nCol means the c
c700: 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72  olumns names for
c710: 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20   this view are. 
c720: 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77   ** already know
c730: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  n..  */.  if( pT
c740: 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72  able->nCol>0 ) r
c750: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41  eturn 0;..  /* A
c760: 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69   negative nCol i
c770: 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b  s a special mark
c780: 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  er meaning that 
c790: 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  we are currently
c7a0: 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20  .  ** trying to 
c7b0: 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75  compute the colu
c7c0: 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65  mn names.  If we
c7d0: 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74   enter this rout
c7e0: 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20  ine with.  ** a 
c7f0: 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69  negative nCol, i
c800: 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d  t means two or m
c810: 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61  ore views form a
c820: 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73   loop, like this
c830: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
c840: 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20  CREATE VIEW one 
c850: 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
c860: 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43   two;.  **     C
c870: 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41  REATE VIEW two A
c880: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
c890: 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  one;.  **.  ** A
c8a0: 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20 65 72  ctually, this er
c8b0: 72 6f 72 20 69 73 20 63 61 75 67 68 74 20 70 72  ror is caught pr
c8c0: 65 76 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20  eviously and so 
c8d0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  the following te
c8e0: 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61  st.  ** should a
c8f0: 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 42 75 74  lways fail.  But
c900: 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 69   we will leave i
c910: 74 20 69 6e 20 70 6c 61 63 65 20 6a 75 73 74 20  t in place just 
c920: 74 6f 20 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f  to be safe..  */
c930: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
c940: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  Col<0 ){.    sql
c950: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
c960: 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69 73  rse, "view %s is
c970: 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69   circularly defi
c980: 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  ned", pTable->zN
c990: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
c9a0: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   1;.  }..  /* If
c9b0: 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
c9c0: 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65  , it means we ne
c9d0: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
c9e0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20  e table names.. 
c9f0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54   */.  assert( pT
ca00: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b  able->pSelect );
ca10: 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c 20   /* If nCol==0, 
ca20: 74 68 65 6e 20 70 54 61 62 6c 65 20 6d 75 73 74  then pTable must
ca30: 20 62 65 20 61 20 56 49 45 57 20 2a 2f 0a 20 20   be a VIEW */.  
ca40: 70 53 65 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 70  pSel = pTable->p
ca50: 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e 6f  Select;..  /* No
ca60: 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  te that the call
ca70: 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c   to sqlite3Resul
ca80: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77  tSetOfSelect() w
ca90: 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20  ill expand any. 
caa0: 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73   ** "*" elements
cab0: 20 69 6e 20 74 68 69 73 20 6c 69 73 74 2e 20 20   in this list.  
cac0: 42 75 74 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  But we will need
cad0: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
cae0: 6c 69 73 74 0a 20 20 2a 2a 20 62 61 63 6b 20 74  list.  ** back t
caf0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
cb00: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 66 74  onfiguration aft
cb10: 65 72 77 61 72 64 73 2c 20 73 6f 20 77 65 20 73  erwards, so we s
cb20: 61 76 65 20 61 20 63 6f 70 79 20 6f 66 0a 20 20  ave a copy of.  
cb30: 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** the original 
cb40: 69 6e 20 70 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a  in pEList..  */.
cb50: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 2d    pEList = pSel-
cb60: 3e 70 45 4c 69 73 74 3b 0a 20 20 70 53 65 6c 2d  >pEList;.  pSel-
cb70: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
cb80: 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 45 4c  3ExprListDup(pEL
cb90: 69 73 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  ist);.  if( pSel
cba0: 2d 3e 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  ->pEList==0 ){. 
cbb0: 20 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20     pSel->pEList 
cbc0: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 72 65  = pEList;.    re
cbd0: 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c 6c  turn 1;  /* Mall
cbe0: 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d  oc failed */.  }
cbf0: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  .  pTable->nCol 
cc00: 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62 20  = -1;.  pSelTab 
cc10: 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
cc20: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
cc30: 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 69  e, 0, pSel);.  i
cc40: 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20  f( pSelTab ){.  
cc50: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
cc60: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
cc70: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
cc80: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
cc90: 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20     pTable->aCol 
cca0: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
ccb0: 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43  .    pSelTab->nC
ccc0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c  ol = 0;.    pSel
ccd0: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
cce0: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
ccf0: 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62  Table(0, pSelTab
cd00: 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70  );.    DbSetProp
cd10: 65 72 74 79 28 70 50 61 72 73 65 2d 3e 64 62 2c  erty(pParse->db,
cd20: 20 70 54 61 62 6c 65 2d 3e 69 44 62 2c 20 44 42   pTable->iDb, DB
cd30: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a  _UnresetViews);.
cd40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61    }else{.    pTa
cd50: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  ble->nCol = 0;. 
cd60: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20     nErr++;.  }. 
cd70: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 55 6e   sqlite3SelectUn
cd80: 62 69 6e 64 28 70 53 65 6c 29 3b 0a 20 20 73 71  bind(pSel);.  sq
cd90: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
cda0: 65 74 65 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74  ete(pSel->pEList
cdb0: 29 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73  );.  pSel->pELis
cdc0: 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 72 65  t = pEList;.  re
cdd0: 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23  turn nErr;  .}.#
cde0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
cdf0: 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69  OMIT_VIEW */..#i
ce00: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ce10: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65  T_VIEW./*.** Cle
ce20: 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
ce30: 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56  mes from every V
ce40: 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20  IEW in database 
ce50: 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  idx..*/.static v
ce60: 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
ce70: 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a  setAll(sqlite3 *
ce80: 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20  db, int idx){.  
ce90: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69  HashElem *i;.  i
cea0: 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  f( !DbHasPropert
ceb0: 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
cec0: 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65  resetViews) ) re
ced0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71  turn;.  for(i=sq
cee0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
cef0: 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 74 62 6c 48  b->aDb[idx].tblH
cf00: 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74  ash); i; i=sqlit
cf10: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
cf20: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
cf30: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
cf40: 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  i);.    if( pTab
cf50: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
cf60: 20 20 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f     sqliteResetCo
cf70: 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b  lumnNames(pTab);
cf80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43  .    }.  }.  DbC
cf90: 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c  learProperty(db,
cfa0: 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
cfb0: 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a  Views);.}.#else.
cfc0: 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56  # define sqliteV
cfd0: 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29  iewResetAll(A,B)
cfe0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
cff0: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
d000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
d010: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
d020: 20 74 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a   the VDBE to adj
d030: 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ust the internal
d040: 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20   schema.** used 
d050: 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74  by SQLite when t
d060: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d  he btree layer m
d070: 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f  oves a table roo
d080: 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72  t page. The.** r
d090: 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61  oot-page of a ta
d0a0: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20  ble or index in 
d0b0: 64 61 74 61 62 61 73 65 20 69 44 62 20 68 61 73  database iDb has
d0c0: 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46   changed from iF
d0d0: 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a  rom.** to iTo..*
d0e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
d0f0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
d100: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f  .void sqlite3Roo
d110: 74 50 61 67 65 4d 6f 76 65 64 28 44 62 20 2a 70  tPageMoved(Db *p
d120: 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  Db, int iFrom, i
d130: 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45  nt iTo){.  HashE
d140: 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 0a 20  lem *pElem;.  . 
d150: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
d160: 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d  eHashFirst(&pDb-
d170: 3e 74 62 6c 48 61 73 68 29 3b 20 70 45 6c 65 6d  >tblHash); pElem
d180: 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
d190: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
d1a0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
d1b0: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
d1c0: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
d1d0: 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pTab->tnum==iFr
d1e0: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  om ){.      pTab
d1f0: 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
d200: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
d210: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 45 6c 65  }.  }.  for(pEle
d220: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
d230: 74 28 26 70 44 62 2d 3e 69 64 78 48 61 73 68 29  t(&pDb->idxHash)
d240: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
d250: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
d260: 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78  lem)){.    Index
d270: 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48   *pIdx = sqliteH
d280: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
d290: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e      if( pIdx->tn
d2a0: 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
d2b0: 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20     pIdx->tnum = 
d2c0: 69 54 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  iTo;.      retur
d2d0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  n;.    }.  }.  a
d2e0: 73 73 65 72 74 28 30 29 3b 0a 7d 0a 23 65 6e 64  ssert(0);.}.#end
d2f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
d300: 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 68  code to erase th
d310: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
d320: 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66 72  t-page iTable fr
d330: 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  om database iDb.
d340: 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63  .** Also write c
d350: 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ode to modify th
d360: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
d370: 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e  table and intern
d380: 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20  al schema.** if 
d390: 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  a root-page of a
d3a0: 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
d3b0: 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
d3c0: 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a  ee-layer whilst.
d3d0: 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c  ** erasing iTabl
d3e0: 65 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70  e (this can happ
d3f0: 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d  en with an auto-
d400: 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29  vacuum database)
d410: 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
d420: 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67  d destroyRootPag
d430: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
d440: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74   int iTable, int
d450: 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76   iDb){.  Vdbe *v
d460: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
d470: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  e(pParse);.  sql
d480: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d490: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61   OP_Destroy, iTa
d4a0: 62 6c 65 2c 20 69 44 62 29 3b 0a 23 69 66 6e 64  ble, iDb);.#ifnd
d4b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
d4c0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f  UTOVACUUM.  /* O
d4d0: 50 5f 44 65 73 74 72 6f 79 20 70 75 73 68 65 73  P_Destroy pushes
d4e0: 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 6e 74 6f   an integer onto
d4f0: 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 74   the stack. If t
d500: 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a  his integer.  **
d510: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
d520: 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f  en it is the roo
d530: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
d540: 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74   a table moved t
d550: 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20  o.  ** location 
d560: 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c  iTable. The foll
d570: 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66  owing code modif
d580: 69 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ies the sqlite_m
d590: 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20  aster table to. 
d5a0: 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73   ** reflect this
d5b0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
d5c0: 22 23 30 22 20 69 6e 20 74 68 65 20 53 51 4c 20  "#0" in the SQL 
d5d0: 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e  is a special con
d5e0: 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73  stant that means
d5f0: 20 77 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a   whatever value.
d600: 20 20 2a 2a 20 69 73 20 6f 6e 20 74 68 65 20 74    ** is on the t
d610: 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
d620: 20 20 53 65 65 20 73 71 6c 69 74 65 33 52 65 67    See sqlite3Reg
d630: 69 73 74 65 72 45 78 70 72 28 29 2e 0a 20 20 2a  isterExpr()..  *
d640: 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65  /.  sqlite3Neste
d650: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
d660: 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e       "UPDATE %Q.
d670: 25 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d  %s SET rootpage=
d680: 25 64 20 57 48 45 52 45 20 23 30 20 41 4e 44 20  %d WHERE #0 AND 
d690: 72 6f 6f 74 70 61 67 65 3d 23 30 22 2c 0a 20 20  rootpage=#0",.  
d6a0: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61     pParse->db->a
d6b0: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
d6c0: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
d6d0: 2c 20 69 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69  , iTable);.#endi
d6e0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  f.}../*.** Write
d6f0: 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72   VDBE code to er
d700: 61 73 65 20 74 61 62 6c 65 20 70 54 61 62 20 61  ase table pTab a
d710: 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65  nd all associate
d720: 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73  d indices on dis
d730: 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70  k..** Code to up
d740: 64 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f  date the sqlite_
d750: 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e  master tables an
d760: 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  d internal schem
d770: 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a  a definitions.**
d780: 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d   in case a root-
d790: 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  page belonging t
d7a0: 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  o another table 
d7b0: 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20  is moved by the 
d7c0: 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69  btree layer.** i
d7d0: 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68  s also added (th
d7e0: 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69  is can happen wi
d7f0: 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  th an auto-vacuu
d800: 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a  m database)..*/.
d810: 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74  static void dest
d820: 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a  royTable(Parse *
d830: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
d840: 54 61 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  Tab){.#ifdef SQL
d850: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
d860: 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  UUM.  Index *pId
d870: 78 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  x;.  destroyRoot
d880: 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 54 61  Page(pParse, pTa
d890: 62 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 69  b->tnum, pTab->i
d8a0: 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  Db);.  for(pIdx=
d8b0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
d8c0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
d8d0: 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72  Next){.    destr
d8e0: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
d8f0: 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70  e, pIdx->tnum, p
d900: 49 64 78 2d 3e 69 44 62 29 3b 0a 20 20 7d 0a 23  Idx->iDb);.  }.#
d910: 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65  else.  /* If the
d920: 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65   database may be
d930: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70   auto-vacuum cap
d940: 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f  able (if SQLITE_
d950: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
d960: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69    ** is not defi
d970: 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73  ned), then it is
d980: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61   important to ca
d990: 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e  ll OP_Destroy on
d9a0: 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20   the.  ** table 
d9b0: 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70  and index root-p
d9c0: 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73  ages in order, s
d9d0: 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65  tarting with the
d9e0: 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20   numerically .  
d9f0: 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  ** largest root-
da00: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69  page number. Thi
da10: 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  s guarantees tha
da20: 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  t none of the ro
da30: 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f  ot-pages.  ** to
da40: 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73   be destroyed is
da50: 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e   relocated by an
da60: 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74   earlier OP_Dest
da70: 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65  roy. i.e. if the
da80: 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  .  ** following 
da90: 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a  were coded:.  **
daa0: 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  ** OP_Destroy
dab0: 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20   4 0.  ** ....  
dac0: 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  ** OP_Destroy 5 
dad0: 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20  0.  **.  ** and 
dae0: 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70  root page 5 happ
daf0: 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c  ened to be the l
db00: 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
db10: 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20   number in the. 
db20: 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
db30: 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77  en root page 5 w
db40: 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f  ould be moved to
db50: 20 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a   page 4 by the .
db60: 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79    ** "OP_Destroy
db70: 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68   4 0" opcode. Th
db80: 65 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50  e subsequent "OP
db90: 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f  _Destroy 5 0" wo
dba0: 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66  uld hit.  ** a f
dbb0: 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20  ree-list page.. 
dbc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
dbd0: 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69   pTab->tnum;.  i
dbe0: 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20  nt iDestroyed = 
dbf0: 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29  0;..  while( 1 )
dc00: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
dc10: 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67  x;.    int iLarg
dc20: 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  est = 0;..    if
dc30: 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20  ( iDestroyed==0 
dc40: 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79  || iTab<iDestroy
dc50: 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72  ed ){.      iLar
dc60: 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20  gest = iTab;.   
dc70: 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d   }.    for(pIdx=
dc80: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
dc90: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
dca0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
dcb0: 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e   iIdx = pIdx->tn
dcc0: 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  um;.      assert
dcd0: 28 20 70 49 64 78 2d 3e 69 44 62 3d 3d 70 54 61  ( pIdx->iDb==pTa
dce0: 62 2d 3e 69 44 62 20 29 3b 0a 20 20 20 20 20 20  b->iDb );.      
dcf0: 69 66 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d  if( (iDestroyed=
dd00: 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73  =0 || (iIdx<iDes
dd10: 74 72 6f 79 65 64 29 29 20 26 26 20 69 49 64 78  troyed)) && iIdx
dd20: 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20  >iLargest ){.   
dd30: 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20       iLargest = 
dd40: 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iIdx;.      }.  
dd50: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72    }.    if( iLar
dd60: 67 65 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  gest==0 ) return
dd70: 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  ;.    destroyRoo
dd80: 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c  tPage(pParse, iL
dd90: 61 72 67 65 73 74 2c 20 70 54 61 62 2d 3e 69 44  argest, pTab->iD
dda0: 62 29 3b 0a 20 20 20 20 69 44 65 73 74 72 6f 79  b);.    iDestroy
ddb0: 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20  ed = iLargest;. 
ddc0: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
ddd0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
dde0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20  is called to do 
ddf0: 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52  the work of a DR
de00: 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  OP TABLE stateme
de10: 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20  nt..** pName is 
de20: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
de30: 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70  table to be drop
de40: 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ped..*/.void sql
de50: 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61  ite3DropTable(Pa
de60: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
de70: 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
de80: 20 69 73 56 69 65 77 29 7b 0a 20 20 54 61 62 6c   isView){.  Tabl
de90: 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20  e *pTab;.  Vdbe 
dea0: 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
deb0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
dec0: 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66    int iDb;..  if
ded0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
dee0: 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  | sqlite3_malloc
def0: 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65  _failed ) goto e
df00: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
df10: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
df20: 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54  >nSrc==1 );.  pT
df30: 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
df40: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
df50: 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
df60: 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
df70: 44 61 74 61 62 61 73 65 29 3b 0a 0a 20 20 69 66  Database);..  if
df80: 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f  ( pTab==0 ) goto
df90: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
dfa0: 3b 0a 20 20 69 44 62 20 3d 20 70 54 61 62 2d 3e  ;.  iDb = pTab->
dfb0: 69 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69  iDb;.  assert( i
dfc0: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
dfd0: 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65 66 20  >nDb );.#ifndef 
dfe0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
dff0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
e000: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
e010: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
e020: 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
e030: 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20  pTab->iDb);.    
e040: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
e050: 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e  = db->aDb[pTab->
e060: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
e070: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
e080: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
e090: 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
e0a0: 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20  , 0, zDb)){.    
e0b0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
e0c0: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
e0d0: 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
e0e0: 20 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31        if( iDb==1
e0f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
e100: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
e110: 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
e120: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
e130: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
e140: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a  P_VIEW;.      }.
e150: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e160: 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20   if( iDb==1 ){. 
e170: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
e180: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
e190: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
e1a0: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
e1b0: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41  = SQLITE_DROP_TA
e1c0: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
e1d0: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
e1e0: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
e1f0: 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e  se, code, pTab->
e200: 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
e210: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
e220: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
e230: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
e240: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
e250: 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
e260: 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  TE, pTab->zName,
e270: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
e280: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
e290: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
e2a0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
e2b0: 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c  Tab->readOnly ||
e2c0: 20 70 54 61 62 3d 3d 64 62 2d 3e 61 44 62 5b 69   pTab==db->aDb[i
e2d0: 44 62 5d 2e 70 53 65 71 54 61 62 20 29 7b 0a 20  Db].pSeqTab ){. 
e2e0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
e2f0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
e300: 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
e310: 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e  dropped", pTab->
e320: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
e330: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
e340: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 56 69  ;.  }.  if( isVi
e350: 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
e360: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
e370: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
e380: 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
e390: 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20  TABLE to delete 
e3a0: 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d  table %s", pTab-
e3b0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
e3c0: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
e3d0: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73  e;.  }.  if( !is
e3e0: 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
e3f0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
e400: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
e410: 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56  rse, "use DROP V
e420: 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69  IEW to delete vi
e430: 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  ew %s", pTab->zN
e440: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
e450: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
e460: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
e470: 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
e480: 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  e the table from
e490: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
e4a0: 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a  e.  ** on disk..
e4b0: 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
e4c0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
e4d0: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
e4e0: 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
e4f0: 67 65 72 3b 0a 20 20 20 20 69 6e 74 20 69 44 62  ger;.    int iDb
e500: 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20   = pTab->iDb;.  
e510: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
e520: 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 73  >aDb[iDb];.    s
e530: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
e540: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
e550: 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20  , 0, iDb);..    
e560: 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67  /* Drop all trig
e570: 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  gers associated 
e580: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62  with the table b
e590: 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f  eing dropped. Co
e5a0: 64 65 0a 20 20 20 20 2a 2a 20 69 73 20 67 65 6e  de.    ** is gen
e5b0: 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65  erated to remove
e5c0: 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71   entries from sq
e5d0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f  lite_master and/
e5e0: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
e5f0: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20  _temp_master if 
e600: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
e610: 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20  .    pTrigger = 
e620: 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a  pTab->pTrigger;.
e630: 20 20 20 20 77 68 69 6c 65 28 20 70 54 72 69 67      while( pTrig
e640: 67 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ger ){.      ass
e650: 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 69  ert( pTrigger->i
e660: 44 62 3d 3d 69 44 62 20 7c 7c 20 70 54 72 69 67  Db==iDb || pTrig
e670: 67 65 72 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a 20  ger->iDb==1 );. 
e680: 20 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70       sqlite3Drop
e690: 54 72 69 67 67 65 72 50 74 72 28 70 50 61 72 73  TriggerPtr(pPars
e6a0: 65 2c 20 70 54 72 69 67 67 65 72 2c 20 31 29 3b  e, pTrigger, 1);
e6b0: 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72 20  .      pTrigger 
e6c0: 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78  = pTrigger->pNex
e6d0: 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  t;.    }..#ifnde
e6e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
e6f0: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
e700: 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e  /* Remove any en
e710: 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c  tries of the sql
e720: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
e730: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
e740: 74 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61  th.    ** the ta
e750: 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
e760: 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  d. This is done 
e770: 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65  before the table
e780: 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 20 20   is dropped.    
e790: 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20  ** at the btree 
e7a0: 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74  level, in case t
e7b0: 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
e7c0: 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74  ce table needs t
e7d0: 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61 73  o.    ** move as
e7e0: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
e7f0: 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65   drop (can happe
e800: 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  n in auto-vacuum
e810: 20 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a 20   mode)..    */. 
e820: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 75 74     if( pTab->aut
e830: 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 73 71  oInc ){.      sq
e840: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
e850: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
e860: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73   "DELETE FROM %s
e870: 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  .sqlite_sequence
e880: 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c   WHERE name=%Q",
e890: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  .        pDb->zN
e8a0: 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
e8b0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
e8c0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
e8d0: 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d  rop all SQLITE_M
e8e0: 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20  ASTER table and 
e8f0: 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68  index entries th
e900: 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a  at refer to the.
e910: 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68      ** table. Th
e920: 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c  e program name l
e930: 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65  oops through the
e940: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
e950: 64 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a  d deletes.    **
e960: 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20   every row that 
e970: 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
e980: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  e of the same na
e990: 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65  me as the one be
e9a0: 69 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70  ing.    ** dropp
e9b0: 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65  ed. Triggers are
e9c0: 20 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74   handled seperat
e9d0: 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72  ely because a tr
e9e0: 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20  igger can be.   
e9f0: 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74   ** created in t
ea00: 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
ea10: 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
ea20: 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68  a table in anoth
ea30: 65 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  er.    ** databa
ea40: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  se..    */.    s
ea50: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
ea60: 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
ea70: 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
ea80: 25 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f  %Q.%s WHERE tbl_
ea90: 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65  name=%Q and type
eaa0: 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20  !='trigger'",.  
eab0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
eac0: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
ead0: 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  Db), pTab->zName
eae0: 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56 69  );.    if( !isVi
eaf0: 65 77 20 29 7b 0a 20 20 20 20 20 20 64 65 73 74  ew ){.      dest
eb00: 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c  royTable(pParse,
eb10: 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 0a 20   pTab);.    }.. 
eb20: 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
eb30: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f   table entry fro
eb40: 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72  m SQLite's inter
eb50: 6e 61 6c 20 73 63 68 65 6d 61 0a 20 20 20 20 2a  nal schema.    *
eb60: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
eb70: 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 54  eOp3(v, OP_DropT
eb80: 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 70 54  able, iDb, 0, pT
eb90: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
eba0: 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52   }.  sqliteViewR
ebb0: 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29  esetAll(db, iDb)
ebc0: 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  ;..exit_drop_tab
ebd0: 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  le:.  sqlite3Src
ebe0: 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65  ListDelete(pName
ebf0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
ec00: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
ec10: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  ed to create a n
ec20: 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  ew foreign key o
ec30: 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63  n the table.** c
ec40: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
ec50: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46  onstruction.  pF
ec60: 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65  romCol determine
ec70: 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a  s which columns.
ec80: 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ** in the curren
ec90: 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f  t table point to
eca0: 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
ecb0: 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d  .  If pFromCol==
ecc0: 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63  0 then.** connec
ecd0: 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65  t the key to the
ece0: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73   last column ins
ecf0: 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74  erted.  pTo is t
ed00: 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68  he name of.** th
ed10: 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65 64  e table referred
ed20: 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20   to.  pToCol is 
ed30: 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  a list of tables
ed40: 20 69 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a   in the other.**
ed50: 20 70 54 6f 20 74 61 62 6c 65 20 74 68 61 74 20   pTo table that 
ed60: 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
ed70: 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67  points to.  flag
ed80: 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a  s contains all.*
ed90: 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * information ab
eda0: 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  out the conflict
edb0: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
edc0: 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65 64  rithms specified
edd0: 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45  .** in the ON DE
ede0: 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20  LETE, ON UPDATE 
edf0: 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c  and ON INSERT cl
ee00: 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  auses..**.** An 
ee10: 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20 69  FKey structure i
ee20: 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64  s created and ad
ee30: 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
ee40: 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e   currently.** un
ee50: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
ee60: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e   in the pParse->
ee70: 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e  pNewTable field.
ee80: 20 20 54 68 65 20 6e 65 77 20 46 4b 65 79 0a 2a    The new FKey.*
ee90: 2a 20 69 73 20 6e 6f 74 20 6c 69 6e 6b 65 64 20  * is not linked 
eea0: 69 6e 74 6f 20 64 62 2d 3e 61 46 4b 65 79 20 61  into db->aFKey a
eeb0: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 2d 20 74  t this point - t
eec0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 68 61 70  hat does not hap
eed0: 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73 71 6c  pen.** until sql
eee0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a  ite3EndTable()..
eef0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67  **.** The foreig
ef00: 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72  n key is set for
ef10: 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65   IMMEDIATE proce
ef20: 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71  ssing.  A subseq
ef30: 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20  uent call.** to 
ef40: 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
ef50: 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63  ignKey() might c
ef60: 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45  hange this to DE
ef70: 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20  FERRED..*/.void 
ef80: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72  sqlite3CreateFor
ef90: 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65  eignKey(.  Parse
efa0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
efb0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
efc0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
efd0: 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20   *pFromCol,  /* 
efe0: 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20  Columns in this 
eff0: 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74  table that point
f000: 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20   to other table 
f010: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c  */.  Token *pTo,
f020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
f030: 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74  e of the other t
f040: 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
f050: 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f  st *pToCol,    /
f060: 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  * Columns in the
f070: 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
f080: 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
f090: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69         /* Confli
f0a0: 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
f0b0: 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a  gorithms. */.){.
f0c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f0d0: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
f0e0: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20    FKey *pFKey = 
f0f0: 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  0;.  Table *p = 
f100: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
f110: 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  e;.  int nByte;.
f120: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
f130: 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  Col;.  char *z;.
f140: 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d  .  assert( pTo!=
f150: 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  0 );.  if( p==0 
f160: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
f170: 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20  ) goto fk_end;. 
f180: 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30   if( pFromCol==0
f190: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   ){.    int iCol
f1a0: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
f1b0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 67    if( iCol<0 ) g
f1c0: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
f1d0: 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54  if( pToCol && pT
f1e0: 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29  oCol->nExpr!=1 )
f1f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
f200: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
f210: 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20  "foreign key on 
f220: 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20 73  %s".         " s
f230: 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20  hould reference 
f240: 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20  only one column 
f250: 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20  of table %T",.  
f260: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69         p->aCol[i
f270: 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29  Col].zName, pTo)
f280: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ;.      goto fk_
f290: 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  end;.    }.    n
f2a0: 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Col = 1;.  }else
f2b0: 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70   if( pToCol && p
f2c0: 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46  ToCol->nExpr!=pF
f2d0: 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b  romCol->nExpr ){
f2e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
f2f0: 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
f300: 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20       "number of 
f310: 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69  columns in forei
f320: 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20  gn key does not 
f330: 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72  match the number
f340: 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63   of ".        "c
f350: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
f360: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29  ferenced table")
f370: 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  ;.    goto fk_en
f380: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
f390: 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d  nCol = pFromCol-
f3a0: 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42  >nExpr;.  }.  nB
f3b0: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46  yte = sizeof(*pF
f3c0: 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65  Key) + nCol*size
f3d0: 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30  of(pFKey->aCol[0
f3e0: 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b  ]) + pTo->n + 1;
f3f0: 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
f400: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
f410: 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69  pToCol->nExpr; i
f420: 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  ++){.      nByte
f430: 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f   += strlen(pToCo
f440: 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b  l->a[i].zName) +
f450: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
f460: 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d 61  pFKey = sqliteMa
f470: 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20  lloc( nByte );. 
f480: 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 20   if( pFKey==0 ) 
f490: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 70  goto fk_end;.  p
f4a0: 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b  FKey->pFrom = p;
f4b0: 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  .  pFKey->pNextF
f4c0: 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a  rom = p->pFKey;.
f4d0: 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46    z = (char*)&pF
f4e0: 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d  Key[1];.  pFKey-
f4f0: 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75 63 74 20  >aCol = (struct 
f500: 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20  sColMap*)z;.  z 
f510: 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  += sizeof(struct
f520: 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a   sColMap)*nCol;.
f530: 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a    pFKey->zTo = z
f540: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54  ;.  memcpy(z, pT
f550: 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20  o->z, pTo->n);. 
f560: 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a   z[pTo->n] = 0;.
f570: 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b    z += pTo->n+1;
f580: 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54  .  pFKey->pNextT
f590: 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e  o = 0;.  pFKey->
f5a0: 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69  nCol = nCol;.  i
f5b0: 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
f5c0: 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f  {.    pFKey->aCo
f5d0: 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e  l[0].iFrom = p->
f5e0: 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  nCol-1;.  }else{
f5f0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
f600: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
f610: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
f620: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f  or(j=0; j<p->nCo
f630: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
f640: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
f650: 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  Cmp(p->aCol[j].z
f660: 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Name, pFromCol->
f670: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  a[i].zName)==0 )
f680: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65  {.          pFKe
f690: 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d  y->aCol[i].iFrom
f6a0: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
f6b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
f6c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f6d0: 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b  f( j>=p->nCol ){
f6e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f6f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f700: 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b   .          "unk
f710: 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73  nown column \"%s
f720: 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  \" in foreign ke
f730: 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a  y definition", .
f740: 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43            pFromC
f750: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
f760: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  .        goto fk
f770: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
f780: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54    }.  }.  if( pT
f790: 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28  oCol ){.    for(
f7a0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
f7b0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
f7c0: 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e   strlen(pToCol->
f7d0: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
f7e0: 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69     pFKey->aCol[i
f7f0: 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20  ].zCol = z;.    
f800: 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43    memcpy(z, pToC
f810: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  ol->a[i].zName, 
f820: 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d  n);.      z[n] =
f830: 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e   0;.      z += n
f840: 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  +1;.    }.  }.  
f850: 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
f860: 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e  d = 0;.  pFKey->
f870: 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61  deleteConf = fla
f880: 67 73 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b  gs & 0xff;.  pFK
f890: 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d  ey->updateConf =
f8a0: 20 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26   (flags >> 8 ) &
f8b0: 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e   0xff;.  pFKey->
f8c0: 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c  insertConf = (fl
f8d0: 61 67 73 20 3e 3e 20 31 36 20 29 20 26 20 30 78  ags >> 16 ) & 0x
f8e0: 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74  ff;..  /* Link t
f8f0: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74  he foreign key t
f900: 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74  o the table as t
f910: 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20  he last step..  
f920: 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20  */.  p->pFKey = 
f930: 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d  pFKey;.  pFKey =
f940: 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73   0;..fk_end:.  s
f950: 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79 29  qliteFree(pFKey)
f960: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ;.#endif /* !def
f970: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
f980: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f  _FOREIGN_KEY) */
f990: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
f9a0: 73 74 44 65 6c 65 74 65 28 70 46 72 6f 6d 43 6f  stDelete(pFromCo
f9b0: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  l);.  sqlite3Exp
f9c0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 54 6f 43  rListDelete(pToC
f9d0: 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ol);.}../*.** Th
f9e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
f9f0: 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49  lled when an INI
fa00: 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
fa10: 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45   or INITIALLY DE
fa20: 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65  FERRED.** clause
fa30: 20 69 73 20 73 65 65 6e 20 61 73 20 70 61 72 74   is seen as part
fa40: 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65   of a foreign ke
fa50: 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54  y definition.  T
fa60: 68 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a  he isDeferred.**
fa70: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 31 20   parameter is 1 
fa80: 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45  for INITIALLY DE
fa90: 46 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72  FERRED and 0 for
faa0: 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
fab0: 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68  IATE..** The beh
fac0: 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73  avior of the mos
fad0: 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74  t recently creat
fae0: 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  ed foreign key i
faf0: 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63  s adjusted.** ac
fb00: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f  cordingly..*/.vo
fb10: 69 64 20 73 71 6c 69 74 65 33 44 65 66 65 72 46  id sqlite3DeferF
fb20: 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20  oreignKey(Parse 
fb30: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44  *pParse, int isD
fb40: 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65  eferred){.#ifnde
fb50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
fb60: 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c  REIGN_KEY.  Tabl
fb70: 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20  e *pTab;.  FKey 
fb80: 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70  *pFKey;.  if( (p
fb90: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
fba0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28  ewTable)==0 || (
fbb0: 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46  pFKey = pTab->pF
fbc0: 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Key)==0 ) return
fbd0: 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  ;.  pFKey->isDef
fbe0: 65 72 72 65 64 20 3d 20 69 73 44 65 66 65 72 72  erred = isDeferr
fbf0: 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  ed;.#endif.}../*
fc00: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
fc10: 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73  e that will eras
fc20: 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64  e and refill ind
fc30: 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20  ex *pIdx.  This 
fc40: 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e  is.** used to in
fc50: 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79  itialize a newly
fc60: 20 63 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f   created index o
fc70: 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74  r to recompute t
fc80: 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
fc90: 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73   an index in res
fca0: 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44  ponse to a REIND
fcb0: 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  EX command..**.*
fcc0: 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65  * if memRootPage
fcd0: 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65   is not negative
fce0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
fcf0: 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77  the index is new
fd00: 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20  ly.** created.  
fd10: 54 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  The memory cell 
fd20: 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d  specified by mem
fd30: 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e  RootPage contain
fd40: 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
fd50: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
fd60: 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52   index.  If memR
fd70: 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61 74  ootPage is negat
fd80: 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ive, then.** the
fd90: 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
fda0: 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62  xists and must b
fdb0: 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65  e cleared before
fdc0: 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20   being refilled 
fdd0: 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20  and.** the root 
fde0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
fdf0: 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65  he index is take
fe00: 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74  n from pIndex->t
fe10: 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  num..*/.static v
fe20: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c  oid sqlite3Refil
fe30: 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  lIndex(Parse *pP
fe40: 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e  arse, Index *pIn
fe50: 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74  dex, int memRoot
fe60: 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Page){.  Table *
fe70: 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70  pTab = pIndex->p
fe80: 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74  Table;  /* The t
fe90: 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64  able that is ind
fea0: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  exed */.  int iT
feb0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
fec0: 62 3b 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65  b;       /* Btre
fed0: 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f  e cursor used fo
fee0: 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20  r pTab */.  int 
fef0: 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iIdx = pParse->n
ff00: 54 61 62 2b 31 3b 20 20 20 20 20 2f 2a 20 42 74  Tab+1;     /* Bt
ff10: 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  ree cursor used 
ff20: 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20  for pIndex */.  
ff30: 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ff50: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70  * Address of top
ff60: 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e   of loop */.  in
ff70: 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  t tnum;         
ff80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ff90: 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64  Root page of ind
ffa0: 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ex */.  Vdbe *v;
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffc0: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
ffd0: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
ffe0: 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
fff0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 55 6e 69  e */.  int isUni
10000 71 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  que;            
10010 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
10020 72 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  r a unique index
10030 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
10040 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
10050 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c  ZATION.  if( sql
10060 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
10070 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49  arse, SQLITE_REI
10080 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  NDEX, pIndex->zN
10090 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 70 50  ame, 0,.      pP
100a0 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 70 49  arse->db->aDb[pI
100b0 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65  ndex->iDb].zName
100c0 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e   ) ){.    return
100d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
100e0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
100f0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
10100 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
10110 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61  .  if( memRootPa
10120 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ge>=0 ){.    sql
10130 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10140 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d   OP_MemLoad, mem
10150 52 6f 6f 74 50 61 67 65 2c 20 30 29 3b 0a 20 20  RootPage, 0);.  
10160 20 20 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 7d 65    tnum = 0;.  }e
10170 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  lse{.    tnum = 
10180 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20  pIndex->tnum;.  
10190 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
101a0 4f 70 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20  Op(v, OP_Clear, 
101b0 74 6e 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44  tnum, pIndex->iD
101c0 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  b);.  }.  sqlite
101d0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
101e0 5f 49 6e 74 65 67 65 72 2c 20 70 49 6e 64 65 78  _Integer, pIndex
101f0 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c  ->iDb, 0);.  sql
10200 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
10210 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64  P_OpenWrite, iId
10220 78 2c 20 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20  x, tnum,.       
10230 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
10240 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79  ar*)&pIndex->key
10250 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  Info, P3_KEYINFO
10260 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
10270 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
10280 67 65 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20  ger, pTab->iDb, 
10290 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
102a0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
102b0 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 54 61  nRead, iTab, pTa
102c0 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 73 71 6c 69  b->tnum);.  sqli
102d0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
102e0 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
102f0 2c 20 69 54 61 62 2c 20 70 54 61 62 2d 3e 6e 43  , iTab, pTab->nC
10300 6f 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  ol);.  addr1 = s
10310 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10320 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54  v, OP_Rewind, iT
10330 61 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  ab, 0);.  sqlite
10340 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
10350 79 28 76 2c 20 70 49 6e 64 65 78 2c 20 69 54 61  y(v, pIndex, iTa
10360 62 29 3b 0a 20 20 69 73 55 6e 69 71 75 65 20 3d  b);.  isUnique =
10370 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
10380 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 73 71 6c  !=OE_None;.  sql
10390 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
103a0 20 4f 50 5f 49 64 78 50 75 74 2c 20 69 49 64 78   OP_IdxPut, iIdx
103b0 2c 20 69 73 55 6e 69 71 75 65 29 3b 0a 20 20 69  , isUnique);.  i
103c0 66 28 20 69 73 55 6e 69 71 75 65 20 29 7b 0a 20  f( isUnique ){. 
103d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
103e0 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 69  angeP3(v, -1, "i
103f0 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61  ndexed columns a
10400 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20  re not unique", 
10410 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a  P3_STATIC);.  }.
10420 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10430 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  Op(v, OP_Next, i
10440 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20  Tab, addr1+1);. 
10450 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
10460 67 65 50 32 28 76 2c 20 61 64 64 72 31 2c 20 73  geP2(v, addr1, s
10470 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
10480 74 41 64 64 72 28 76 29 29 3b 0a 20 20 73 71 6c  tAddr(v));.  sql
10490 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
104a0 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 2c   OP_Close, iTab,
104b0 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
104c0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
104d0 6f 73 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a 7d  ose, iIdx, 0);.}
104e0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
104f0 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61   new index for a
10500 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 49  n SQL table.  pI
10510 6e 64 65 78 20 69 73 20 74 68 65 20 6e 61 6d 65  ndex is the name
10520 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
10530 2a 20 61 6e 64 20 70 54 61 62 6c 65 20 69 73 20  * and pTable is 
10540 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
10550 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
10560 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f   be indexed.  Bo
10570 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e  th will .** be N
10580 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72  ULL for a primar
10590 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65  y key or an inde
105a0 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  x that is create
105b0 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a  d to satisfy a.*
105c0 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
105d0 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20  int.  If pTable 
105e0 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e  and pIndex are N
105f0 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d  ULL, use pParse-
10600 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73  >pNewTable.** as
10610 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
10620 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73   indexed.  pPars
10630 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20  e->pNewTable is 
10640 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a  a table that is.
10650 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
10660 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
10670 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  y a CREATE TABLE
10680 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
10690 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73  * pList is a lis
106a0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
106b0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69  be indexed.  pLi
106c0 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  st will be NULL 
106d0 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20  if this.** is a 
106e0 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75  primary key or u
106f0 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74  nique-constraint
10700 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
10710 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ent column added
10720 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65  .** to the table
10730 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
10740 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
10750 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
10760 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50  CreateIndex(.  P
10770 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
10780 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  /* All informati
10790 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61  on about this pa
107a0 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  rse */.  Token *
107b0 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72  pName1,   /* Fir
107c0 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  st part of index
107d0 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
107e0 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
107f0 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f  Name2,   /* Seco
10800 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  nd part of index
10810 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
10820 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  LL */.  SrcList 
10830 2a 70 54 62 6c 4e 61 6d 65 2c 20 20 2f 2a 20 54  *pTblName,  /* T
10840 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55  able to index. U
10850 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
10860 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45  able if 0 */.  E
10870 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
10880 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63    /* A list of c
10890 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
108a0 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
108b0 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f 45  Error,     /* OE
108c0 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72  _Abort, OE_Ignor
108d0 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f  e, OE_Replace, o
108e0 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54  r OE_None */.  T
108f0 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20  oken *pStart,   
10900 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
10910 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
10920 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
10930 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
10940 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20 20 2f  ken *pEnd      /
10950 2a 20 54 68 65 20 22 29 22 20 74 68 61 74 20 63  * The ")" that c
10960 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41 54 45  loses the CREATE
10970 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
10980 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
10990 70 54 61 62 20 3d 20 30 3b 20 2f 2a 20 54 61 62  pTab = 0; /* Tab
109a0 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
109b0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
109c0 64 65 78 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20  dex = 0; /* The 
109d0 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61  index to be crea
109e0 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ted */.  char *z
109f0 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Name = 0;.  int 
10a00 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75  i, j;.  Token nu
10a10 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b 65  llId;    /* Fake
10a20 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d   token for an em
10a30 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20  pty ID list */. 
10a40 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20   DbFixer sFix;  
10a50 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69    /* For assigni
10a60 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ng database name
10a70 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20  s to pTable */. 
10a80 20 69 6e 74 20 69 73 54 65 6d 70 3b 20 20 20 20   int isTemp;    
10a90 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
10aa0 74 65 6d 70 6f 72 61 72 79 20 69 6e 64 65 78 20  temporary index 
10ab0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
10ac0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
10ad0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
10ae0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
10af0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
10b00 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  t is being writt
10b10 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  en */.  Token *p
10b20 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 55 6e 71  Name = 0; /* Unq
10b30 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66  ualified name of
10b40 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72   the index to cr
10b50 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70  eate */..  if( p
10b60 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
10b70 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
10b80 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74  iled ) goto exit
10b90 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
10ba0 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
10bb0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
10bc0 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
10bd0 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66   Return early if
10be0 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
10bf0 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21  .  if( pTblName!
10c00 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73  =0 ){..    /* Us
10c10 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69  e the two-part i
10c20 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74  ndex name to det
10c30 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62  ermine the datab
10c40 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73  ase .    ** to s
10c50 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61  earch for the ta
10c60 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74  ble. 'Fix' the t
10c70 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69  able name to thi
10c80 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f  s db.    ** befo
10c90 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68  re looking up th
10ca0 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
10cb0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
10cc0 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a  e1 && pName2 );.
10cd0 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
10ce0 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
10cf0 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
10d00 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
10d10 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f    if( iDb<0 ) go
10d20 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
10d30 6e 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ndex;..    /* If
10d40 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20   the index name 
10d50 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c  was unqualified,
10d60 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 68   check if the th
10d70 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  e table.    ** i
10d80 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20  s a temp table. 
10d90 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64  If so, set the d
10da0 61 74 61 62 61 73 65 20 74 6f 20 31 2e 0a 20 20  atabase to 1..  
10db0 20 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20    */.    pTab = 
10dc0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f  sqlite3SrcListLo
10dd0 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 62  okup(pParse, pTb
10de0 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  lName);.    if( 
10df0 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32  pName2 && pName2
10e00 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26  ->n==0 && pTab &
10e10 26 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31 20 29  & pTab->iDb==1 )
10e20 7b 0a 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b  {.      iDb = 1;
10e30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
10e40 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
10e50 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
10e60 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d  b, "index", pNam
10e70 65 29 20 26 26 0a 20 20 20 20 20 20 20 20 73 71  e) &&.        sq
10e80 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28  lite3FixSrcList(
10e90 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29  &sFix, pTblName)
10ea0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
10eb0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
10ec0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
10ed0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
10ee0 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
10ef0 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d  , pTblName->a[0]
10f00 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  .zName, .       
10f10 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e   pTblName->a[0].
10f20 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
10f30 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f  if( !pTab ) goto
10f40 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
10f50 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
10f60 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29  iDb==pTab->iDb )
10f70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
10f80 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20  ssert( pName==0 
10f90 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70  );.    pTab =  p
10fa0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
10fb0 3b 0a 20 20 20 20 69 44 62 20 3d 20 70 54 61 62  ;.    iDb = pTab
10fc0 2d 3e 69 44 62 3b 0a 20 20 7d 0a 0a 20 20 69 66  ->iDb;.  }..  if
10fd0 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61  ( pTab==0 || pPa
10fe0 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
10ff0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
11000 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  ex;.  if( pTab->
11010 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
11020 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
11030 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
11040 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
11050 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  exed", pTab->zNa
11060 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
11070 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
11080 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d  .  }.  if( pTab-
11090 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
110a0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
110b0 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d  pParse, "views m
110c0 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
110d0 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
110e0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
110f0 0a 20 20 7d 0a 20 20 69 73 54 65 6d 70 20 3d 20  .  }.  isTemp = 
11100 70 54 61 62 2d 3e 69 44 62 3d 3d 31 3b 0a 0a 20  pTab->iDb==1;.. 
11110 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
11120 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
11130 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  dex.  Make sure 
11140 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72  there is not alr
11150 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a  eady another.  *
11160 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
11170 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
11180 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ame.  .  **.  **
11190 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20   Exception:  If 
111a0 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
111b0 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d  he names of perm
111c0 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72  anent indices fr
111d0 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  om the.  ** sqli
111e0 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
111f0 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74  (because some ot
11200 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e  her process chan
11210 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20  ged the schema) 
11220 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20  and.  ** one of 
11230 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  the index names 
11240 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68  collides with th
11250 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70  e name of a temp
11260 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20  orary table or. 
11270 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20   ** index, then 
11280 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
11290 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73   to process this
112a0 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a   index..  **.  *
112b0 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74  * If pName==0 it
112c0 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61   means that we a
112d0 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20  re.  ** dealing 
112e0 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b  with a primary k
112f0 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ey or UNIQUE con
11300 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76  straint.  We hav
11310 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a  e to invent our.
11320 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20    ** own name.. 
11330 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20   */.  if( pName 
11340 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
11350 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
11360 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20  ken(pName);.    
11370 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
11380 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
11390 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20  (pParse) ) goto 
113a0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
113b0 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  x;.    if( zName
113c0 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
113d0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
113e0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
113f0 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
11400 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
11410 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
11420 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
11430 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
11440 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
11450 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 49 6e  busy ){.      In
11460 64 65 78 20 2a 70 49 53 61 6d 65 4e 61 6d 65 3b  dex *pISameName;
11470 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 69      /* Another i
11480 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 73 61  ndex with the sa
11490 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  me name */.     
114a0 20 54 61 62 6c 65 20 2a 70 54 53 61 6d 65 4e 61   Table *pTSameNa
114b0 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74 61 62 6c  me;    /* A tabl
114c0 65 20 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65  e with same name
114d0 20 61 73 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   as the index */
114e0 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
114f0 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
11500 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
11510 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
11520 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
11530 69 66 28 20 28 70 49 53 61 6d 65 4e 61 6d 65 20  if( (pISameName 
11540 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
11550 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62  ex(db, zName, db
11560 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
11570 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
11580 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11590 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
115a0 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %s already exist
115b0 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
115c0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
115d0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
115e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70    }.      if( (p
115f0 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69  TSameName = sqli
11600 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
11610 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 29   zName, 0))!=0 )
11620 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
11630 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
11640 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
11650 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65  ady a table name
11660 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  d %s", zName);. 
11670 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
11680 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
11690 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
116a0 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 3d 3d  else if( pName==
116b0 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  0 ){.    char zB
116c0 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20  uf[30];.    int 
116d0 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c  n;.    Index *pL
116e0 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f  oop;.    for(pLo
116f0 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c  op=pTab->pIndex,
11700 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f   n=1; pLoop; pLo
11710 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c  op=pLoop->pNext,
11720 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69   n++){}.    spri
11730 6e 74 66 28 7a 42 75 66 2c 22 5f 25 64 22 2c 6e  ntf(zBuf,"_%d",n
11740 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30  );.    zName = 0
11750 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
11760 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22  String(&zName, "
11770 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78  sqlite_autoindex
11780 5f 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  _", pTab->zName,
11790 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29   zBuf, (char*)0)
117a0 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
117b0 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
117c0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
117d0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
117e0 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
117f0 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65  o create an inde
11800 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  x..  */.#ifndef 
11810 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
11820 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
11830 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
11840 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62  b = db->aDb[pTab
11850 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->iDb].zName;.  
11860 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
11870 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
11880 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
11890 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d  HEMA_TABLE(isTem
118a0 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  p), 0, zDb) ){. 
118b0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
118c0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
118d0 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54   }.    i = SQLIT
118e0 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a  E_CREATE_INDEX;.
118f0 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29      if( isTemp )
11900 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
11910 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  TE_TEMP_INDEX;. 
11920 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
11930 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
11940 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i, zName, pTab->
11950 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
11960 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
11970 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
11980 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
11990 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
119a0 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
119b0 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
119c0 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
119d0 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
119e0 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   of the last col
119f0 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  umn added to the
11a00 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
11a10 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  struction..  ** 
11a20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65  So create a fake
11a30 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74   list to simulat
11a40 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69  e this..  */.  i
11a50 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
11a60 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54     nullId.z = pT
11a70 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
11a80 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col-1].zName;.  
11a90 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72    nullId.n = str
11aa0 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20  len(nullId.z);. 
11ab0 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
11ac0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
11ad0 28 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b  (0, 0, &nullId);
11ae0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
11af0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
11b00 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
11b10 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f  .  /* .  ** Allo
11b20 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73  cate the index s
11b30 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a  tructure. .  */.
11b40 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
11b50 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
11b60 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e 28  Index) + strlen(
11b70 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20 20 20  zName) + 1 +.   
11b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b90 20 20 20 20 20 28 73 69 7a 65 6f 66 28 69 6e 74       (sizeof(int
11ba0 29 20 2b 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  ) + sizeof(CollS
11bb0 65 71 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e 45 78  eq*))*pList->nEx
11bc0 70 72 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  pr );.  if( pInd
11bd0 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  ex==0 ) goto exi
11be0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
11bf0 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
11c00 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64  mn = (int*)&pInd
11c10 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  ex->keyInfo.aCol
11c20 6c 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b  l[pList->nExpr];
11c30 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
11c40 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65   = (char*)&pInde
11c50 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73  x->aiColumn[pLis
11c60 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 73 74 72  t->nExpr];.  str
11c70 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  cpy(pIndex->zNam
11c80 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e  e, zName);.  pIn
11c90 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  dex->pTable = pT
11ca0 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43  ab;.  pIndex->nC
11cb0 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  olumn = pList->n
11cc0 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  Expr;.  pIndex->
11cd0 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f  onError = onErro
11ce0 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74  r;.  pIndex->aut
11cf0 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d  oIndex = pName==
11d00 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44 62  0;.  pIndex->iDb
11d10 20 3d 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 53 63   = iDb;..  /* Sc
11d20 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  an the names of 
11d30 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
11d40 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
11d50 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20  ndexed and.  ** 
11d60 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  load the column 
11d70 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65  indices into the
11d80 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
11d90 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  .  Report an err
11da0 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63  or.  ** if any c
11db0 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75  olumn is not fou
11dc0 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  nd..  */.  for(i
11dd0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
11de0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f  pr; i++){.    fo
11df0 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
11e00 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
11e10 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
11e20 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
11e30 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  zName, pTab->aCo
11e40 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[j].zName)==0 )
11e50 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11e60 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e    if( j>=pTab->n
11e70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Col ){.      sql
11e80 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11e90 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68  rse, "table %s h
11ea0 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d  as no column nam
11eb0 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  ed %s",.        
11ec0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69  pTab->zName, pLi
11ed0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
11ee0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
11ef0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
11f00 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
11f10 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a  >aiColumn[i] = j
11f20 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
11f30 3e 61 5b 69 5d 2e 70 45 78 70 72 20 29 7b 0a 20  >a[i].pExpr ){. 
11f40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
11f50 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e  st->a[i].pExpr->
11f60 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70  pColl );.      p
11f70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
11f80 43 6f 6c 6c 5b 69 5d 20 3d 20 70 4c 69 73 74 2d  Coll[i] = pList-
11f90 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f  >a[i].pExpr->pCo
11fa0 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
11fb0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79       pIndex->key
11fc0 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Info.aColl[i] = 
11fd0 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43  pTab->aCol[j].pC
11fe0 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  oll;.    }.    a
11ff0 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6b  ssert( pIndex->k
12000 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20  eyInfo.aColl[i] 
12010 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  );.    if( !db->
12020 69 6e 69 74 2e 62 75 73 79 20 26 26 20 0a 20 20  init.busy && .  
12030 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 65        sqlite3Che
12040 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ckCollSeq(pParse
12050 2c 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66  , pIndex->keyInf
12060 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 0a 20 20 20  o.aColl[i]) .   
12070 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
12080 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12090 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49  ;.    }.  }.  pI
120a0 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46  ndex->keyInfo.nF
120b0 69 65 6c 64 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  ield = pList->nE
120c0 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  xpr;..  if( pTab
120d0 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ==pParse->pNewTa
120e0 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ble ){.    /* Th
120f0 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62  is routine has b
12100 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  een called to cr
12110 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69  eate an automati
12120 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20  c index as a.   
12130 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20   ** result of a 
12140 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
12150 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20  NIQUE clause on 
12160 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  a column definit
12170 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  ion, or.    ** a
12180 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
12190 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f  UNIQUE clause fo
121a0 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75  llowing the colu
121b0 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a  mn definitions..
121c0 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20      ** i.e. one 
121d0 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
121e0 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
121f0 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
12200 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54  y);.    ** CREAT
12210 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20  E TABLE t(x, y, 
12220 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20  UNIQUE(x, y));. 
12230 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74     **.    ** Eit
12240 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74  her way, check t
12250 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62  o see if the tab
12260 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73  le already has s
12270 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66  uch an index. If
12280 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27  .    ** so, don'
12290 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e  t bother creatin
122a0 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73  g this one. This
122b0 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f   only applies to
122c0 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  .    ** automati
122d0 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e  cally created in
122e0 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e  dices. Users can
122f0 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68   do as they wish
12300 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70   with.    ** exp
12310 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20  licit indices.. 
12320 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20     */.    Index 
12330 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
12340 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
12350 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
12360 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
12370 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73   int k;.      as
12380 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72  sert( pIdx->onEr
12390 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
123a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
123b0 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b  dx->autoIndex );
123c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
123d0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
123e0 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20  OE_None );..    
123f0 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
12400 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f  umn!=pIndex->nCo
12410 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
12420 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  .      for(k=0; 
12430 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  k<pIdx->nColumn;
12440 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   k++){.        i
12450 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
12460 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69  n[k]!=pIndex->ai
12470 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61  Column[k] ) brea
12480 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  k;.        if( p
12490 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  Idx->keyInfo.aCo
124a0 6c 6c 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 6b  ll[k]!=pIndex->k
124b0 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20  eyInfo.aColl[k] 
124c0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
124d0 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49  .      if( k==pI
124e0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  dx->nColumn ){. 
124f0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
12500 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78  >onError!=pIndex
12510 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20  ->onError ){.   
12520 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
12530 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65  onstraint create
12540 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78  s the same index
12550 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20   as a previous. 
12560 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
12570 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64  traint specified
12580 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68   somewhere in th
12590 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
125a0 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
125b0 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74      ** However t
125c0 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  he ON CONFLICT c
125d0 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65  lauses are diffe
125e0 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68  rent. If both th
125f0 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  is .          **
12600 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
12610 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75  the previous equ
12620 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69  ivalent constrai
12630 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74  nt have explicit
12640 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e  .          ** ON
12650 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
12660 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72  s this is an err
12670 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  or. Otherwise, u
12680 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  se the.         
12690 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73   ** explicitly s
126a0 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f  pecified behavio
126b0 75 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ur for the index
126c0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
126d0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70           if( !(p
126e0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
126f0 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64  _Default || pInd
12700 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
12710 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20  Default) ){.    
12720 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
12730 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
12740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12750 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e   "conflicting ON
12760 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
12770 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29  s specified", 0)
12780 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
12790 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
127a0 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
127b0 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
127c0 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72       pIdx->onErr
127d0 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  or = pIndex->onE
127e0 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rror;.          
127f0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
12800 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
12810 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
12820 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
12830 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77   /* Link the new
12840 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
12850 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e   to its table an
12860 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20  d to the other. 
12870 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   ** in-memory da
12880 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
12890 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  s. .  */.  if( d
128a0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
128b0 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
128c0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
128d0 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
128e0 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 69 64  [pIndex->iDb].id
128f0 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20  xHash, .        
12900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12910 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
12920 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a  strlen(pIndex->z
12930 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29  Name)+1, pIndex)
12940 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
12950 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
12960 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61  pIndex );  /* Ma
12970 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
12980 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 67  ailed */.      g
12990 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
129a0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
129b0 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
129c0 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
129d0 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c  es;.    if( pTbl
129e0 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
129f0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
12a00 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
12a10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
12a20 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
12a30 74 2e 62 75 73 79 20 69 73 20 30 20 74 68 65 6e  t.busy is 0 then
12a40 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65   create the inde
12a50 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73  x on disk.  This
12a60 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77  .  ** involves w
12a70 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78  riting the index
12a80 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72   into the master
12a90 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69   table and filli
12aa0 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ng in the.  ** i
12ab0 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75  ndex with the cu
12ac0 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74  rrent table cont
12ad0 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ents..  **.  ** 
12ae0 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  The db->init.bus
12af0 79 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20  y is 0 when the 
12b00 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72  user first enter
12b10 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58  s a CREATE INDEX
12b20 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20   .  ** command. 
12b30 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
12b40 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62  s 1 when a datab
12b50 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e  ase is opened an
12b60 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49  d .  ** CREATE I
12b70 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20  NDEX statements 
12b80 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20  are read out of 
12b90 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
12ba0 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c  .  In.  ** the l
12bb0 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69  atter case the i
12bc0 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
12bd0 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69  sts on disk, whi
12be0 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77  ch is why.  ** w
12bf0 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20  e don't want to 
12c00 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a  recreate it..  *
12c10 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61  *.  ** If pTblNa
12c20 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
12c30 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e  his index is gen
12c40 65 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d  erated as a prim
12c50 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20  ary key.  ** or 
12c60 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
12c70 74 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41  t of a CREATE TA
12c80 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
12c90 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a  Since the table.
12ca0 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65    ** has just be
12cb0 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63  en created, it c
12cc0 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20  ontains no data 
12cd0 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e  and the index in
12ce0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a  itialization.  *
12cf0 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b  * step can be sk
12d00 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
12d10 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  se if( db->init.
12d20 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 56  busy==0 ){.    V
12d30 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
12d40 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74   *zStmt;.    int
12d50 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e   iMem = pParse->
12d60 6e 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 76 20 3d  nMem++;..    v =
12d70 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
12d80 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
12d90 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69   v==0 ) goto exi
12da0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12db0 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74  .    /* Create t
12dc0 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20  he rootpage for 
12dd0 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f  the index.    */
12de0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
12df0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
12e00 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
12e10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12e20 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61  AddOp(v, OP_Crea
12e30 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 29  teIndex, iDb, 0)
12e40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12e50 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
12e60 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b  Store, iMem, 0);
12e70 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20  ..    /* Gather 
12e80 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
12e90 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
12ea0 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
12eb0 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  into.    ** the 
12ec0 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20  zStmt variable. 
12ed0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
12ee0 74 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a  tart && pEnd ){.
12ef0 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64        /* A named
12f00 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65   index with an e
12f10 78 70 6c 69 63 69 74 20 43 52 45 41 54 45 20 49  xplicit CREATE I
12f20 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
12f30 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  /.      zStmt = 
12f40 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
12f50 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25  CREATE%s INDEX %
12f60 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e  .*s",.        on
12f70 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f  Error==OE_None ?
12f80 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c   "" : " UNIQUE",
12f90 0a 20 20 20 20 20 20 20 20 41 64 64 72 28 70 45  .        Addr(pE
12fa0 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 4e  nd->z) - Addr(pN
12fb0 61 6d 65 2d 3e 7a 29 20 2b 20 31 2c 0a 20 20 20  ame->z) + 1,.   
12fc0 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a       pName->z);.
12fd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12fe0 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63   /* An automatic
12ff0 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 62   index created b
13000 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  y a PRIMARY KEY 
13010 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
13020 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  aint */.      /*
13030 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
13040 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a  MPrintf(""); */.
13050 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b        zStmt = 0;
13060 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
13070 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73  dd an entry in s
13080 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72  qlite_master for
13090 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20   this index.    
130a0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
130b0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
130c0 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45  , .        "INSE
130d0 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41  RT INTO %Q.%s VA
130e0 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c  LUES('index',%Q,
130f0 25 51 2c 23 30 2c 25 51 29 3b 22 2c 0a 20 20 20  %Q,#0,%Q);",.   
13100 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
13110 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
13120 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20  TABLE(iDb),.    
13130 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
13140 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  e,.        pTab-
13150 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
13160 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20  zStmt.    );.   
13170 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13180 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
13190 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  0);.    sqliteFr
131a0 65 65 28 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20  ee(zStmt);..    
131b0 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65  /* Fill the inde
131c0 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20  x with data and 
131d0 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65  reparse the sche
131e0 6d 61 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ma.    */.    if
131f0 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20  ( pTblName ){.  
13200 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
13210 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
13220 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20  Index, iMem);.  
13230 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
13240 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69  eCookie(db, v, i
13250 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
13260 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
13270 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62  ParseSchema, iDb
13280 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71  , 0,.         sq
13290 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 6e 61  lite3MPrintf("na
132a0 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e 64 65 78  me='%q'", pIndex
132b0 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e  ->zName), P3_DYN
132c0 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  AMIC);.    }.  }
132d0 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69  ..  /* When addi
132e0 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74  ng an index to t
132f0 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63  he list of indic
13300 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20  es for a table, 
13310 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61  make.  ** sure a
13320 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c  ll indices label
13330 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f  ed OE_Replace co
13340 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f  me after all tho
13350 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20  se labeled.  ** 
13360 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73  OE_Ignore.  This
13370 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
13380 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70  r the correct op
13390 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54  eration of UPDAT
133a0 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52  E.  ** and INSER
133b0 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  T..  */.  if( db
133c0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70  ->init.busy || p
133d0 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  TblName==0 ){.  
133e0 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f    if( onError!=O
133f0 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61  E_Replace || pTa
13400 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20  b->pIndex==0.   
13410 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70        || pTab->p
13420 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
13430 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20  OE_Replace){.   
13440 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
13450 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
13460 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e  .      pTab->pIn
13470 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
13480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
13490 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70  ndex *pOther = p
134a0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
134b0 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72     while( pOther
134c0 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65  ->pNext && pOthe
134d0 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f  r->pNext->onErro
134e0 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b  r!=OE_Replace ){
134f0 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20  .        pOther 
13500 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
13510 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
13520 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
13530 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
13540 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78      pOther->pNex
13550 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  t = pIndex;.    
13560 7d 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30  }.    pIndex = 0
13570 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61  ;.  }..  /* Clea
13580 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74  n up before exit
13590 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61  ing */.exit_crea
135a0 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20  te_index:.  if( 
135b0 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 66 72  pIndex ){.    fr
135c0 65 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  eeIndex(pIndex);
135d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
135e0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  prListDelete(pLi
135f0 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72  st);.  sqlite3Sr
13600 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54 62 6c  cListDelete(pTbl
13610 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  Name);.  sqliteF
13620 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  ree(zName);.  re
13630 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
13640 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
13650 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e   drop an existin
13660 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20  g named index.  
13670 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
13680 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44  implements the D
13690 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ROP INDEX statem
136a0 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
136b0 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61  ite3DropIndex(Pa
136c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
136d0 4c 69 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  List *pName){.  
136e0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
136f0 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
13700 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
13710 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61  ->db;..  if( pPa
13720 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
13730 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
13740 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  ed ) return;.  a
13750 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
13760 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53  rc==1 );.  if( S
13770 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
13780 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
13790 73 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  se) ) return;.  
137a0 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
137b0 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e  FindIndex(db, pN
137c0 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
137d0 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
137e0 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
137f0 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Index==0 ){.    
13800 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
13810 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
13820 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61   index: %S", pNa
13830 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  me, 0);.    pPar
13840 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
13850 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  = 1;.    goto ex
13860 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
13870 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d   }.  if( pIndex-
13880 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20  >autoIndex ){.  
13890 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
138a0 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
138b0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
138c0 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20   UNIQUE ".      
138d0 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20  "or PRIMARY KEY 
138e0 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f  constraint canno
138f0 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30  t be dropped", 0
13900 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
13910 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
13920 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13930 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
13940 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
13950 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
13960 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62  P_INDEX;.    Tab
13970 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
13980 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63  x->pTable;.    c
13990 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
139a0 20 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d   db->aDb[pIndex-
139b0 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >iDb].zName;.   
139c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
139d0 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
139e0 28 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20  (pIndex->iDb);. 
139f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
13a00 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
13a10 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
13a20 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Tab, 0, zDb) ){.
13a30 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
13a40 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
13a50 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  }.    if( pIndex
13a60 2d 3e 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53  ->iDb ) code = S
13a70 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
13a80 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
13a90 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
13aa0 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49  pParse, code, pI
13ab0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61  ndex->zName, pTa
13ac0 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
13ad0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
13ae0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
13af0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
13b00 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
13b10 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
13b20 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20   index and from 
13b30 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
13b40 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
13b50 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
13b60 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
13b70 20 69 6e 74 20 69 44 62 20 3d 20 70 49 6e 64 65   int iDb = pInde
13b80 78 2d 3e 69 44 62 3b 0a 20 20 20 20 73 71 6c 69  x->iDb;.    sqli
13b90 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
13ba0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44  Parse,.       "D
13bb0 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
13bc0 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c   WHERE name=%Q",
13bd0 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  .       db->aDb[
13be0 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
13bf0 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20  MA_TABLE(iDb),. 
13c00 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
13c10 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  ame.    );.    s
13c20 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
13c30 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a  ie(db, v, iDb);.
13c40 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
13c50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64  age(pParse, pInd
13c60 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ex->tnum, iDb);.
13c70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
13c80 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64  p3(v, OP_DropInd
13c90 65 78 2c 20 69 44 62 2c 20 30 2c 20 70 49 6e 64  ex, iDb, 0, pInd
13ca0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ex->zName, 0);. 
13cb0 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e   }..exit_drop_in
13cc0 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72  dex:.  sqlite3Sr
13cd0 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d  cListDelete(pNam
13ce0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  e);.}../*.** App
13cf0 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  end a new elemen
13d00 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49  t to the given I
13d10 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  dList.  Create a
13d20 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a   new IdList if.*
13d30 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a  * need be..**.**
13d40 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73   A new IdList is
13d50 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
13d60 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66  LL if malloc() f
13d70 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20  ails..*/.IdList 
13d80 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70  *sqlite3IdListAp
13d90 70 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69  pend(IdList *pLi
13da0 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
13db0 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  n){.  if( pList=
13dc0 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
13dd0 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
13de0 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29  sizeof(IdList) )
13df0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
13e00 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
13e10 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
13e20 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
13e30 70 4c 69 73 74 2d 3e 6e 49 64 3e 3d 70 4c 69 73  pList->nId>=pLis
13e40 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  t->nAlloc ){.   
13e50 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
13e60 74 65 6d 20 2a 61 3b 0a 20 20 20 20 70 4c 69 73  tem *a;.    pLis
13e70 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4c 69 73  t->nAlloc = pLis
13e80 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b  t->nAlloc*2 + 5;
13e90 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52  .    a = sqliteR
13ea0 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c  ealloc(pList->a,
13eb0 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73   pList->nAlloc*s
13ec0 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
13ed0 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 3d  ]) );.    if( a=
13ee0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
13ef0 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
13f00 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
13f10 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
13f20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a    pList->a = a;.
13f30 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c    }.  memset(&pL
13f40 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49  ist->a[pList->nI
13f50 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c  d], 0, sizeof(pL
13f60 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 70  ist->a[0]));.  p
13f70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
13f80 49 64 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  Id].zName = sqli
13f90 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
13fa0 28 70 54 6f 6b 65 6e 29 3b 0a 20 20 70 4c 69 73  (pToken);.  pLis
13fb0 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75  t->nId++;.  retu
13fc0 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
13fd0 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
13fe0 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
13ff0 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e  e given SrcList.
14000 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53    Create a new S
14010 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  rcList if.** nee
14020 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74  d be.  A new ent
14030 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  ry is created in
14040 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65   the SrcList eve
14050 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e  n if pToken is N
14060 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  ULL..**.** A new
14070 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75   SrcList is retu
14080 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
14090 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
140a0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62  .**.** If pDatab
140b0 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c  ase is not null,
140c0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
140d0 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20  he table has an 
140e0 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61  optional.** data
140f0 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78  base name prefix
14100 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22  .  Like this:  "
14110 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e  database.table".
14120 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a    The pDatabase.
14130 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ** points to the
14140 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
14150 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74  the pTable point
14160 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
14170 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53  e name..** The S
14180 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65  rcList.a[].zName
14190 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64   field is filled
141a0 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
141b0 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74  name which might
141c0 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54  .** come from pT
141d0 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61  able (if pDataba
141e0 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66  se is NULL) or f
141f0 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20  rom pDatabase.  
14200 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  .** SrcList.a[].
14210 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c  zDatabase is fil
14220 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  led with the dat
14230 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20  abase name from 
14240 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69  pTable,.** or wi
14250 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61  th NULL if no da
14260 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66  tabase is specif
14270 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74  ied..**.** In ot
14280 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61  her words, if ca
14290 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ll like this:.**
142a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
142b0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
142c0 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54  (A,B,0);.**.** T
142d0 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65  hen B is a table
142e0 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
142f0 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75  tabase name is u
14300 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20  nspecified.  If 
14310 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74  called.** like t
14320 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
14330 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
14340 74 41 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b 0a  tAppend(A,B,C);.
14350 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20  **.** Then C is 
14360 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
14370 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61  nd B is the data
14380 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72  base name..*/.Sr
14390 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
143a0 63 4c 69 73 74 41 70 70 65 6e 64 28 53 72 63 4c  cListAppend(SrcL
143b0 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
143c0 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65 6e  n *pTable, Token
143d0 20 2a 70 44 61 74 61 62 61 73 65 29 7b 0a 20 20   *pDatabase){.  
143e0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
143f0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66  tem *pItem;.  if
14400 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
14410 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
14420 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53  Malloc( sizeof(S
14430 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  rcList) );.    i
14440 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
14450 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73  turn 0;.    pLis
14460 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20  t->nAlloc = 1;. 
14470 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e   }.  if( pList->
14480 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c  nSrc>=pList->nAl
14490 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  loc ){.    SrcLi
144a0 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c  st *pNew;.    pL
144b0 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32  ist->nAlloc *= 2
144c0 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
144d0 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74  iteRealloc(pList
144e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
144f0 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20   sizeof(*pList) 
14500 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  + (pList->nAlloc
14510 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  -1)*sizeof(pList
14520 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  ->a[0]) );.    i
14530 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
14540 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
14550 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
14560 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
14570 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
14580 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = pNew;.  }.  p
14590 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
145a0 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20  [pList->nSrc];. 
145b0 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30   memset(pItem, 0
145c0 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  , sizeof(pList->
145d0 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 44  a[0]));.  if( pD
145e0 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74 61  atabase && pData
145f0 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  base->z==0 ){.  
14600 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b    pDatabase = 0;
14610 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61  .  }.  if( pData
14620 62 61 73 65 20 26 26 20 70 54 61 62 6c 65 20 29  base && pTable )
14630 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65  {.    Token *pTe
14640 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a  mp = pDatabase;.
14650 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
14660 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62  pTable;.    pTab
14670 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a  le = pTemp;.  }.
14680 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
14690 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
146a0 54 6f 6b 65 6e 28 70 54 61 62 6c 65 29 3b 0a 20  Token(pTable);. 
146b0 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
146c0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
146d0 72 6f 6d 54 6f 6b 65 6e 28 70 44 61 74 61 62 61  romToken(pDataba
146e0 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 43  se);.  pItem->iC
146f0 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 4c  ursor = -1;.  pL
14700 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72  ist->nSrc++;.  r
14710 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
14720 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75 72  /*.** Assign cur
14730 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c  sors to all tabl
14740 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a  es in a SrcList.
14750 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
14760 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
14770 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ors(Parse *pPars
14780 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  e, SrcList *pLis
14790 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  t){.  int i;.  f
147a0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
147b0 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
147c0 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   if( pList->a[i]
147d0 2e 69 43 75 72 73 6f 72 3c 30 20 29 7b 0a 20 20  .iCursor<0 ){.  
147e0 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
147f0 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  iCursor = pParse
14800 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nTab++;.    }.
14810 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
14820 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65   an alias to the
14830 20 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65 72   last identifier
14840 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69 64   on the given id
14850 65 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a  entifier list..*
14860 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
14870 63 4c 69 73 74 41 64 64 41 6c 69 61 73 28 53 72  cListAddAlias(Sr
14880 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  cList *pList, To
14890 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
148a0 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69  if( pList && pLi
148b0 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20  st->nSrc>0 ){.  
148c0 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74    pList->a[pList
148d0 2d 3e 6e 53 72 63 2d 31 5d 2e 7a 41 6c 69 61 73  ->nSrc-1].zAlias
148e0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
148f0 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b  omToken(pToken);
14900 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
14910 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a  lete an IdList..
14920 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49  */.void sqlite3I
14930 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64 4c 69  dListDelete(IdLi
14940 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
14950 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
14960 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
14970 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
14980 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
14990 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
149a0 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
149b0 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
149c0 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71  (pList->a);.  sq
149d0 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b  liteFree(pList);
149e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
149f0 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c   the index in pL
14a00 69 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74  ist of the ident
14a10 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e  ifier named zId.
14a20 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69    Return -1.** i
14a30 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
14a40 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73  int sqlite3IdLis
14a50 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70  tIndex(IdList *p
14a60 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  List, const char
14a70 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
14a80 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
14a90 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  0 ) return -1;. 
14aa0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
14ab0 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
14ac0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
14ad0 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
14ae0 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
14af0 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
14b00 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
14b10 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
14b20 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74  n entire SrcList
14b30 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69   including all i
14b40 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 2e  ts substructure.
14b50 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14b60 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53 72  SrcListDelete(Sr
14b70 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
14b80 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
14b90 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
14ba0 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
14bb0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
14bc0 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
14bd0 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
14be0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
14bf0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
14c00 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 44  teFree(pItem->zD
14c10 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71  atabase);.    sq
14c20 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e  liteFree(pItem->
14c30 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
14c40 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 41  teFree(pItem->zA
14c50 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lias);.    if( p
14c60 49 74 65 6d 2d 3e 70 54 61 62 20 26 26 20 70 49  Item->pTab && pI
14c70 74 65 6d 2d 3e 70 54 61 62 2d 3e 69 73 54 72 61  tem->pTab->isTra
14c80 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  nsient ){.      
14c90 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
14ca0 6c 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70 54 61  le(0, pItem->pTa
14cb0 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  b);.    }.    sq
14cc0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
14cd0 65 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  e(pItem->pSelect
14ce0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
14cf0 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e  prDelete(pItem->
14d00 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pOn);.    sqlite
14d10 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 49  3IdListDelete(pI
14d20 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
14d30 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
14d40 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
14d50 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74  Begin a transact
14d60 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
14d70 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74  te3BeginTransact
14d80 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
14d90 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20  e, int type){.  
14da0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
14db0 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b  dbe *v;.  int i;
14dc0 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
14dd0 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
14de0 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  >db)==0 || db->a
14df0 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
14e00 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
14e10 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
14e20 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
14e30 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
14e40 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
14e50 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
14e60 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
14e70 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29  "BEGIN", 0, 0) )
14e80 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20   return;..  v = 
14e90 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
14ea0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76  Parse);.  if( !v
14eb0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
14ec0 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52   type!=TK_DEFERR
14ed0 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ED ){.    for(i=
14ee0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
14ef0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
14f00 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14f10 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c  _Transaction, i,
14f20 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55   (type==TK_EXCLU
14f30 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 7d 0a  SIVE)+1);.    }.
14f40 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
14f50 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74  eAddOp(v, OP_Aut
14f60 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a  oCommit, 0, 0);.
14f70 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
14f80 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
14f90 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
14fa0 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  mitTransaction(P
14fb0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
14fc0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
14fd0 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
14fe0 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
14ff0 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
15000 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
15010 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
15020 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
15030 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
15040 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
15050 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
15060 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
15070 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
15080 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22  ACTION, "COMMIT"
15090 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
150a0 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
150b0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
150c0 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
150d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
150e0 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
150f0 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  t, 1, 0);.  }.}.
15100 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
15110 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
15120 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
15130 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e  lbackTransaction
15140 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
15150 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
15160 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66    Vdbe *v;..  if
15170 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
15180 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
15190 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  0 || db->aDb[0].
151a0 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBt==0 ) return;
151b0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
151c0 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
151d0 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
151e0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
151f0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
15200 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
15210 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42  NSACTION, "ROLLB
15220 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65  ACK", 0, 0) ) re
15230 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  turn;..  v = sql
15240 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
15250 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
15260 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15270 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43  ddOp(v, OP_AutoC
15280 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20  ommit, 1, 1);.  
15290 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
152a0 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61  sure the TEMP da
152b0 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61  tabase is open a
152c0 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  nd available for
152d0 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a   use.  Return.**
152e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
152f0 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e  rrors.  Leave an
15300 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
15310 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
15320 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
15330 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 4f  tic int sqlite3O
15340 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
15350 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
15360 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
15370 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
15380 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  ( db->aDb[1].pBt
15390 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ==0 && !pParse->
153a0 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69  explain ){.    i
153b0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  nt rc = sqlite3B
153c0 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20  treeFactory(db, 
153d0 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c  0, 0, MAX_PAGES,
153e0 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74   &db->aDb[1].pBt
153f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
15400 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15410 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15420 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
15430 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  e to open a temp
15440 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22  orary database "
15450 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66  .        "file f
15460 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f  or storing tempo
15470 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20  rary tables");. 
15480 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
15490 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
154a0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
154b0 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
154c0 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20  !db->autoCommit 
154d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
154e0 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
154f0 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e  rans(db->aDb[1].
15500 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  pBt, 1);.      i
15510 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15520 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
15530 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15540 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67  se, "unable to g
15550 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  et a write lock 
15560 6f 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  on ".          "
15570 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61  the temporary da
15580 74 61 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20  tabase file");. 
15590 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72         pParse->r
155a0 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
155b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
155c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
155d0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
155e0 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
155f0 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65  ode that will ve
15600 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
15610 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74  cookie and start
15620 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73  .** a read-trans
15630 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e  action for all n
15640 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  amed database fi
15650 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  les..**.** It is
15660 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
15670 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  all schema cooki
15680 65 73 20 62 65 20 76 65 72 69 66 69 65 64 20 61  es be verified a
15690 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74  nd all.** read t
156a0 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73  ransactions be s
156b0 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e  tarted before an
156c0 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70  ything else happ
156d0 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44  ens in.** the VD
156e0 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74  BE program.  But
156f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
15700 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  n be called afte
15710 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20  r much other.** 
15720 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67 65  code has been ge
15730 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72  nerated.  So her
15740 65 20 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a  e is what we do:
15750 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
15760 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
15770 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65  ne is called, we
15780 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f   code an OP_Goto
15790 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75   that.** will ju
157a0 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69  mp to a subrouti
157b0 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ne at the end of
157c0 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54   the program.  T
157d0 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64  hen we.** record
157e0 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20   every database 
157f0 74 68 61 74 20 6e 65 65 64 73 20 69 74 73 20 73  that needs its s
15800 63 68 65 6d 61 20 76 65 72 69 66 69 65 64 20 69  chema verified i
15810 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d  n the.** pParse-
15820 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c  >cookieMask fiel
15830 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72  d.  Later, after
15840 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20   all other code 
15850 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65  has been.** gene
15860 72 61 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f  rated, the subro
15870 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20  utine that does 
15880 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  the cookie verif
15890 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  ications and.** 
158a0 73 74 61 72 74 73 20 74 68 65 20 74 72 61 6e 73  starts the trans
158b0 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20  actions will be 
158c0 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50  coded and the OP
158d0 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a  _Goto P2 value.*
158e0 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  * will be made t
158f0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20  o point to that 
15900 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  subroutine.  The
15910 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74   generation of t
15920 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72  he.** cookie ver
15930 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75  ification subrou
15940 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e  tine code happen
15950 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69  s in sqlite3Fini
15960 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a  shCoding()..**.*
15970 2a 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20  * If iDb<0 then 
15980 63 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f  code the OP_Goto
15990 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65   only - don't se
159a0 74 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79  t flag to verify
159b0 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f   the.** schema o
159c0 6e 20 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e  n any databases.
159d0 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
159e0 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74  ed to position t
159f0 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61  he OP_Goto.** ea
15a00 72 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c  rly in the code,
15a10 20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20   before we know 
15a20 69 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  if any database 
15a30 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75  tables will be u
15a40 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
15a50 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
15a60 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
15a70 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
15a80 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
15a90 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61  dbe *v;.  int ma
15aa0 73 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  sk;..  v = sqlit
15ab0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
15ac0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
15ad0 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73  return;  /* This
15ae0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66   only happens if
15af0 20 74 68 65 72 65 20 77 61 73 20 61 20 70 72 69   there was a pri
15b00 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62  or error */.  db
15b10 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
15b20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f   if( pParse->coo
15b30 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20  kieGoto==0 ){.  
15b40 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
15b50 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64  Goto = sqlite3Vd
15b60 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
15b70 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d  to, 0, 0)+1;.  }
15b80 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b  .  if( iDb>=0 ){
15b90 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62  .    assert( iDb
15ba0 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  <db->nDb );.    
15bb0 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
15bc0 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69  iDb].pBt!=0 || i
15bd0 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  Db==1 );.    ass
15be0 65 72 74 28 20 69 44 62 3c 33 32 20 29 3b 0a 20  ert( iDb<32 );. 
15bf0 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62     mask = 1<<iDb
15c00 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 72 73  ;.    if( (pPars
15c10 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20  e->cookieMask & 
15c20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
15c30 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
15c40 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
15c50 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
15c60 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64  ieValue[iDb] = d
15c70 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65  b->aDb[iDb].sche
15c80 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20  ma_cookie;.     
15c90 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20   if( iDb==1 ){. 
15ca0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70         sqlite3Op
15cb0 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70  enTempDatabase(p
15cc0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
15cd0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
15ce0 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
15cf0 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61   code that prepa
15d00 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e  res for doing an
15d10 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a   operation that.
15d20 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
15d30 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
15d40 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15d50 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72   starts a new tr
15d60 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20  ansaction if we 
15d70 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  are not already 
15d80 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e  within.** a tran
15d90 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20  saction.  If we 
15da0 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68  are already with
15db0 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
15dc0 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f  , then a checkpo
15dd0 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66  int.** is set if
15de0 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e   the setStatemen
15df0 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
15e00 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69  rue.  A checkpoi
15e10 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nt should.** be 
15e20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f  set for operatio
15e30 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61  ns that might fa
15e40 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e  il (due to a con
15e50 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66  straint) part of
15e60 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f  .** the way thro
15e70 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69  ugh and which wi
15e80 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20  ll need to undo 
15e90 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68  some writes with
15ea0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a  out having to.**
15eb0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68   rollback the wh
15ec0 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ole transaction.
15ed0 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73    For operations
15ee0 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74   where all const
15ef0 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65  raints.** can be
15f00 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20   checked before 
15f10 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20  any changes are 
15f20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
15f30 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65  base, it is neve
15f40 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74  r.** necessary t
15f50 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61  o undo a write a
15f60 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  nd the checkpoin
15f70 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
15f80 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  set..**.** Only 
15f90 64 61 74 61 62 61 73 65 20 69 44 62 20 61 6e 64  database iDb and
15fa0 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
15fb0 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74  se are made writ
15fc0 61 62 6c 65 20 62 79 20 74 68 69 73 20 63 61 6c  able by this cal
15fd0 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c  l..** If iDb==0,
15fe0 20 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 61   then the main a
15ff0 6e 64 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  nd temp database
16000 73 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  s are made writa
16010 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62  ble.   If.** iDb
16020 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  ==1 then only th
16030 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
16040 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  is made writable
16050 2e 20 20 49 66 20 69 44 62 3e 31 20 74 68 65 6e  .  If iDb>1 then
16060 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65   the.** specifie
16070 64 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  d auxiliary data
16080 62 61 73 65 20 61 6e 64 20 74 68 65 20 74 65 6d  base and the tem
16090 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d  p database are m
160a0 61 64 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  ade writable..*/
160b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
160c0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
160d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
160e0 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74  int setStatement
160f0 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
16100 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
16110 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
16120 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
16130 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  urn;.  sqlite3Co
16140 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
16150 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70  Parse, iDb);.  p
16160 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
16170 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66   |= 1<<iDb;.  if
16180 28 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 26  ( setStatement &
16190 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  & pParse->nested
161a0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
161b0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
161c0 50 5f 53 74 61 74 65 6d 65 6e 74 2c 20 69 44 62  P_Statement, iDb
161d0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
161e0 69 44 62 21 3d 31 20 26 26 20 70 50 61 72 73 65  iDb!=1 && pParse
161f0 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  ->db->aDb[1].pBt
16200 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
16210 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
16220 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 73 65  ation(pParse, se
16230 74 53 74 61 74 65 6d 65 6e 74 2c 20 31 29 3b 0a  tStatement, 1);.
16240 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65    }.}../* .** Re
16250 74 75 72 6e 20 74 68 65 20 74 72 61 6e 73 69 65  turn the transie
16260 6e 74 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt sqlite3_value
16270 20 6f 62 6a 65 63 74 20 75 73 65 64 20 66 6f 72   object used for
16280 20 65 6e 63 6f 64 69 6e 67 20 63 6f 6e 76 65 72   encoding conver
16290 73 69 6f 6e 73 0a 2a 2a 20 64 75 72 69 6e 67 20  sions.** during 
162a0 53 51 4c 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2e  SQL compilation.
162b0 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75  .*/.sqlite3_valu
162c0 65 20 2a 73 71 6c 69 74 65 33 47 65 74 54 72 61  e *sqlite3GetTra
162d0 6e 73 69 65 6e 74 56 61 6c 75 65 28 73 71 6c 69  nsientValue(sqli
162e0 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20  te3 *db){.  if( 
162f0 21 64 62 2d 3e 70 56 61 6c 75 65 20 29 7b 0a 20  !db->pValue ){. 
16300 20 20 20 64 62 2d 3e 70 56 61 6c 75 65 20 3d 20     db->pValue = 
16310 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
16320 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
16330 64 62 2d 3e 70 56 61 6c 75 65 3b 0a 7d 0a 0a 2f  db->pValue;.}../
16340 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
16350 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73  e if pIndex uses
16360 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
16370 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20  equence pColl.  
16380 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
16390 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61  f it does and fa
163a0 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e  lse if it does n
163b0 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ot..*/.#ifndef S
163c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
163d0 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  EX.static int co
163e0 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 43 6f 6c  llationMatch(Col
163f0 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 20 49 6e 64  lSeq *pColl, Ind
16400 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69  ex *pIndex){.  i
16410 6e 74 20 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6b  nt n = pIndex->k
16420 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 3b 0a 20  eyInfo.nField;. 
16430 20 43 6f 6c 6c 53 65 71 20 2a 2a 70 70 20 3d 20   CollSeq **pp = 
16440 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e  pIndex->keyInfo.
16450 61 43 6f 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20  aColl;.  while( 
16460 6e 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 2a  n-- ){.    if( *
16470 70 70 3d 3d 70 43 6f 6c 6c 20 29 20 72 65 74 75  pp==pColl ) retu
16480 72 6e 20 31 3b 0a 20 20 20 20 70 70 2b 2b 3b 0a  rn 1;.    pp++;.
16490 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
164a0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
164b0 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
164c0 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68  dices of pTab th
164d0 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61  at use the colla
164e0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
164f0 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c  oll..** If pColl
16500 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75  ==0 then recompu
16510 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
16520 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64  f pTab..*/.#ifnd
16530 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
16540 45 49 4e 44 45 58 0a 76 6f 69 64 20 72 65 69 6e  EINDEX.void rein
16550 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a  dexTable(Parse *
16560 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
16570 54 61 62 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43  Tab, CollSeq *pC
16580 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  oll){.  Index *p
16590 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
165a0 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
165b0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
165c0 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70  pTab */..  for(p
165d0 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64  Index=pTab->pInd
165e0 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
165f0 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74  ex=pIndex->pNext
16600 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  ){.    if( pColl
16610 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e  ==0 || collation
16620 4d 61 74 63 68 28 70 43 6f 6c 6c 2c 70 49 6e 64  Match(pColl,pInd
16630 65 78 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ex) ){.      sql
16640 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
16650 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
16660 30 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20  0, pTab->iDb);. 
16670 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69       sqlite3Refi
16680 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
16690 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20  pIndex, -1);.   
166a0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
166b0 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65  ./*.** Recompute
166c0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
166d0 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c  all tables in al
166e0 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72  l databases wher
166f0 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73  e the.** indices
16700 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69   use the collati
16710 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
16720 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20  l.  If pColl==0 
16730 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a  then recompute.*
16740 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76  * all indices ev
16750 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66  erywhere..*/.#if
16760 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16770 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 72 65  _REINDEX.void re
16780 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 50  indexDatabases(P
16790 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f  arse *pParse, Co
167a0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
167b0 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
167c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
167d0 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  A single databas
167e0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
167f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16800 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
16810 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
16820 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
16830 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
16840 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
16850 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
16860 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20   HashElem *k;   
16870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16880 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
16890 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a   tables in pDb *
168a0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
168b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168c0 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
168d0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20  e database */.. 
168e0 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d   for(iDb=0, pDb=
168f0 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d  db->aDb; iDb<db-
16900 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62  >nDb; iDb++, pDb
16910 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 44 62  ++){.    if( pDb
16920 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
16930 20 20 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69        for(k=sqli
16940 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62  teHashFirst(&pDb
16950 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20  ->tblHash);  k; 
16960 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  k=sqliteHashNext
16970 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62  (k)){.      pTab
16980 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74   = (Table*)sqlit
16990 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20  eHashData(k);.  
169a0 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65      reindexTable
169b0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
169c0 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Coll);.    }.  }
169d0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
169e0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
169f0 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63  or the REINDEX c
16a00 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  ommand..**.**   
16a10 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20       REINDEX    
16a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a30 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20          -- 1.** 
16a40 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
16a50 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20  <collation>     
16a60 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a            -- 2.*
16a70 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
16a80 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c    ?<database>.?<
16a90 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33  tablename>  -- 3
16aa0 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
16ab0 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  EX  ?<database>.
16ac0 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d  ?<indexname>  --
16ad0 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20   4.**.** Form 1 
16ae0 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63  causes all indic
16af0 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68  es in all attach
16b00 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20  ed databases to 
16b10 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46  be rebuilt..** F
16b20 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61  orm 2 rebuilds a
16b30 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c  ll indices in al
16b40 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  l databases that
16b50 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a   use the named.*
16b60 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  * collating func
16b70 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61  tion.  Forms 3 a
16b80 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65  nd 4 rebuild the
16b90 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20   named index or 
16ba0 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61  all.** indices a
16bb0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
16bc0 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a  he named table..
16bd0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
16be0 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76  E_OMIT_REINDEX.v
16bf0 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64  oid sqlite3Reind
16c00 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
16c10 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c  , Token *pName1,
16c20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b   Token *pName2){
16c30 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
16c40 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
16c50 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
16c60 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64  ence to be reind
16c70 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  exed, or NULL */
16c80 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
16c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16ca0 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c  * Name of a tabl
16cb0 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e or index */.  
16cc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b  const char *zDb;
16cd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
16ce0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
16cf0 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ase */.  Table *
16d00 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
16d10 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
16d20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
16d30 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
16d40 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
16d50 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73   /* An index ass
16d60 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61  ociated with pTa
16d70 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  b */.  int iDb; 
16d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d90 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
16da0 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
16db0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
16dc0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
16dd0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
16de0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
16df0 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65   Token *pObjName
16e00 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16e10 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
16e20 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65  e or index to be
16e30 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20   reindexed */.. 
16e40 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 7c   if( pName1==0 |
16e50 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30 20 29  | pName1->z==0 )
16e60 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 74  {.    reindexDat
16e70 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 30  abases(pParse, 0
16e80 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
16e90 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65   }else if( pName
16ea0 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e  2==0 || pName2->
16eb0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c  z==0 ){.    pCol
16ec0 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
16ed0 6f 6c 6c 53 65 71 28 64 62 2c 20 64 62 2d 3e 65  ollSeq(db, db->e
16ee0 6e 63 2c 20 70 4e 61 6d 65 31 2d 3e 7a 2c 20 70  nc, pName1->z, p
16ef0 4e 61 6d 65 31 2d 3e 6e 2c 20 30 29 3b 0a 20 20  Name1->n, 0);.  
16f00 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
16f10 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61       reindexData
16f20 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 70 43  bases(pParse, pC
16f30 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oll);.      retu
16f40 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
16f50 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
16f60 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
16f70 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
16f80 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69   &pObjName);.  i
16f90 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
16fa0 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  n;.  z = sqlite3
16fb0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4f  NameFromToken(pO
16fc0 62 6a 4e 61 6d 65 29 3b 0a 20 20 7a 44 62 20 3d  bjName);.  zDb =
16fd0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
16fe0 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ame;.  pTab = sq
16ff0 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
17000 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66  b, z, zDb);.  if
17010 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65  ( pTab ){.    re
17020 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73  indexTable(pPars
17030 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20  e, pTab, 0);.   
17040 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a   sqliteFree(z);.
17050 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
17060 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
17070 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
17080 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74  z, zDb);.  sqlit
17090 65 46 72 65 65 28 7a 29 3b 0a 20 20 69 66 28 20  eFree(z);.  if( 
170a0 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71  pIndex ){.    sq
170b0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
170c0 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
170d0 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   0, iDb);.    sq
170e0 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
170f0 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
17100 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   -1);.    return
17110 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
17120 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
17130 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74  "unable to ident
17140 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74  ify the object t
17150 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 22 29  o be reindexed")
17160 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
17170 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17180 41 4c 54 45 52 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  ALTERTABLE./*.**
17190 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
171a0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
171b0 22 41 4c 54 45 52 20 54 41 42 4c 45 20 78 78 78  "ALTER TABLE xxx
171c0 20 52 45 4e 41 4d 45 20 54 4f 20 79 79 79 22 20   RENAME TO yyy" 
171d0 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f  .** command. .*/
171e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 6c 74  .void sqlite3Alt
171f0 65 72 52 65 6e 61 6d 65 54 61 62 6c 65 28 0a 20  erRenameTable(. 
17200 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
17210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
17220 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 2a 2f  rser context. */
17230 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
17240 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
17250 54 68 65 20 74 61 62 6c 65 20 74 6f 20 72 65 6e  The table to ren
17260 61 6d 65 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ame. */.  Token 
17270 2a 70 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20  *pName          
17280 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74      /* The new t
17290 61 62 6c 65 20 6e 61 6d 65 2e 20 2a 2f 0a 29 7b  able name. */.){
172a0 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
172b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
172c0 44 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f  Database that co
172d0 6e 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65  ntains the table
172e0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b   */.  char *zDb;
172f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17300 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74 61 62  /* Name of datab
17310 61 73 65 20 69 44 62 20 2a 2f 0a 20 20 54 61 62  ase iDb */.  Tab
17320 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
17330 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
17340 62 65 69 6e 67 20 72 65 6e 61 6d 65 64 20 2a 2f  being renamed */
17350 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
17360 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
17370 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61 74 65 64 20  NULL-terminated 
17380 76 65 72 73 69 6f 6e 20 6f 66 20 70 4e 61 6d 65  version of pName
17390 20 2a 2f 20 0a 20 20 63 68 61 72 20 2a 7a 57 68   */ .  char *zWh
173a0 65 72 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ere = 0;        
173b0 20 2f 2a 20 57 68 65 72 65 20 63 6c 61 75 73 65   /* Where clause
173c0 20 6f 66 20 73 63 68 65 6d 61 20 65 6c 65 6d 65   of schema eleme
173d0 6e 74 73 20 74 6f 20 72 65 70 61 72 73 65 20 2a  nts to reparse *
173e0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
173f0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a  = pParse->db; /*
17400 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
17410 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a  tion */.  Vdbe *
17420 76 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  v;.#ifndef SQLIT
17430 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
17440 20 63 68 61 72 20 2a 7a 54 65 6d 70 54 72 69 67   char *zTempTrig
17450 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68   = 0;      /* Wh
17460 65 72 65 20 63 6c 61 75 73 65 20 74 6f 20 6c 6f  ere clause to lo
17470 63 61 74 65 20 74 65 6d 70 20 74 72 69 67 67 65  cate temp trigge
17480 72 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 0a  rs */.#endif.  .
17490 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e    assert( pSrc->
174a0 6e 53 72 63 3d 3d 31 20 29 3b 0a 0a 20 20 70 54  nSrc==1 );..  pT
174b0 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
174c0 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
174d0 70 53 72 63 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  pSrc->a[0].zName
174e0 2c 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 7a 44 61  , pSrc->a[0].zDa
174f0 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 21  tabase);.  if( !
17500 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74  pTab ) goto exit
17510 5f 61 6c 74 65 72 5f 74 61 62 6c 65 3b 0a 20 20  _alter_table;.  
17520 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b  iDb = pTab->iDb;
17530 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  zDb = db->aDb
17540 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20  [iDb].zName;..  
17550 2f 2a 20 47 65 74 20 61 20 4e 55 4c 4c 20 74 65  /* Get a NULL te
17560 72 6d 69 6e 61 74 65 64 20 76 65 72 73 69 6f 6e  rminated version
17570 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
17580 65 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a 4e 61  e name. */.  zNa
17590 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
175a0 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29  FromToken(pName)
175b0 3b 0a 20 20 69 66 28 20 21 7a 4e 61 6d 65 20 29  ;.  if( !zName )
175c0 20 67 6f 74 6f 20 65 78 69 74 5f 61 6c 74 65 72   goto exit_alter
175d0 5f 74 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 43 68  _table;..  /* Ch
175e0 65 63 6b 20 74 68 61 74 20 61 20 74 61 62 6c 65  eck that a table
175f0 20 6f 72 20 69 6e 64 65 78 20 6e 61 6d 65 64 20   or index named 
17600 27 7a 4e 61 6d 65 27 20 64 6f 65 73 20 6e 6f 74  'zName' does not
17610 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 0a 20   already exist. 
17620 20 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20   ** in database 
17630 69 44 62 2e 20 49 66 20 73 6f 2c 20 74 68 69 73  iDb. If so, this
17640 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20   is an error..  
17650 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
17660 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
17670 61 6d 65 2c 20 7a 44 62 29 20 7c 7c 20 73 71 6c  ame, zDb) || sql
17680 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
17690 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  , zName, zDb) ){
176a0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
176b0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
176c0 20 20 20 20 20 20 22 74 68 65 72 65 20 69 73 20        "there is 
176d0 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 20  already another 
176e0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 77  table or index w
176f0 69 74 68 20 74 68 69 73 20 6e 61 6d 65 3a 20 25  ith this name: %
17700 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
17710 67 6f 74 6f 20 65 78 69 74 5f 61 6c 74 65 72 5f  goto exit_alter_
17720 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  table;.  }..  /*
17730 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   Make sure it is
17740 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 74 61   not a system ta
17750 62 6c 65 20 62 65 69 6e 67 20 61 6c 74 65 72 65  ble being altere
17760 64 2c 20 6f 72 20 61 20 72 65 73 65 72 76 65 64  d, or a reserved
17770 20 6e 61 6d 65 0a 20 20 2a 2a 20 74 68 61 74 20   name.  ** that 
17780 74 68 65 20 74 61 62 6c 65 20 69 73 20 62 65 69  the table is bei
17790 6e 67 20 72 65 6e 61 6d 65 64 20 74 6f 2e 0a 20  ng renamed to.. 
177a0 20 2a 2f 0a 20 20 69 66 28 20 73 74 72 6c 65 6e   */.  if( strlen
177b0 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3e 36 20  (pTab->zName)>6 
177c0 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
177d0 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d  NICmp(pTab->zNam
177e0 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
177f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
17800 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
17810 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f  "table %s may no
17820 74 20 62 65 20 61 6c 74 65 72 65 64 22 2c 20 70  t be altered", p
17830 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
17840 20 67 6f 74 6f 20 65 78 69 74 5f 61 6c 74 65 72   goto exit_alter
17850 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  _table;.  }.  if
17860 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
17870 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
17880 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
17890 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  e) ){.    goto e
178a0 78 69 74 5f 61 6c 74 65 72 5f 74 61 62 6c 65 3b  xit_alter_table;
178b0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
178c0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
178d0 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 6e 76  IZATION.  /* Inv
178e0 6f 6b 65 20 74 68 65 20 61 75 74 68 6f 72 69 7a  oke the authoriz
178f0 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 2e 20  ation callback. 
17900 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
17910 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
17920 2c 20 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54  , SQLITE_ALTER_T
17930 41 42 4c 45 2c 20 7a 44 62 2c 20 70 54 61 62 2d  ABLE, zDb, pTab-
17940 3e 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20  >zName, 0) ){.  
17950 20 20 67 6f 74 6f 20 65 78 69 74 5f 61 6c 74 65    goto exit_alte
17960 72 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e  r_table;.  }.#en
17970 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  dif..  /* Begin 
17980 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  a transaction an
17990 64 20 63 6f 64 65 20 74 68 65 20 56 65 72 69 66  d code the Verif
179a0 79 43 6f 6f 6b 69 65 20 66 6f 72 20 64 61 74 61  yCookie for data
179b0 62 61 73 65 20 69 44 62 2e 20 0a 20 20 2a 2a 20  base iDb. .  ** 
179c0 54 68 65 6e 20 6d 6f 64 69 66 79 20 74 68 65 20  Then modify the 
179d0 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 28 73  schema cookie (s
179e0 69 6e 63 65 20 74 68 65 20 41 4c 54 45 52 20 54  ince the ALTER T
179f0 41 42 4c 45 20 6d 6f 64 69 66 69 65 73 20 74 68  ABLE modifies th
17a00 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 29 2e 0a  e.  ** schema)..
17a10 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
17a20 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
17a30 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  );.  if( v==0 ){
17a40 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 61  .    goto exit_a
17a50 6c 74 65 72 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  lter_table;.  }.
17a60 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
17a70 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
17a80 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
17a90 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
17aa0 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b  kie(db, v, iDb);
17ab0 0a 0a 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68  ..  /* Modify th
17ac0 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
17ad0 74 61 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65  table to use the
17ae0 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 2e   new table name.
17af0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73   */.  sqlite3Nes
17b00 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
17b10 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25  .      "UPDATE %
17b20 51 2e 25 73 20 53 45 54 20 22 0a 23 69 66 64 65  Q.%s SET ".#ifde
17b30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
17b40 49 47 47 45 52 0a 20 20 20 20 20 20 20 20 20 20  IGGER.          
17b50 22 73 71 6c 20 3d 20 73 71 6c 69 74 65 5f 61 6c  "sql = sqlite_al
17b60 74 65 72 5f 74 61 62 6c 65 28 73 71 6c 2c 20 25  ter_table(sql, %
17b70 51 29 2c 20 22 0a 23 65 6c 73 65 0a 20 20 20 20  Q), ".#else.    
17b80 20 20 20 20 20 20 22 73 71 6c 20 3d 20 43 41 53        "sql = CAS
17b90 45 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  E ".            
17ba0 22 57 48 45 4e 20 74 79 70 65 20 3d 20 27 74 72  "WHEN type = 'tr
17bb0 69 67 67 65 72 27 20 54 48 45 4e 20 73 71 6c 69  igger' THEN sqli
17bc0 74 65 5f 61 6c 74 65 72 5f 74 72 69 67 67 65 72  te_alter_trigger
17bd0 28 73 71 6c 2c 20 25 51 29 22 0a 20 20 20 20 20  (sql, %Q)".     
17be0 20 20 20 20 20 20 20 22 45 4c 53 45 20 73 71 6c         "ELSE sql
17bf0 69 74 65 5f 61 6c 74 65 72 5f 74 61 62 6c 65 28  ite_alter_table(
17c00 73 71 6c 2c 20 25 51 29 20 45 4e 44 2c 20 22 0a  sql, %Q) END, ".
17c10 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
17c20 20 22 74 62 6c 5f 6e 61 6d 65 20 3d 20 25 51 2c   "tbl_name = %Q,
17c30 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 6e 61   ".          "na
17c40 6d 65 20 3d 20 43 41 53 45 20 22 0a 20 20 20 20  me = CASE ".    
17c50 20 20 20 20 20 20 20 20 22 57 48 45 4e 20 74 79          "WHEN ty
17c60 70 65 3d 27 74 61 62 6c 65 27 20 54 48 45 4e 20  pe='table' THEN 
17c70 25 51 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  %Q ".           
17c80 20 22 57 48 45 4e 20 6e 61 6d 65 20 4c 49 4b 45   "WHEN name LIKE
17c90 20 27 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64   'sqlite_autoind
17ca0 65 78 25 25 27 20 41 4e 44 20 74 79 70 65 3d 27  ex%%' AND type='
17cb0 69 6e 64 65 78 27 20 54 48 45 4e 20 22 0a 20 20  index' THEN ".  
17cc0 20 20 20 20 20 20 20 20 20 20 20 20 22 27 73 71              "'sq
17cd0 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 27  lite_autoindex_'
17ce0 20 7c 7c 20 25 51 20 7c 7c 20 73 75 62 73 74 72   || %Q || substr
17cf0 28 6e 61 6d 65 2c 20 25 64 2b 31 38 2c 31 30 29  (name, %d+18,10)
17d00 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
17d10 45 4c 53 45 20 6e 61 6d 65 20 45 4e 44 20 22 0a  ELSE name END ".
17d20 20 20 20 20 20 20 22 57 48 45 52 45 20 74 62 6c        "WHERE tbl
17d30 5f 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74 79 70  _name=%Q AND typ
17d40 65 20 49 4e 20 28 27 74 61 62 6c 65 27 2c 20 27  e IN ('table', '
17d50 69 6e 64 65 78 27 2c 20 27 74 72 69 67 67 65 72  index', 'trigger
17d60 27 29 3b 22 2c 20 0a 20 20 20 20 20 20 7a 44 62  ');", .      zDb
17d70 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
17d80 44 62 29 2c 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  Db), zName, zNam
17d90 65 2c 20 7a 4e 61 6d 65 2c 20 0a 23 69 66 6e 64  e, zName, .#ifnd
17da0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
17db0 52 49 47 47 45 52 0a 7a 4e 61 6d 65 2c 0a 23 65  RIGGER.zName,.#e
17dc0 6e 64 69 66 0a 20 20 20 20 20 20 7a 4e 61 6d 65  ndif.      zName
17dd0 2c 20 73 74 72 6c 65 6e 28 70 54 61 62 2d 3e 7a  , strlen(pTab->z
17de0 4e 61 6d 65 29 2c 20 70 54 61 62 2d 3e 7a 4e 61  Name), pTab->zNa
17df0 6d 65 0a 20 20 29 3b 0a 0a 23 69 66 6e 64 65 66  me.  );..#ifndef
17e00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
17e10 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20  OINCREMENT.  /* 
17e20 49 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  If the sqlite_se
17e30 71 75 65 6e 63 65 20 74 61 62 6c 65 20 65 78 69  quence table exi
17e40 73 74 73 20 69 6e 20 74 68 69 73 20 64 61 74 61  sts in this data
17e50 62 61 73 65 2c 20 74 68 65 6e 20 75 70 64 61 74  base, then updat
17e60 65 20 0a 20 20 2a 2a 20 69 74 20 77 69 74 68 20  e .  ** it with 
17e70 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  the new table na
17e80 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  me..  */.  if( s
17e90 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
17ea0 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75  db, "sqlite_sequ
17eb0 65 6e 63 65 22 2c 20 7a 44 62 29 20 29 7b 0a 20  ence", zDb) ){. 
17ec0 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
17ed0 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
17ee0 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51        "UPDATE %Q
17ef0 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  .sqlite_sequence
17f00 20 73 65 74 20 6e 61 6d 65 20 3d 20 25 51 20 57   set name = %Q W
17f10 48 45 52 45 20 6e 61 6d 65 20 3d 20 25 51 22 2c  HERE name = %Q",
17f20 0a 20 20 20 20 20 20 20 20 7a 44 62 2c 20 7a 4e  .        zDb, zN
17f30 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
17f40 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
17f50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17f60 49 54 5f 54 52 49 47 47 45 52 0a 20 20 2f 2a 20  IT_TRIGGER.  /* 
17f70 49 66 20 74 68 65 72 65 20 61 72 65 20 54 45 4d  If there are TEM
17f80 50 20 74 72 69 67 67 65 72 73 20 6f 6e 20 74 68  P triggers on th
17f90 69 73 20 74 61 62 6c 65 2c 20 6d 6f 64 69 66 79  is table, modify
17fa0 20 74 68 65 20 73 71 6c 69 74 65 5f 74 65 6d 70   the sqlite_temp
17fb0 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62  _master.  ** tab
17fc0 6c 65 2e 20 44 6f 6e 27 74 20 64 6f 20 74 68 69  le. Don't do thi
17fd0 73 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 62  s if the table b
17fe0 65 69 6e 67 20 41 4c 54 45 52 65 64 20 69 73 20  eing ALTERed is 
17ff0 69 74 73 65 6c 66 20 6c 6f 63 61 74 65 64 20 69  itself located i
18000 6e 0a 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 20  n.  ** the temp 
18010 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
18020 20 69 66 28 20 69 44 62 21 3d 31 20 29 7b 0a 20   if( iDb!=1 ){. 
18030 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69     Trigger *pTri
18040 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 6d 70  g;.    char *tmp
18050 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 20 70   = 0;.    for( p
18060 54 72 69 67 3d 70 54 61 62 2d 3e 70 54 72 69 67  Trig=pTab->pTrig
18070 67 65 72 3b 20 70 54 72 69 67 3b 20 70 54 72 69  ger; pTrig; pTri
18080 67 3d 70 54 72 69 67 2d 3e 70 4e 65 78 74 20 29  g=pTrig->pNext )
18090 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 72 69  {.      if( pTri
180a0 67 2d 3e 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  g->iDb==1 ){.   
180b0 20 20 20 20 20 69 66 28 20 21 7a 54 65 6d 70 54       if( !zTempT
180c0 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rig ){.         
180d0 20 7a 54 65 6d 70 54 72 69 67 20 3d 20 0a 20 20   zTempTrig = .  
180e0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
180f0 74 65 33 4d 50 72 69 6e 74 66 28 22 74 79 70 65  te3MPrintf("type
18100 20 3d 20 27 74 72 69 67 67 65 72 27 20 41 4e 44   = 'trigger' AND
18110 20 6e 61 6d 65 20 49 4e 28 25 51 22 2c 20 70 54   name IN(%Q", pT
18120 72 69 67 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  rig->name);.    
18130 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18140 20 20 20 20 20 74 6d 70 20 3d 20 7a 54 65 6d 70       tmp = zTemp
18150 54 72 69 67 3b 0a 20 20 20 20 20 20 20 20 20 20  Trig;.          
18160 7a 54 65 6d 70 54 72 69 67 20 3d 20 73 71 6c 69  zTempTrig = sqli
18170 74 65 33 4d 50 72 69 6e 74 66 28 22 25 73 2c 20  te3MPrintf("%s, 
18180 25 51 22 2c 20 7a 54 65 6d 70 54 72 69 67 2c 20  %Q", zTempTrig, 
18190 70 54 72 69 67 2d 3e 6e 61 6d 65 29 3b 0a 20 20  pTrig->name);.  
181a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
181b0 65 65 28 74 6d 70 29 3b 0a 20 20 20 20 20 20 20  ee(tmp);.       
181c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
181d0 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 54 72  .    if( zTempTr
181e0 69 67 20 29 7b 0a 20 20 20 20 20 20 74 6d 70 20  ig ){.      tmp 
181f0 3d 20 7a 54 65 6d 70 54 72 69 67 3b 0a 20 20 20  = zTempTrig;.   
18200 20 20 20 7a 54 65 6d 70 54 72 69 67 20 3d 20 73     zTempTrig = s
18210 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25  qlite3MPrintf("%
18220 73 29 22 2c 20 7a 54 65 6d 70 54 72 69 67 29 3b  s)", zTempTrig);
18230 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
18240 65 28 74 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  e(tmp);.      sq
18250 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
18260 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
18270 20 20 20 20 22 55 50 44 41 54 45 20 73 71 6c 69      "UPDATE sqli
18280 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 53  te_temp_master S
18290 45 54 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ET ".           
182a0 20 20 20 22 73 71 6c 20 3d 20 73 71 6c 69 74 65     "sql = sqlite
182b0 5f 61 6c 74 65 72 5f 74 72 69 67 67 65 72 28 73  _alter_trigger(s
182c0 71 6c 2c 20 25 51 29 2c 20 22 0a 20 20 20 20 20  ql, %Q), ".     
182d0 20 20 20 20 20 20 20 20 20 22 74 62 6c 5f 6e 61           "tbl_na
182e0 6d 65 20 3d 20 25 51 20 22 0a 20 20 20 20 20 20  me = %Q ".      
182f0 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 25          "WHERE %
18300 73 3b 22 2c 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  s;", zName, zNam
18310 65 2c 20 7a 54 65 6d 70 54 72 69 67 29 3b 0a 20  e, zTempTrig);. 
18320 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
18330 0a 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 65  .  /* Drop the e
18340 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 69  lements of the i
18350 6e 2d 6d 65 6d 6f 72 79 20 73 63 68 65 6d 61 20  n-memory schema 
18360 74 68 61 74 20 72 65 66 65 72 65 64 20 74 6f 20  that refered to 
18370 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 72  the table.  ** r
18380 65 6e 61 6d 65 64 20 61 6e 64 20 6c 6f 61 64 20  enamed and load 
18390 74 68 65 20 6e 65 77 20 76 65 72 73 69 6f 6e 73  the new versions
183a0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
183b0 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  se..  */.  if( p
183c0 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
183d0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
183e0 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
183f0 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
18400 3b 0a 20 20 20 20 66 6f 72 28 20 70 54 72 69 67  ;.    for( pTrig
18410 3d 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b  =pTab->pTrigger;
18420 20 70 54 72 69 67 3b 20 70 54 72 69 67 3d 70 54   pTrig; pTrig=pT
18430 72 69 67 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  rig->pNext ){.  
18440 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69      assert( pTri
18450 67 2d 3e 69 44 62 3d 3d 69 44 62 20 7c 7c 20 70  g->iDb==iDb || p
18460 54 72 69 67 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a  Trig->iDb==1 );.
18470 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18480 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 54  eOp3(v, OP_DropT
18490 72 69 67 67 65 72 2c 20 70 54 72 69 67 2d 3e 69  rigger, pTrig->i
184a0 44 62 2c 20 30 2c 20 70 54 72 69 67 2d 3e 6e 61  Db, 0, pTrig->na
184b0 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65  me, 0);.    }.#e
184c0 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
184d0 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72  VdbeOp3(v, OP_Dr
184e0 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c  opTable, iDb, 0,
184f0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
18500 3b 0a 20 20 20 20 7a 57 68 65 72 65 20 3d 20 73  ;.    zWhere = s
18510 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 74  qlite3MPrintf("t
18520 62 6c 5f 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e 61  bl_name=%Q", zNa
18530 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
18540 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61  VdbeOp3(v, OP_Pa
18550 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
18560 30 2c 20 7a 57 68 65 72 65 2c 20 50 33 5f 44 59  0, zWhere, P3_DY
18570 4e 41 4d 49 43 29 3b 0a 23 69 66 6e 64 65 66 20  NAMIC);.#ifndef 
18580 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
18590 47 45 52 0a 20 20 20 20 69 66 28 20 7a 54 65 6d  GER.    if( zTem
185a0 70 54 72 69 67 20 29 7b 0a 20 20 20 20 20 20 73  pTrig ){.      s
185b0 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
185c0 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c   OP_ParseSchema,
185d0 20 31 2c 20 30 2c 20 7a 54 65 6d 70 54 72 69 67   1, 0, zTempTrig
185e0 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P3_DYNAMIC);. 
185f0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
18600 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 65    sqliteFree(zTe
18610 6d 70 54 72 69 67 29 3b 0a 23 65 6e 64 69 66 0a  mpTrig);.#endif.
18620 20 20 7d 0a 0a 65 78 69 74 5f 61 6c 74 65 72 5f    }..exit_alter_
18630 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33  table:.  sqlite3
18640 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 53  SrcListDelete(pS
18650 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  rc);.  sqliteFre
18660 65 28 7a 4e 61 6d 65 29 3b 0a 7d 0a 23 65 6e 64  e(zName);.}.#end
18670 69 66 0a                                         if.