/ Hex Artifact Content
Login

Artifact a95eb1181247368b0ffe2eed121a43735976a964:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 0a 2a 2a    ROLLBACK.**.**
02d0: 20 24 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20   $Id: build.c,v 
02e0: 31 2e 32 37 39 20 32 30 30 34 2f 31 31 2f 31 33  1.279 2004/11/13
02f0: 20 30 33 3a 34 38 3a 30 37 20 64 72 68 20 45 78   03:48:07 drh Ex
0300: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0310: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0320: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
0330: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
0340: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
0350: 68 65 6e 20 61 20 6e 65 77 20 53 51 4c 20 73 74  hen a new SQL st
0360: 61 74 65 6d 65 6e 74 20 69 73 20 62 65 67 69 6e  atement is begin
0370: 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61  ning to.** be pa
0380: 72 73 65 64 2e 20 20 43 68 65 63 6b 20 74 6f 20  rsed.  Check to 
0390: 73 65 65 20 69 66 20 74 68 65 20 73 63 68 65 6d  see if the schem
03a0: 61 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  a for the databa
03b0: 73 65 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62  se needs.** to b
03c0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
03d0: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 61 6e  SQLITE_MASTER an
03e0: 64 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 4d 41  d SQLITE_TEMP_MA
03f0: 53 54 45 52 20 74 61 62 6c 65 73 2e 0a 2a 2a 20  STER tables..** 
0400: 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 65 6e  If it does, then
0410: 20 72 65 61 64 20 69 74 2e 0a 2a 2f 0a 76 6f 69   read it..*/.voi
0420: 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 50 61  d sqlite3BeginPa
0430: 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rse(Parse *pPars
0440: 65 2c 20 69 6e 74 20 65 78 70 6c 61 69 6e 46 6c  e, int explainFl
0450: 61 67 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 65  ag){.  pParse->e
0460: 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61 69 6e  xplain = explain
0470: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
0480: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nVar = 0;.}../*.
0490: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
04a0: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
04b0: 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61  a single SQL sta
04c0: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
04d0: 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20 61 20  ** parsed and a 
04e0: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 74 6f 20  VDBE program to 
04f0: 65 78 65 63 75 74 65 20 74 68 61 74 20 73 74 61  execute that sta
0500: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
0510: 2a 2a 20 70 72 65 70 61 72 65 64 2e 20 20 54 68  ** prepared.  Th
0520: 69 73 20 72 6f 75 74 69 6e 65 20 70 75 74 73 20  is routine puts 
0530: 74 68 65 20 66 69 6e 69 73 68 69 6e 67 20 74 6f  the finishing to
0540: 75 63 68 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  uches on the.** 
0550: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 6e 64  VDBE program and
0560: 20 72 65 73 65 74 73 20 74 68 65 20 70 50 61 72   resets the pPar
0570: 73 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  se structure for
0580: 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 70 61 72   the next.** par
0590: 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  se..**.** Note t
05a0: 68 61 74 20 69 66 20 61 6e 20 65 72 72 6f 72 20  hat if an error 
05b0: 6f 63 63 75 72 72 65 64 2c 20 69 74 20 6d 69 67  occurred, it mig
05c0: 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
05d0: 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63  hat.** no VDBE c
05e0: 6f 64 65 20 77 61 73 20 67 65 6e 65 72 61 74 65  ode was generate
05f0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
0600: 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 50  e3FinishCoding(P
0610: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
0620: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
0630: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
0640: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
0650: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
0660: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65    if( pParse->ne
0670: 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 0a  sted ) return;..
0680: 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 67 65    /* Begin by ge
0690: 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65 20 74 65  nerating some te
06a0: 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20 61  rmination code a
06b0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
06c0: 0a 20 20 2a 2a 20 76 64 62 65 20 70 72 6f 67 72  .  ** vdbe progr
06d0: 61 6d 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70  am.  */.  db = p
06e0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d  Parse->db;.  v =
06f0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0700: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
0710: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
0720: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 48  dbeAddOp(v, OP_H
0730: 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  alt, 0, 0);..   
0740: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
0750: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
0760: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
0770: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
0780: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
0790: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
07a0: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
07b0: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
07c0: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
07d0: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
07e0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
07f0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
0800: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
0810: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
0820: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
0830: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
0840: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
0850: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
0860: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
0870: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
0880: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  if( pParse->cook
0890: 69 65 47 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20  ieGoto>0 ){.    
08a0: 20 20 75 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20    u32 mask;.    
08b0: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
08c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
08d0: 67 65 50 32 28 76 2c 20 70 50 61 72 73 65 2d 3e  geP2(v, pParse->
08e0: 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 2c 20 73 71  cookieGoto-1, sq
08f0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
0900: 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 20 20  Addr(v));.      
0910: 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73 6b 3d  for(iDb=0, mask=
0920: 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  1; iDb<db->nDb; 
0930: 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b 29  mask<<=1, iDb++)
0940: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
0950: 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 63 6f  ask & pParse->co
0960: 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29 20 63  okieMask)==0 ) c
0970: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
0980: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
0990: 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74  p(v, OP_Transact
09a0: 69 6f 6e 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20  ion, iDb, (mask 
09b0: 26 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d  & pParse->writeM
09c0: 61 73 6b 29 21 3d 30 29 3b 0a 20 20 20 20 20 20  ask)!=0);.      
09d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
09e0: 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43  Op(v, OP_VerifyC
09f0: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 70 50 61 72  ookie, iDb, pPar
0a00: 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b  se->cookieValue[
0a10: 69 44 62 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iDb]);.      }. 
0a20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
0a30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
0a40: 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  , 0, pParse->coo
0a50: 6b 69 65 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a  kieGoto);.    }.
0a60: 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 20 4e 6f  .    /* Add a No
0a70: 2d 6f 70 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  -op that contain
0a80: 73 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  s the complete t
0a90: 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 69  ext of the compi
0aa0: 6c 65 64 20 53 51 4c 0a 20 20 20 20 2a 2a 20 73  led SQL.    ** s
0ab0: 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74 73 20  tatement as its 
0ac0: 50 33 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68  P3 argument.  Th
0ad0: 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e  is does not chan
0ae0: 67 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 61  ge the functiona
0af0: 6c 69 74 79 0a 20 20 20 20 2a 2a 20 6f 66 20 74  lity.    ** of t
0b00: 68 65 20 70 72 6f 67 72 61 6d 2e 20 0a 20 20 20  he program. .   
0b10: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
0b20: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
0b30: 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 74 72 61  ment sqlite3_tra
0b40: 63 65 28 29 20 66 75 6e 63 74 69 6f 6e 61 6c 69  ce() functionali
0b50: 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ty..    */.    s
0b60: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
0b70: 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20   OP_Noop, 0, 0, 
0b80: 70 50 61 72 73 65 2d 3e 7a 53 71 6c 2c 20 70 50  pParse->zSql, pP
0b90: 61 72 73 65 2d 3e 7a 54 61 69 6c 2d 70 50 61 72  arse->zTail-pPar
0ba0: 73 65 2d 3e 7a 53 71 6c 29 3b 0a 20 20 7d 0a 0a  se->zSql);.  }..
0bb0: 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 56 44  .  /* Get the VD
0bc0: 42 45 20 70 72 6f 67 72 61 6d 20 72 65 61 64 79  BE program ready
0bd0: 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 0a 20   for execution. 
0be0: 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26 20 70   */.  if( v && p
0bf0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
0c00: 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74 72 61 63  {.    FILE *trac
0c10: 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  e = (db->flags &
0c20: 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63   SQLITE_VdbeTrac
0c30: 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a  e)!=0 ? stdout :
0c40: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   0;.    sqlite3V
0c50: 64 62 65 54 72 61 63 65 28 76 2c 20 74 72 61 63  dbeTrace(v, trac
0c60: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
0c70: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20  dbeMakeReady(v, 
0c80: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 70 50  pParse->nVar, pP
0c90: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 33 2c 0a 20 20  arse->nMem+3,.  
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cb0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
0cc0: 54 61 62 2b 33 2c 20 70 50 61 72 73 65 2d 3e 65  Tab+3, pParse->e
0cd0: 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50 61  xplain);.    pPa
0ce0: 72 73 65 2d 3e 72 63 20 3d 20 70 50 61 72 73 65  rse->rc = pParse
0cf0: 2d 3e 6e 45 72 72 20 3f 20 53 51 4c 49 54 45 5f  ->nErr ? SQLITE_
0d00: 45 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f 44  ERROR : SQLITE_D
0d10: 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ONE;.    pParse-
0d20: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 30  >colNamesSet = 0
0d30: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
0d40: 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  arse->rc==SQLITE
0d50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 72 73  _OK ){.    pPars
0d60: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
0d70: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72  RROR;.  }.  pPar
0d80: 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20  se->nTab = 0;.  
0d90: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30  pParse->nMem = 0
0da0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74  ;.  pParse->nSet
0db0: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
0dc0: 6e 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  nAgg = 0;.  pPar
0dd0: 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20  se->nVar = 0;.  
0de0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
0df0: 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  sk = 0;.  pParse
0e00: 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30  ->cookieGoto = 0
0e10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74  ;.}../*.** Run t
0e20: 68 65 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f  he parser and co
0e30: 64 65 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63  de generator rec
0e40: 75 72 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65  ursively in orde
0e50: 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a  r to generate.**
0e60: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51   code for the SQ
0e70: 4c 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65  L statement give
0e80: 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  n onto the end o
0e90: 66 20 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e  f the pParse con
0ea0: 74 65 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  text.** currentl
0eb0: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
0ec0: 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20  tion.  When the 
0ed0: 70 61 72 73 65 72 20 69 73 20 72 75 6e 20 72 65  parser is run re
0ee0: 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69  cursively.** thi
0ef0: 73 20 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c  s way, the final
0f00: 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20   OP_Halt is not 
0f10: 61 70 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68  appended and oth
0f20: 65 72 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  er initializatio
0f30: 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a  n.** and finaliz
0f40: 61 74 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20  ation steps are 
0f50: 6f 6d 69 74 74 65 64 20 62 65 63 61 75 73 65 20  omitted because 
0f60: 74 68 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69  those are handli
0f70: 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74  ng by the.** out
0f80: 65 72 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a  ermost parser..*
0f90: 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68  *.** Not everyth
0fa0: 69 6e 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e  ing is nestable.
0fb0: 20 20 54 68 69 73 20 66 61 63 69 6c 69 74 79 20    This facility 
0fc0: 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70  is designed to p
0fd0: 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c  ermit.** INSERT,
0fe0: 20 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c   UPDATE, and DEL
0ff0: 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ETE operations a
1000: 67 61 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41  gainst SQLITE_MA
1010: 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61  STER.  Use.** ca
1020: 72 65 20 69 66 20 79 6f 75 20 64 65 63 69 64 65  re if you decide
1030: 20 74 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74   to try to use t
1040: 68 69 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  his routine for 
1050: 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f  some other purpo
1060: 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ses..*/.void sql
1070: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
1080: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
1090: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
10a0: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
10b0: 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a  ist ap;.  char *
10c0: 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  zSql;.  int rc;.
10d0: 23 20 64 65 66 69 6e 65 20 53 41 56 45 5f 53 5a  # define SAVE_SZ
10e0: 20 20 28 73 69 7a 65 6f 66 28 50 61 72 73 65 29    (sizeof(Parse)
10f0: 20 2d 20 6f 66 66 73 65 74 6f 66 28 50 61 72 73   - offsetof(Pars
1100: 65 2c 6e 56 61 72 29 29 0a 20 20 63 68 61 72 20  e,nVar)).  char 
1110: 73 61 76 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d  saveBuf[SAVE_SZ]
1120: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
1130: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
1140: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1150: 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20 20  ->nested<10 );  
1160: 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c  /* Nesting shoul
1170: 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d  d only be of lim
1180: 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20 20  ited depth */.  
1190: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
11a0: 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  rmat);.  zSql = 
11b0: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
11c0: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
11d0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 70 50  va_end(ap);.  pP
11e0: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a  arse->nested++;.
11f0: 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42 75 66    memcpy(saveBuf
1200: 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  , &pParse->nVar,
1210: 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d   SAVE_SZ);.  mem
1220: 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e 56 61  set(&pParse->nVa
1230: 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  r, 0, SAVE_SZ);.
1240: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 75    rc = sqlite3Ru
1250: 6e 50 61 72 73 65 72 28 70 50 61 72 73 65 2c 20  nParser(pParse, 
1260: 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 73 71 6c 69  zSql, 0);.  sqli
1270: 74 65 46 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  teFree(zSql);.  
1280: 6d 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d 3e  memcpy(&pParse->
1290: 6e 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20 53  nVar, saveBuf, S
12a0: 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73  AVE_SZ);.  pPars
12b0: 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a  e->nested--;.}..
12c0: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
12d0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
12e0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
12f0: 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  bes a particular
1300: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62   database.** tab
1310: 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  le given the nam
1320: 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20  e of that table 
1330: 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
1340: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1350: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
1360: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
1370: 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
1380: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
1390: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
13a0: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
13b0: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
13c0: 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  d for the table 
13d0: 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  and the.** first
13e0: 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20   matching table 
13f0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
1400: 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64  o checking for d
1410: 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a  uplicate table.*
1420: 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  * names is done.
1430: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
1440: 64 65 72 20 69 73 20 54 45 4d 50 20 66 69 72 73  der is TEMP firs
1450: 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68  t, then MAIN, th
1460: 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69  en any.** auxili
1470: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
1480: 64 65 64 20 75 73 69 6e 67 20 74 68 65 20 41 54  ded using the AT
1490: 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  TACH command..**
14a0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
14b0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
14c0: 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  )..*/.Table *sql
14d0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71  ite3FindTable(sq
14e0: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
14f0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
1500: 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62  nst char *zDatab
1510: 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ase){.  Table *p
1520: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
1530: 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d   assert( zName!=
1540: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
1550: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1560: 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 20  TE_Initialized) 
1570: 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  || db->init.busy
1580: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
1590: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
15a0: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
15b0: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f  ) ? i^1 : i;   /
15c0: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
15d0: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
15e0: 20 69 66 28 20 7a 44 61 74 61 62 61 73 65 21 3d   if( zDatabase!=
15f0: 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
1600: 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64  Cmp(zDatabase, d
1610: 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29  b->aDb[j].zName)
1620: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1630: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
1640: 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d  Find(&db->aDb[j]
1650: 2e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  .tblHash, zName,
1660: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
1670: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62  );.    if( p ) b
1680: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
1690: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn p;.}../*.** L
16a0: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
16b0: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
16c0: 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70  at describes a p
16d0: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
16e0: 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65  se.** table give
16f0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
1700: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
1710: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
1720: 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  me of the.** dat
1730: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
1740: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
1750: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
1760: 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61  found.  Also lea
1770: 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d  ve an.** error m
1780: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
1790: 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
17a0: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
17b0: 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
17c0: 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33  tine and sqlite3
17d0: 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73 20 74  FindTable() is t
17e0: 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hat this.** rout
17f0: 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72  ine leaves an er
1800: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
1810: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77  Parse->zErrMsg w
1820: 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46  here.** sqlite3F
1830: 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20  indTable() does 
1840: 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  not..*/.Table *s
1850: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
1860: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1870: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1880: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
1890: 7a 44 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  zDbase){.  Table
18a0: 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20   *p;..  /* Read 
18b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
18c0: 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ema. If an error
18d0: 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
18e0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
18f0: 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e    ** and code in
1900: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
1910: 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66  rn NULL. */.  if
1920: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
1930: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
1940: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
1950: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70  turn 0;.  }..  p
1960: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
1970: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
1980: 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a  zName, zDbase);.
1990: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
19a0: 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a    if( zDbase ){.
19b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
19c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
19d0: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
19e0: 2e 25 73 22 2c 20 7a 44 62 61 73 65 2c 20 7a 4e  .%s", zDbase, zN
19f0: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ame);.    }else 
1a00: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
1a10: 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
1a20: 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b   zName, 0)!=0 ){
1a30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
1a40: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1a50: 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 69 73 20  table \"%s\" is 
1a60: 6e 6f 74 20 69 6e 20 64 61 74 61 62 61 73 65 20  not in database 
1a70: 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20  \"%s\"",.       
1a80: 20 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29    zName, zDbase)
1a90: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1aa0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1ab0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
1ac0: 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  uch table: %s", 
1ad0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
1ae0: 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
1af0: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20  chema = 1;.  }. 
1b00: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1b10: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
1b20: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
1b30: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
1b40: 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c  s .** a particul
1b50: 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74  ar index given t
1b60: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
1b70: 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65  index.** and the
1b80: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
1b90: 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61  abase that conta
1ba0: 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ins the index..*
1bb0: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
1bc0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
1bd0: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
1be0: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
1bf0: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
1c00: 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  for the.** table
1c10: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d   and the first m
1c20: 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73  atching index is
1c30: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
1c40: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20  checking.** for 
1c50: 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20  duplicate index 
1c60: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
1c70: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
1c80: 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72  r is.** TEMP fir
1c90: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
1ca0: 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72  hen any auxiliar
1cb0: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
1cc0: 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41  d.** using the A
1cd0: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
1ce0: 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
1cf0: 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65  FindIndex(sqlite
1d00: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1d10: 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
1d20: 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e  char *zDb){.  In
1d30: 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e  dex *p = 0;.  in
1d40: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 28  t i;.  assert( (
1d50: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1d60: 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 20  TE_Initialized) 
1d70: 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  || db->init.busy
1d80: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
1d90: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
1da0: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
1db0: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a  ) ? i^1 : i;  /*
1dc0: 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66   Search TEMP bef
1dd0: 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20  ore MAIN */.    
1de0: 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74  if( zDb && sqlit
1df0: 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64  e3StrICmp(zDb, d
1e00: 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29  b->aDb[j].zName)
1e10: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e20: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
1e30: 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d  Find(&db->aDb[j]
1e40: 2e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  .idxHash, zName,
1e50: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
1e60: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62  );.    if( p ) b
1e70: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
1e80: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn p;.}../*.** R
1e90: 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72  eclaim the memor
1ea0: 79 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64  y used by an ind
1eb0: 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ex.*/.static voi
1ec0: 64 20 66 72 65 65 49 6e 64 65 78 28 49 6e 64 65  d freeIndex(Inde
1ed0: 78 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 46  x *p){.  sqliteF
1ee0: 72 65 65 28 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b  ree(p->zColAff);
1ef0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29  .  sqliteFree(p)
1f00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
1f10: 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65  e the given inde
1f20: 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  x from the index
1f30: 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64   hash table, and
1f40: 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d   free.** its mem
1f50: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a  ory structures..
1f60: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  **.** The index 
1f70: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
1f80: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
1f90: 68 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20  h tables but.** 
1fa0: 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b  it is not unlink
1fb0: 65 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c  ed from the Tabl
1fc0: 65 20 74 68 61 74 20 69 74 20 69 6e 64 65 78 65  e that it indexe
1fd0: 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20  s..** Unlinking 
1fe0: 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d  from the Table m
1ff0: 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74  ust be done by t
2000: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
2010: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
2020: 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65  oid sqliteDelete
2030: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
2040: 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  b, Index *p){.  
2050: 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 0a 20 20  Index *pOld;..  
2060: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 26 26  assert( db!=0 &&
2070: 20 70 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a   p->zName!=0 );.
2080: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
2090: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
20a0: 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48  aDb[p->iDb].idxH
20b0: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20  ash, p->zName,. 
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d0: 20 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e 28           strlen(
20e0: 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b  p->zName)+1, 0);
20f0: 0a 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 26  .  if( pOld!=0 &
2100: 26 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20  & pOld!=p ){.   
2110: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
2120: 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69  rt(&db->aDb[p->i
2130: 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 4f 6c  Db].idxHash, pOl
2140: 64 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  d->zName,.      
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2160: 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d  trlen(pOld->zNam
2170: 65 29 2b 31 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d  e)+1, pOld);.  }
2180: 0a 20 20 66 72 65 65 49 6e 64 65 78 28 70 29 3b  .  freeIndex(p);
2190: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
21a0: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
21b0: 20 66 72 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c   from its table,
21c0: 20 74 68 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20   then remove.** 
21d0: 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  the index from t
21e0: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
21f0: 62 6c 65 20 61 6e 64 20 66 72 65 65 20 69 74 73  ble and free its
2200: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63   memory.** struc
2210: 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tures..*/.void s
2220: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
2230: 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74  eleteIndex(sqlit
2240: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
2250: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
2260: 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20  xName){.  Index 
2270: 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6c  *pIndex;.  int l
2280: 65 6e 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72  en;..  len = str
2290: 6c 65 6e 28 7a 49 64 78 4e 61 6d 65 29 3b 0a 20  len(zIdxName);. 
22a0: 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
22b0: 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  3HashInsert(&db-
22c0: 3e 61 44 62 5b 69 44 62 5d 2e 69 64 78 48 61 73  >aDb[iDb].idxHas
22d0: 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 6c 65 6e  h, zIdxName, len
22e0: 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 49  +1, 0);.  if( pI
22f0: 6e 64 65 78 20 29 7b 0a 20 20 20 20 69 66 28 20  ndex ){.    if( 
2300: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
2310: 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29  pIndex==pIndex )
2320: 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
2330: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
2340: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
2350: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2360: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20   Index *p;.     
2370: 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70   for(p=pIndex->p
2380: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
2390: 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49   && p->pNext!=pI
23a0: 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  ndex; p=p->pNext
23b0: 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 70 20  ){}.      if( p 
23c0: 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  && p->pNext==pIn
23d0: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  dex ){.        p
23e0: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
23f0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
2400: 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49  .    }.    freeI
2410: 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20  ndex(pIndex);.  
2420: 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  }.  db->flags |=
2430: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
2440: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
2450: 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61  Erase all schema
2460: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
2470: 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  m the in-memory 
2480: 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a  hash tables of.*
2490: 2a 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  * a single datab
24a0: 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ase.  This routi
24b0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
24c0: 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a  reclaim memory.*
24d0: 2a 20 62 65 66 6f 72 65 20 74 68 65 20 64 61 74  * before the dat
24e0: 61 62 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49  abase closes.  I
24f0: 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64  t is also called
2500: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
2510: 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77  ck.** if there w
2520: 65 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ere schema chang
2530: 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72  es during the tr
2540: 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20  ansaction or if 
2550: 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b  a.** schema-cook
2560: 69 65 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75  ie mismatch occu
2570: 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  rs..**.** If iDb
2580: 3c 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20 74  <=0 then reset t
2590: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
25a0: 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c  ma tables for al
25b0: 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  l database.** fi
25c0: 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20  les.  If iDb>=2 
25d0: 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69  then reset the i
25e0: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66  nternal schema f
25f0: 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73  or only the.** s
2600: 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63  ingle file indic
2610: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
2620: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
2630: 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  alSchema(sqlite3
2640: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
2650: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65    HashElem *pEle
2660: 6d 3b 0a 20 20 48 61 73 68 20 74 65 6d 70 31 3b  m;.  Hash temp1;
2670: 0a 20 20 48 61 73 68 20 74 65 6d 70 32 3b 0a 20  .  Hash temp2;. 
2680: 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73   int i, j;..  as
2690: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
26a0: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
26b0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
26c0: 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65  QLITE_Initialize
26d0: 64 3b 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20  d;.  for(i=iDb; 
26e0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
26f0: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
2700: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
2710: 74 65 6d 70 31 20 3d 20 70 44 62 2d 3e 74 62 6c  temp1 = pDb->tbl
2720: 48 61 73 68 3b 0a 20 20 20 20 74 65 6d 70 32 20  Hash;.    temp2 
2730: 3d 20 70 44 62 2d 3e 74 72 69 67 48 61 73 68 3b  = pDb->trigHash;
2740: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
2750: 49 6e 69 74 28 26 70 44 62 2d 3e 74 72 69 67 48  Init(&pDb->trigH
2760: 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48  ash, SQLITE_HASH
2770: 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20  _STRING, 0);.   
2780: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
2790: 72 28 26 70 44 62 2d 3e 61 46 4b 65 79 29 3b 0a  r(&pDb->aFKey);.
27a0: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43      sqlite3HashC
27b0: 6c 65 61 72 28 26 70 44 62 2d 3e 69 64 78 48 61  lear(&pDb->idxHa
27c0: 73 68 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c  sh);.    for(pEl
27d0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
27e0: 73 74 28 26 74 65 6d 70 32 29 3b 20 70 45 6c 65  st(&temp2); pEle
27f0: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
2800: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
2810: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
2820: 6c 65 74 65 54 72 69 67 67 65 72 28 28 54 72 69  leteTrigger((Tri
2830: 67 67 65 72 2a 29 73 71 6c 69 74 65 48 61 73 68  gger*)sqliteHash
2840: 44 61 74 61 28 70 45 6c 65 6d 29 29 3b 0a 20 20  Data(pElem));.  
2850: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 48    }.    sqlite3H
2860: 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70 32 29  ashClear(&temp2)
2870: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73  ;.    sqlite3Has
2880: 68 49 6e 69 74 28 26 70 44 62 2d 3e 74 62 6c 48  hInit(&pDb->tblH
2890: 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48  ash, SQLITE_HASH
28a0: 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20  _STRING, 0);.   
28b0: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
28c0: 65 48 61 73 68 46 69 72 73 74 28 26 74 65 6d 70  eHashFirst(&temp
28d0: 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  1); pElem; pElem
28e0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
28f0: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 54  pElem)){.      T
2900: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
2910: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
2920: 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
2930: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
2940: 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20   pTab);.    }.  
2950: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
2960: 61 72 28 26 74 65 6d 70 31 29 3b 0a 20 20 20 20  ar(&temp1);.    
2970: 70 44 62 2d 3e 70 53 65 71 54 61 62 20 3d 20 30  pDb->pSeqTab = 0
2980: 3b 0a 20 20 20 20 44 62 43 6c 65 61 72 50 72 6f  ;.    DbClearPro
2990: 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f  perty(db, i, DB_
29a0: 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3b 0a 20  SchemaLoaded);. 
29b0: 20 20 20 69 66 28 20 69 44 62 3e 30 20 29 20 72     if( iDb>0 ) r
29c0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
29d0: 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a 20  ert( iDb==0 );. 
29e0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
29f0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
2a00: 67 65 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  ges;..  /* If on
2a10: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
2a20: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
2a30: 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62 65  ase files has be
2a40: 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20  en closed,.  ** 
2a50: 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 6e  then remove then
2a60: 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c 69   from the auxili
2a70: 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69 73  ary database lis
2a80: 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65 0a  t.  We take the.
2a90: 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79    ** opportunity
2aa0: 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72 65   to do this here
2ab0: 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6a   since we have j
2ac0: 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c 20  ust deleted all 
2ad0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68 65  of the.  ** sche
2ae0: 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20 61  ma hash tables a
2af0: 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f 20  nd therefore do 
2b00: 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b 65  not have to make
2b10: 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20 2a   any changes.  *
2b20: 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73  * to any of thos
2b30: 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
2b40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
2b50: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nDb; i++){.    s
2b60: 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20  truct Db *pDb = 
2b70: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
2b80: 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30   if( pDb->pBt==0
2b90: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
2ba0: 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62 2d 3e  b->pAux && pDb->
2bb0: 78 46 72 65 65 41 75 78 20 29 20 70 44 62 2d 3e  xFreeAux ) pDb->
2bc0: 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e 70 41  xFreeAux(pDb->pA
2bd0: 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  ux);.      pDb->
2be0: 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pAux = 0;.    }.
2bf0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b    }.  for(i=j=2;
2c00: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
2c10: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
2c20: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
2c30: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  i];.    if( pDb-
2c40: 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >pBt==0 ){.     
2c50: 20 73 71 6c 69 74 65 46 72 65 65 28 70 44 62 2d   sqliteFree(pDb-
2c60: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  >zName);.      p
2c70: 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  Db->zName = 0;. 
2c80: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2c90: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69     }.    if( j<i
2ca0: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44   ){.      db->aD
2cb0: 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69  b[j] = db->aDb[i
2cc0: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b  ];.    }.    j++
2cd0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
2ce0: 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28  db->aDb[j], 0, (
2cf0: 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f  db->nDb-j)*sizeo
2d00: 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a  f(db->aDb[j]));.
2d10: 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20    db->nDb = j;. 
2d20: 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20   if( db->nDb<=2 
2d30: 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e  && db->aDb!=db->
2d40: 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20  aDbStatic ){.   
2d50: 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53   memcpy(db->aDbS
2d60: 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20  tatic, db->aDb, 
2d70: 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62  2*sizeof(db->aDb
2d80: 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  [0]));.    sqlit
2d90: 65 46 72 65 65 28 64 62 2d 3e 61 44 62 29 3b 0a  eFree(db->aDb);.
2da0: 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62      db->aDb = db
2db0: 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20 7d  ->aDbStatic;.  }
2dc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2dd0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2de0: 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
2df0: 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 20 49 66  back occurs.  If
2e00: 20 74 68 65 72 65 20 77 65 72 65 0a 2a 2a 20 73   there were.** s
2e10: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75  chema changes du
2e20: 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63  ring the transac
2e30: 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20 68 61  tion, then we ha
2e40: 76 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 0a  ve to reset the.
2e50: 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  ** internal hash
2e60: 20 74 61 62 6c 65 73 20 61 6e 64 20 72 65 6c 6f   tables and relo
2e70: 61 64 20 74 68 65 6d 20 66 72 6f 6d 20 64 69 73  ad them from dis
2e80: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  k..*/.void sqlit
2e90: 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e  e3RollbackIntern
2ea0: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
2eb0: 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  3 *db){.  if( db
2ec0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
2ed0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29  _InternChanges )
2ee0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
2ef0: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
2f00: 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  (db, 0);.  }.}..
2f10: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2f20: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
2f30: 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72  n a commit occur
2f40: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
2f50: 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
2f60: 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
2f70: 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67  *db){.  db->flag
2f80: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
2f90: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
2fa0: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
2fb0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
2fc0: 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
2fd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2fe0: 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75   sqliteResetColu
2ff0: 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a 70  mnNames(Table *p
3000: 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Table){.  int i;
3010: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
3020: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
3030: 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  e!=0 );.  for(i=
3040: 30 2c 20 70 43 6f 6c 3d 70 54 61 62 6c 65 2d 3e  0, pCol=pTable->
3050: 61 43 6f 6c 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  aCol; i<pTable->
3060: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
3070: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  +){.    sqliteFr
3080: 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  ee(pCol->zName);
3090: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
30a0: 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66  Delete(pCol->pDf
30b0: 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  lt);.    sqliteF
30c0: 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29  ree(pCol->zType)
30d0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
30e0: 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29  ee(pTable->aCol)
30f0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ;.  pTable->aCol
3100: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
3110: 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nCol = 0;.}../*.
3120: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65  ** Remove the me
3130: 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74  mory data struct
3140: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
3150: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a  with the given.*
3160: 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61  * Table.  No cha
3170: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
3180: 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f   disk by this ro
3190: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  utine..**.** Thi
31a0: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64  s routine just d
31b0: 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20  eletes the data 
31c0: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64  structure.  It d
31d0: 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a  oes not unlink.*
31e0: 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61  * the table data
31f0: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
3200: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
3210: 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d   Nor does it rem
3220: 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b  ove.** foreign k
3230: 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  eys from the sql
3240: 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74  ite.aFKey hash t
3250: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
3260: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
3270: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
3280: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
3290: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
32a0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
32b0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
32c0: 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73  *.** Indices ass
32d0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
32e0: 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e   table are unlin
32f0: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62  ked from the "db
3300: 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74  ".** data struct
3310: 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e  ure if db!=NULL.
3320: 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69    If db==NULL, i
3330: 6e 64 69 63 65 73 20 61 74 74 61 63 68 65 64 20  ndices attached 
3340: 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  to.** the table 
3350: 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74  are deleted, but
3360: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
3370: 68 65 79 20 68 61 76 65 20 61 6c 72 65 61 64 79  hey have already
3380: 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65   been.** unlinke
3390: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
33a0: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  e3DeleteTable(sq
33b0: 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65  lite3 *db, Table
33c0: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64   *pTable){.  Ind
33d0: 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65  ex *pIndex, *pNe
33e0: 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  xt;.  FKey *pFKe
33f0: 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a  y, *pNextFKey;..
3400: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
3410: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
3420: 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63  Delete all indic
3430: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
3440: 74 68 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20  th this table.  
3450: 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20  */.  for(pIndex 
3460: 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  = pTable->pIndex
3470: 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
3480: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
3490: 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  xt = pIndex->pNe
34a0: 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  xt;.    assert( 
34b0: 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 70 54 61  pIndex->iDb==pTa
34c0: 62 6c 65 2d 3e 69 44 62 20 7c 7c 20 28 70 54 61  ble->iDb || (pTa
34d0: 62 6c 65 2d 3e 69 44 62 3d 3d 30 20 26 26 20 70  ble->iDb==0 && p
34e0: 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 31 29 20 29  Index->iDb==1) )
34f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65  ;.    sqliteDele
3500: 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  teIndex(db, pInd
3510: 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ex);.  }..  /* D
3520: 65 6c 65 74 65 20 61 6c 6c 20 66 6f 72 65 69 67  elete all foreig
3530: 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65  n keys associate
3540: 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c  d with this tabl
3550: 65 2e 20 20 54 68 65 20 6b 65 79 73 0a 20 20 2a  e.  The keys.  *
3560: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  * should have al
3570: 72 65 61 64 79 20 62 65 65 6e 20 75 6e 6c 69 6e  ready been unlin
3580: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 64 62 2d  ked from the db-
3590: 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c  >aFKey hash tabl
35a0: 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 46  e .  */.  for(pF
35b0: 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b 65  Key=pTable->pFKe
35c0: 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d  y; pFKey; pFKey=
35d0: 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20 20 20  pNextFKey){.    
35e0: 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46 4b 65  pNextFKey = pFKe
35f0: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20  y->pNextFrom;.  
3600: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
3610: 2d 3e 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  ->iDb<db->nDb );
3620: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
3630: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
3640: 2d 3e 61 44 62 5b 70 54 61 62 6c 65 2d 3e 69 44  ->aDb[pTable->iD
3650: 62 5d 2e 61 46 4b 65 79 2c 0a 20 20 20 20 20 20  b].aFKey,.      
3660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3670: 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c       pFKey->zTo,
3680: 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a   strlen(pFKey->z
3690: 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79 20 29 3b  To)+1)!=pFKey );
36a0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
36b0: 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 0a 20 20 2f  pFKey);.  }..  /
36c0: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62  * Delete the Tab
36d0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73  le structure its
36e0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  elf..  */.  sqli
36f0: 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d  teResetColumnNam
3700: 65 73 28 70 54 61 62 6c 65 29 3b 0a 20 20 73 71  es(pTable);.  sq
3710: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
3720: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  >zName);.  sqlit
3730: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 43  eFree(pTable->zC
3740: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
3750: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 54  3SelectDelete(pT
3760: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  able->pSelect);.
3770: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
3780: 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ble);.}../*.** U
3790: 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20  nlink the given 
37a0: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68  table from the h
37b0: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74  ash tables and t
37c0: 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  he delete the.**
37d0: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
37e0: 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e   with all its in
37f0: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
3800: 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20  n keys..*/.void 
3810: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
3820: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
3830: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
3840: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
3850: 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  abName){.  Table
3860: 20 2a 70 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31   *p;.  FKey *pF1
3870: 2c 20 2a 70 46 32 3b 0a 20 20 44 62 20 2a 70 44  , *pF2;.  Db *pD
3880: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  b;..  assert( db
3890: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
38a0: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
38b0: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
38c0: 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 26 26 20  rt( zTabName && 
38d0: 7a 54 61 62 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20  zTabName[0] );. 
38e0: 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
38f0: 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69  iDb];.  p = sqli
3900: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
3910: 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61  Db->tblHash, zTa
3920: 62 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 54  bName, strlen(zT
3930: 61 62 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20  abName)+1, 0);. 
3940: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 66 6f   if( p ){.    fo
3950: 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79 3b 20  r(pF1=p->pFKey; 
3960: 70 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e 70 4e  pF1; pF1=pF1->pN
3970: 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20  extFrom){.      
3980: 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e  int nTo = strlen
3990: 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a  (pF1->zTo) + 1;.
39a0: 20 20 20 20 20 20 70 46 32 20 3d 20 73 71 6c 69        pF2 = sqli
39b0: 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 44 62  te3HashFind(&pDb
39c0: 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54  ->aFKey, pF1->zT
39d0: 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 69  o, nTo);.      i
39e0: 66 28 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20  f( pF2==pF1 ){. 
39f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61         sqlite3Ha
3a00: 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 61  shInsert(&pDb->a
3a10: 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20  FKey, pF1->zTo, 
3a20: 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78 74 54  nTo, pF1->pNextT
3a30: 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  o);.      }else{
3a40: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
3a50: 70 46 32 20 26 26 20 70 46 32 2d 3e 70 4e 65 78  pF2 && pF2->pNex
3a60: 74 54 6f 21 3d 70 46 31 20 29 7b 20 70 46 32 3d  tTo!=pF1 ){ pF2=
3a70: 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a  pF2->pNextTo; }.
3a80: 20 20 20 20 20 20 20 20 69 66 28 20 70 46 32 20          if( pF2 
3a90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 32  ){.          pF2
3aa0: 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 46 31 2d  ->pNextTo = pF1-
3ab0: 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 20 20  >pNextTo;.      
3ac0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3ad0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  }.    sqlite3Del
3ae0: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b  eteTable(db, p);
3af0: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
3b00: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
3b10: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
3b20: 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e  ** Given a token
3b30: 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e  , return a strin
3b40: 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  g that consists 
3b50: 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  of the text of t
3b60: 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 20 77 69 74  hat.** token wit
3b70: 68 20 61 6e 79 20 71 75 6f 74 61 74 69 6f 6e 73  h any quotations
3b80: 20 72 65 6d 6f 76 65 64 2e 20 20 53 70 61 63 65   removed.  Space
3b90: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
3ba0: 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20  urned string.** 
3bb0: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
3bc0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
3bd0: 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
3be0: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
3bf0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  .** function..**
3c00: 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 72  .** Tokens are r
3c10: 65 61 6c 6c 79 20 6a 75 73 74 20 70 6f 69 6e 74  eally just point
3c20: 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ers into the ori
3c30: 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61  ginal SQL text a
3c40: 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74  nd so.** are not
3c50: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
3c60: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72   and are not per
3c70: 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65  sistent.  The re
3c80: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
3c90: 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61   is \000 termina
3ca0: 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69  ted and is persi
3cb0: 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a  stent..*/.char *
3cc0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
3cd0: 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d  oken(Token *pNam
3ce0: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
3cf0: 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29  e;.  if( pName )
3d00: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  {.    zName = sq
3d10: 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e 61 6d  liteStrNDup(pNam
3d20: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
3d30: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
3d40: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  ote(zName);.  }e
3d50: 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  lse{.    zName =
3d60: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
3d70: 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zName;.}../*.**
3d80: 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65   Open the sqlite
3d90: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73 74  _master table st
3da0: 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73 65  ored in database
3db0: 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a   number iDb for.
3dc0: 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20  ** writing. The 
3dd0: 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  table is opened 
3de0: 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a  using cursor 0..
3df0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f  */.void sqlite3O
3e00: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 56  penMasterTable(V
3e10: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 44 62 29  dbe *v, int iDb)
3e20: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
3e30: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
3e40: 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 73  er, iDb, 0);.  s
3e50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3e60: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
3e70: 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 29   0, MASTER_ROOT)
3e80: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3e90: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
3ea0: 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35 29 3b  mColumns, 0, 5);
3eb0: 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   /* sqlite_maste
3ec0: 72 20 68 61 73 20 35 20 63 6f 6c 75 6d 6e 73 20  r has 5 columns 
3ed0: 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  */.}../*.** The 
3ee0: 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e  token *pName con
3ef0: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f  tains the name o
3f00: 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69  f a database (ei
3f10: 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a  ther "main" or.*
3f20: 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  * "temp" or the 
3f30: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
3f40: 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f  hed db). This ro
3f50: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
3f60: 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68  e.** index of th
3f70: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
3f80: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
3f90: 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  r -1 if the name
3fa0: 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d db .** does no
3fb0: 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  t exist..*/.int 
3fc0: 66 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a  findDb(sqlite3 *
3fd0: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
3fe0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 44 62  ){.  int i;.  Db
3ff0: 20 2a 70 44 62 3b 0a 20 20 63 68 61 72 20 2a 7a   *pDb;.  char *z
4000: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
4010: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
4020: 65 29 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74  e);.  int n = st
4030: 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 66  rlen(zName);.  f
4040: 6f 72 28 70 44 62 3d 64 62 2d 3e 61 44 62 2c 20  or(pDb=db->aDb, 
4050: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
4060: 69 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20  i++, pDb++){.   
4070: 20 69 66 28 20 6e 3d 3d 73 74 72 6c 65 6e 28 70   if( n==strlen(p
4080: 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 30 3d  Db->zName) && 0=
4090: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
40a0: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  pDb->zName, zNam
40b0: 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  e) ){.      sqli
40c0: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
40d0: 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20       return i;. 
40e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
40f0: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
4100: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
4110: 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   The table or vi
4120: 65 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61  ew or trigger na
4130: 6d 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  me is passed to 
4140: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61  this routine via
4150: 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65   tokens.** pName
4160: 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66  1 and pName2. If
4170: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
4180: 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  was fully qualif
4190: 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ied, for example
41a0: 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54  :.**.** CREATE T
41b0: 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e  ABLE xxx.yyy (..
41c0: 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20  .);.** .** Then 
41d0: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
41e0: 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65   "xxx" and pName
41f0: 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20  2 "yyy". On the 
4200: 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a  other hand if.**
4210: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
4220: 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61  is not fully qua
4230: 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a  lified, i.e.:.**
4240: 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45  .** CREATE TABLE
4250: 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a   yyy(...);.**.**
4260: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
4270: 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64  set to "yyy" and
4280: 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a   pName2 is ""..*
4290: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
42a0: 65 20 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e  e sets the *ppUn
42b0: 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20  qual pointer to 
42c0: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b  point at the tok
42d0: 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a  en (pName1 or.**
42e0: 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74   pName2) that st
42f0: 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69  ores the unquali
4300: 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e  fied table name.
4310: 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74    The index of t
4320: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22  he.** database "
4330: 78 78 78 22 20 69 73 20 72 65 74 75 72 6e 65 64  xxx" is returned
4340: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4350: 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50  TwoPartName(.  P
4360: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4370: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
4380: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
4390: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
43a0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
43b0: 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20     /* The "xxx" 
43c0: 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78  in the name "xxx
43d0: 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a  .yyy" or "xxx" *
43e0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
43f0: 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  2,      /* The "
4400: 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  yyy" in the name
4410: 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20   "xxx.yyy" */.  
4420: 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20  Token **pUnqual 
4430: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
4440: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a   unqualified obj
4450: 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f  ect name here */
4460: 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  .){.  int iDb;  
4470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4480: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
4490: 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74  lding the object
44a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
44b0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
44c0: 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26  .  if( pName2 &&
44d0: 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a   pName2->n>0 ){.
44e0: 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
44f0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
4500: 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61    *pUnqual = pNa
4510: 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 66  me2;.    iDb = f
4520: 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31  indDb(db, pName1
4530: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
4540: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4550: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4560: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62  , "unknown datab
4570: 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29  ase %T", pName1)
4580: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
4590: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65  nErr++;.      re
45a0: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
45b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
45c0: 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  rt( db->init.iDb
45d0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e  ==0 || db->init.
45e0: 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62 20  busy );.    iDb 
45f0: 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a  = db->init.iDb;.
4600: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
4610: 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74  Name1;.  }.  ret
4620: 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn iDb;.}../*.*
4630: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4640: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
4650: 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72  if the UTF-8 str
4660: 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c  ing zName is a l
4670: 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66  egal.** unqualif
4680: 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e  ied name for a n
4690: 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  ew schema object
46a0: 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20   (table, index, 
46b0: 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67  view or.** trigg
46c0: 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61  er). All names a
46d0: 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20  re legal except 
46e0: 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e  those that begin
46f0: 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67   with the string
4700: 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69  .** "sqlite_" (i
4710: 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f  n upper, lower o
4720: 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54  r mixed case). T
4730: 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  his portion of t
4740: 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20  he namespace.** 
4750: 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  is reserved for 
4760: 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f  internal use..*/
4770: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
4780: 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73  kObjectName(Pars
4790: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
47a0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
47b0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62   if( !pParse->db
47c0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
47d0: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
47e0: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30   .          && 0
47f0: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
4800: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
4810: 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71  _", 7) ){.    sq
4820: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
4830: 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61  arse, "object na
4840: 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  me reserved for 
4850: 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73  internal use: %s
4860: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ", zName);.    r
4870: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
4880: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
4890: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
48a0: 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74  *.** Begin const
48b0: 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ructing a new ta
48c0: 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
48d0: 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54  on in memory.  T
48e0: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
48f0: 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61  rst of several a
4900: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74  ction routines t
4910: 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69  hat get called i
4920: 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f  n response.** to
4930: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
4940: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70  statement.  In p
4950: 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20  articular, this 
4960: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
4970: 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e  d.** after seein
4980: 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45  g tokens "CREATE
4990: 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e  " and "TABLE" an
49a0: 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  d the table name
49b0: 2e 20 20 54 68 65 0a 2a 2a 20 70 53 74 61 72 74  .  The.** pStart
49c0: 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 43 52   token is the CR
49d0: 45 41 54 45 20 61 6e 64 20 70 4e 61 6d 65 20 69  EATE and pName i
49e0: 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  s the table name
49f0: 2e 20 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a  .  The isTemp.**
4a00: 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66   flag is true if
4a10: 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c   the table shoul
4a20: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
4a30: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
4a40: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e  abase.** file in
4a50: 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20  stead of in the 
4a60: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
4a70: 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  le.  This is nor
4a80: 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a  mally the case.*
4a90: 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50  * when the "TEMP
4aa0: 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22  " or "TEMPORARY"
4ab0: 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20   keyword occurs 
4ac0: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52  in between.** CR
4ad0: 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a  EATE and TABLE..
4ae0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61  **.** The new ta
4af0: 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e  ble record is in
4b00: 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75  itialized and pu
4b10: 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65  t in pParse->pNe
4b20: 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f  wTable..** As mo
4b30: 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  re of the CREATE
4b40: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
4b50: 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69   is parsed, addi
4b60: 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a  tional action.**
4b70: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62   routines will b
4b80: 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20  e called to add 
4b90: 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
4ba0: 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e   to this record.
4bb0: 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
4bc0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
4bd0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  LE statement, th
4be0: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
4bf0: 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  e() routine.** i
4c00: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70  s called to comp
4c10: 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75  lete the constru
4c20: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77  ction of the new
4c30: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a   table record..*
4c40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74  /.void sqlite3St
4c50: 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73  artTable(.  Pars
4c60: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
4c70: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
4c80: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72  /.  Token *pStar
4c90: 74 2c 20 20 20 2f 2a 20 54 68 65 20 22 43 52 45  t,   /* The "CRE
4ca0: 41 54 45 22 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  ATE" token */.  
4cb0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
4cc0: 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
4cd0: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
4ce0: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
4cf0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
4d00: 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  e2,   /* Second 
4d10: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65  part of the name
4d20: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
4d30: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
4d40: 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54  sTemp,      /* T
4d50: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
4d60: 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20   TEMP table */. 
4d70: 20 69 6e 74 20 69 73 56 69 65 77 20 20 20 20 20   int isView     
4d80: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
4d90: 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 29  s is a VIEW */.)
4da0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  {.  Table *pTabl
4db0: 65 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  e;.  Index *pIdx
4dc0: 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  ;.  char *zName;
4dd0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
4de0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
4df0: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44  dbe *v;.  int iD
4e00: 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  b;         /* Da
4e10: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f  tabase number to
4e20: 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c   create the tabl
4e30: 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  e in */.  Token 
4e40: 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e  *pName;    /* Un
4e50: 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f  qualified name o
4e60: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63  f the table to c
4e70: 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54  reate */..  /* T
4e80: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
4e90: 20 6e 61 6d 65 20 74 6f 20 63 72 65 61 74 65 20   name to create 
4ea0: 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  is passed to thi
4eb0: 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f  s routine via to
4ec0: 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31  kens.  ** pName1
4ed0: 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20   and pName2. If 
4ee0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77  the table name w
4ef0: 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  as fully qualifi
4f00: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a  ed, for example:
4f10: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54  .  **.  ** CREAT
4f20: 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20  E TABLE xxx.yyy 
4f30: 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a  (...);.  ** .  *
4f40: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
4f50: 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e   set to "xxx" an
4f60: 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20  d pName2 "yyy". 
4f70: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
4f80: 64 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 74 61  d if.  ** the ta
4f90: 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  ble name is not 
4fa0: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
4fb0: 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   i.e.:.  **.  **
4fc0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 79   CREATE TABLE yy
4fd0: 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a  y(...);.  **.  *
4fe0: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
4ff0: 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e   set to "yyy" an
5000: 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a  d pName2 is ""..
5010: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61    **.  ** The ca
5020: 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73 20 74 68  ll below sets th
5030: 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20  e pName pointer 
5040: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
5050: 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72  token (pName1 or
5060: 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68  .  ** pName2) th
5070: 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e  at stores the un
5080: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
5090: 6e 61 6d 65 2e 20 54 68 65 20 76 61 72 69 61 62  name. The variab
50a0: 6c 65 20 69 44 62 20 69 73 0a 20 20 2a 2a 20 73  le iDb is.  ** s
50b0: 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
50c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
50d0: 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 6f  that the table o
50e0: 72 20 76 69 65 77 20 69 73 20 74 6f 20 62 65 0a  r view is to be.
50f0: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 2e    ** created in.
5100: 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71  .  */.  iDb = sq
5110: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
5120: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
5130: 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
5140: 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20  ;.  if( iDb<0 ) 
5150: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 69 73  return;.  if( is
5160: 54 65 6d 70 20 26 26 20 69 44 62 3e 31 20 29 7b  Temp && iDb>1 ){
5170: 0a 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74  .    /* If creat
5180: 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65  ing a temp table
5190: 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e  , the name may n
51a0: 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65 64 20  ot be qualified 
51b0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  */.    sqlite3Er
51c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
51d0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
51e0: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71  name must be unq
51f0: 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20  ualified");.    
5200: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
5210: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
5220: 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 20 69    if( isTemp ) i
5230: 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73  Db = 1;..  pPars
5240: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20  e->sNameToken = 
5250: 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20  *pName;.  zName 
5260: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
5270: 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
5280: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
5290: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51  return;.  if( SQ
52a0: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
52b0: 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
52c0: 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29  pParse, zName) )
52d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
52e0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  (zName);.    ret
52f0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  urn;.  }.  if( d
5300: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29  b->init.iDb==1 )
5310: 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66   isTemp = 1;.#if
5320: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5330: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
5340: 20 61 73 73 65 72 74 28 20 28 69 73 54 65 6d 70   assert( (isTemp
5350: 20 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b   & 1)==isTemp );
5360: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
5370: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62  e;.    char *zDb
5380: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
5390: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73  zName;.    if( s
53a0: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
53b0: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49  pParse, SQLITE_I
53c0: 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41  NSERT, SCHEMA_TA
53d0: 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20  BLE(isTemp), 0, 
53e0: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71  zDb) ){.      sq
53f0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
5400: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
5410: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56     }.    if( isV
5420: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  iew ){.      if(
5430: 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20   isTemp ){.     
5440: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
5450: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45  _CREATE_TEMP_VIE
5460: 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  W;.      }else{.
5470: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
5480: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45  QLITE_CREATE_VIE
5490: 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  W;.      }.    }
54a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
54b0: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
54c0: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
54d0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
54e0: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
54f0: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
5500: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
5510: 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LE;.      }.    
5520: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
5530: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
5540: 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20  e, code, zName, 
5550: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
5560: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
5570: 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
5580: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
5590: 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  if..  /* Make su
55a0: 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  re the new table
55b0: 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63   name does not c
55c0: 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65  ollide with an e
55d0: 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  xisting.  ** ind
55e0: 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65  ex or table name
55f0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
5600: 61 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e  abase.  Issue an
5610: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
5620: 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 0a  f.  ** it does..
5630: 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54    */.  if( SQLIT
5640: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
5650: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
5660: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 61 62  ) return;.  pTab
5670: 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  le = sqlite3Find
5680: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
5690: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
56a0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ame);.  if( pTab
56b0: 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  le ){.    sqlite
56c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
56d0: 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65  , "table %T alre
56e0: 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61  ady exists", pNa
56f0: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
5700: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
5710: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
5720: 28 20 28 70 49 64 78 20 3d 20 73 71 6c 69 74 65  ( (pIdx = sqlite
5730: 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
5740: 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 26 26 20  Name, 0))!=0 && 
5750: 0a 20 20 20 20 20 20 28 20 69 44 62 3d 3d 30 20  .      ( iDb==0 
5760: 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  || !db->init.bus
5770: 79 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  y) ){.    sqlite
5780: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5790: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
57a0: 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d  ady an index nam
57b0: 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
57c0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
57d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
57e0: 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20  n;.  }.  pTable 
57f0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
5800: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b  sizeof(Table) );
5810: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
5820: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
5830: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
5840: 4d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  M;.    pParse->n
5850: 45 72 72 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Err++;.    sqlit
5860: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
5870: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
5880: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20  pTable->zName = 
5890: 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d  zName;.  pTable-
58a0: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  >nCol = 0;.  pTa
58b0: 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  ble->aCol = 0;. 
58c0: 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d   pTable->iPKey =
58d0: 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70   -1;.  pTable->p
58e0: 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54 61  Index = 0;.  pTa
58f0: 62 6c 65 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a  ble->iDb = iDb;.
5900: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e    if( pParse->pN
5910: 65 77 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65  ewTable ) sqlite
5920: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
5930: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
5940: 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70  le);.  pParse->p
5950: 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  NewTable = pTabl
5960: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  e;..  /* If this
5970: 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73 71   is the magic sq
5980: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
5990: 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74 6f  ble used by auto
59a0: 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20  increment,.  ** 
59b0: 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f  then record a po
59c0: 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74 61  inter to this ta
59d0: 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ble in the main 
59e0: 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
59f0: 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  re.  ** so that 
5a00: 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20  INSERT can find 
5a10: 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79  the table easily
5a20: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
5a30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
5a40: 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 73  NCREMENT.  if( s
5a50: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  trcmp(zName, "sq
5a60: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d  lite_sequence")=
5a70: 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 44  =0 ){.    db->aD
5a80: 62 5b 69 44 62 5d 2e 70 53 65 71 54 61 62 20 3d  b[iDb].pSeqTab =
5a90: 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e   pTable;.  }.#en
5aa0: 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  dif..  /* Begin 
5ab0: 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63  generating the c
5ac0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
5ad0: 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72  sert the table r
5ae0: 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20  ecord into.  ** 
5af0: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
5b00: 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69  R table.  Note i
5b10: 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61  n particular tha
5b20: 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65  t we must go ahe
5b30: 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f  ad.  ** and allo
5b40: 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20  cate the record 
5b50: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
5b60: 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20  able entry now. 
5b70: 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a   Before any.  **
5b80: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
5b90: 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20  UNIQUE keywords 
5ba0: 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f  are parsed.  Tho
5bb0: 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c  se keywords will
5bc0: 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69   cause.  ** indi
5bd0: 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65  ces to be create
5be0: 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  d and the table 
5bf0: 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65  record must come
5c00: 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a   before the .  *
5c10: 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63  * indices.  Henc
5c20: 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  e, the record nu
5c30: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
5c40: 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63  le must be alloc
5c50: 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20  ated.  ** now.. 
5c60: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
5c70: 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d  nit.busy && (v =
5c80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
5c90: 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20  pParse))!=0 ){. 
5ca0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
5cb0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
5cc0: 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a  arse, 0, iDb);..
5cd0: 20 20 20 20 2f 2a 20 45 76 65 72 79 20 74 69 6d      /* Every tim
5ce0: 65 20 61 20 6e 65 77 20 74 61 62 6c 65 20 69 73  e a new table is
5cf0: 20 63 72 65 61 74 65 64 20 74 68 65 20 66 69 6c   created the fil
5d00: 65 2d 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20  e-format.    ** 
5d10: 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 6d 65 74  and encoding met
5d20: 61 2d 76 61 6c 75 65 73 20 61 72 65 20 73 65 74  a-values are set
5d30: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
5d40: 2c 20 69 6e 0a 20 20 20 20 2a 2a 20 63 61 73 65  , in.    ** case
5d50: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
5d60: 73 74 20 74 61 62 6c 65 20 63 72 65 61 74 65 64  st table created
5d70: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
5d80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5d90: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d   OP_Integer, db-
5da0: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 30 29  >file_format, 0)
5db0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5dc0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
5dd0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b  Cookie, iDb, 1);
5de0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5df0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
5e00: 67 65 72 2c 20 64 62 2d 3e 65 6e 63 2c 20 30 29  ger, db->enc, 0)
5e10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5e20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
5e30: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 34 29 3b  Cookie, iDb, 4);
5e40: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75  ..    /* This ju
5e50: 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61  st creates a pla
5e60: 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64  ce-holder record
5e70: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
5e80: 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20  aster table..   
5e90: 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63   ** The record c
5ea0: 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20  reated does not 
5eb0: 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67  contain anything
5ec0: 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62   yet.  It will b
5ed0: 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a  e replaced.    *
5ee0: 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e  * by the real en
5ef0: 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65  try in code gene
5f00: 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33  rated at sqlite3
5f10: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20  EndTable()..    
5f20: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  **.    ** The ro
5f30: 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  wid for the new 
5f40: 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 6f 6e  entry is left on
5f50: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
5f60: 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 54 68  stack..    ** Th
5f70: 65 20 72 6f 77 69 64 20 76 61 6c 75 65 20 69 73  e rowid value is
5f80: 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 63   needed by the c
5f90: 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ode that sqlite3
5fa0: 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 0a 20 20  EndTable will.  
5fb0: 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 2e 0a 20    ** generate.. 
5fc0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
5fd0: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
5fe0: 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  (v, iDb);.    sq
5ff0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6000: 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30  , OP_NewRecno, 0
6010: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
6020: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
6030: 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
6040: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6050: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  p(v, OP_String8,
6060: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
6070: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6080: 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c  OP_PutIntKey, 0,
6090: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
60a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
60b0: 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Close, 0, 0);.  
60c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
60d0: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74   new column to t
60e0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
60f0: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
6100: 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cted..**.** The 
6110: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
6120: 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66  s routine once f
6130: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64  or each column d
6140: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e  eclaration.** in
6150: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
6160: 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69  statement.  sqli
6170: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20  te3StartTable() 
6180: 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66  gets called.** f
6190: 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e  irst to get thin
61a0: 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20  gs going.  Then 
61b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
61c0: 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a  called for each.
61d0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f  ** column..*/.vo
61e0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
61f0: 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  umn(Parse *pPars
6200: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  e, Token *pName)
6210: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
6220: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
6230: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
6240: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
6250: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
6260: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  =0 ) return;.  z
6270: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
6280: 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
6290: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
62a0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
62b0: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
62c0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
62d0: 53 74 72 49 43 6d 70 28 7a 2c 20 70 2d 3e 61 43  StrICmp(z, p->aC
62e0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ol[i].zName)==0 
62f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6300: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6310: 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75   "duplicate colu
6320: 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29  mn name: %s", z)
6330: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
6340: 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  ee(z);.      ret
6350: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  urn;.    }.  }. 
6360: 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20   if( (p->nCol & 
6370: 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43  0x7)==0 ){.    C
6380: 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20  olumn *aNew;.   
6390: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65   aNew = sqliteRe
63a0: 61 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20  alloc( p->aCol, 
63b0: 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65  (p->nCol+8)*size
63c0: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
63d0: 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30  .    if( aNew==0
63e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
63f0: 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20  ->aCol = aNew;. 
6400: 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e   }.  pCol = &p->
6410: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20  aCol[p->nCol];. 
6420: 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c   memset(pCol, 0,
6430: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b   sizeof(p->aCol[
6440: 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e  0]));.  pCol->zN
6450: 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20  ame = z;. .  /* 
6460: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74  If there is no t
6470: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63  ype specified, c
6480: 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20  olumns have the 
6490: 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79  default affinity
64a0: 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66  .  ** 'NONE'. If
64b0: 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70 65   there is a type
64c0: 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e   specified, then
64d0: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
64e0: 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a  nType() will.  *
64f0: 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74  * be called next
6500: 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66   to set pCol->af
6510: 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79  finity correctly
6520: 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61  ..  */.  pCol->a
6530: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
6540: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 43 6f  _AFF_NONE;.  pCo
6550: 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73  l->pColl = pPars
6560: 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
6570: 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d  ;.  p->nCol++;.}
6580: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
6590: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
65a0: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
65b0: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
65c0: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
65d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
65e0: 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54  atement.  A "NOT
65f0: 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e   NULL" constrain
6600: 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65  t has.** been se
6610: 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20  en on a column. 
6620: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
6630: 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66  ts the notNull f
6640: 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f  lag on.** the co
6650: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
6660: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
6670: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
6680: 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72  e3AddNotNull(Par
6690: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
66a0: 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c  onError){.  Tabl
66b0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
66c0: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
66d0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
66e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
66f0: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
6700: 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b   i>=0 ) p->aCol[
6710: 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45  i].notNull = onE
6720: 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rror;.}../*.** T
6730: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
6740: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
6750: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
6760: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
6770: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
6780: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
6790: 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65   The pFirst toke
67a0: 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  n is the first.*
67b0: 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73  * token in the s
67c0: 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e  equence of token
67d0: 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20  s that describe 
67e0: 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a  the type of the.
67f0: 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e  ** column curren
6800: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
6810: 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20  uction.   pLast 
6820: 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65  is the last toke
6830: 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75  n.** in the sequ
6840: 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20  ence.  Use this 
6850: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63  information to c
6860: 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e  onstruct a strin
6870: 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69  g.** that contai
6880: 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20  ns the typename 
6890: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e  of the column an
68a0: 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72  d store that str
68b0: 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e  ing.** in zType.
68c0: 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  .*/ .void sqlite
68d0: 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50  3AddColumnType(P
68e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
68f0: 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b  ken *pFirst, Tok
6900: 65 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20 54 61  en *pLast){.  Ta
6910: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 2c  ble *p;.  int i,
6920: 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63   j;.  int n;.  c
6930: 68 61 72 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20 20  har *z, **pz;.  
6940: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
6950: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
6960: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
6970: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
6980: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20  ->nCol-1;.  if( 
6990: 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  i<0 ) return;.  
69a0: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
69b0: 69 5d 3b 0a 20 20 70 7a 20 3d 20 26 70 43 6f 6c  i];.  pz = &pCol
69c0: 2d 3e 7a 54 79 70 65 3b 0a 20 20 6e 20 3d 20 70  ->zType;.  n = p
69d0: 4c 61 73 74 2d 3e 6e 20 2b 20 28 70 4c 61 73 74  Last->n + (pLast
69e0: 2d 3e 7a 20 2d 20 70 46 69 72 73 74 2d 3e 7a 29  ->z - pFirst->z)
69f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c  ;.  assert( pCol
6a00: 2d 3e 7a 54 79 70 65 3d 3d 30 20 29 3b 0a 20 20  ->zType==0 );.  
6a10: 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20  z = pCol->zType 
6a20: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
6a30: 28 22 25 2e 2a 73 22 2c 20 6e 2c 20 70 46 69 72  ("%.*s", n, pFir
6a40: 73 74 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 7a 3d  st->z);.  if( z=
6a50: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
6a60: 6f 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20  or(i=j=0; z[i]; 
6a70: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 20  i++){.    int c 
6a80: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  = z[i];.    if( 
6a90: 69 73 73 70 61 63 65 28 63 29 20 29 20 63 6f 6e  isspace(c) ) con
6aa0: 74 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b  tinue;.    z[j++
6ab0: 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a  ] = c;.  }.  z[j
6ac0: 5d 20 3d 20 30 3b 0a 20 20 70 43 6f 6c 2d 3e 61  ] = 0;.  pCol->a
6ad0: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
6ae0: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a 2c  3AffinityType(z,
6af0: 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   n);.}../*.** Th
6b00: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
6b10: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
6b20: 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  e for the most r
6b30: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
6b40: 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74  lumn.** of the t
6b50: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
6b60: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
6b70: 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74  n..**.** Default
6b80: 20 76 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f   value expressio
6b90: 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74  ns must be const
6ba0: 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65  ant.  Raise an e
6bb0: 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73  xception if this
6bc0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63  .** is not the c
6bd0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
6be0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
6bf0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
6c00: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
6c10: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
6c20: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
6c30: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
6c40: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65  oid sqlite3AddDe
6c50: 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65  faultValue(Parse
6c60: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
6c70: 70 45 78 70 72 29 7b 0a 20 20 54 61 62 6c 65 20  pExpr){.  Table 
6c80: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
6c90: 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  ol;.  if( (p = p
6ca0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
6cb0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
6cc0: 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f   pCol = &(p->aCo
6cd0: 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20  l[p->nCol-1]);. 
6ce0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
6cf0: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70  rIsConstant(pExp
6d00: 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
6d10: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6d20: 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65  , "default value
6d30: 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20   of column [%s] 
6d40: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22  is not constant"
6d50: 2c 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e  ,.        pCol->
6d60: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  zName);.  }else{
6d70: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
6d80: 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66  Delete(pCol->pDf
6d90: 6c 74 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 70  lt);.    pCol->p
6da0: 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Dflt = sqlite3Ex
6db0: 70 72 44 75 70 28 70 45 78 70 72 29 3b 0a 20 20  prDup(pExpr);.  
6dc0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65    sqlite3ExprChe
6dd0: 63 6b 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ck(pParse, pExpr
6de0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  , 0, 0);.  }.  s
6df0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6e00: 28 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pExpr);.}../*.*
6e10: 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20  * Designate the 
6e20: 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20  PRIMARY KEY for 
6e30: 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73  the table.  pLis
6e40: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e  t is a list of n
6e50: 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75  ames .** of colu
6e60: 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68  mns that form th
6e70: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20  e primary key.  
6e80: 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c  If pList is NULL
6e90: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f  , then the.** mo
6ea0: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
6eb0: 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  d column of the 
6ec0: 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69  table is the pri
6ed0: 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20  mary key..**.** 
6ee0: 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65  A table can have
6ef0: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69   at most one pri
6f00: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68  mary key.  If th
6f10: 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
6f20: 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79  has.** a primary
6f30: 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69   key (and this i
6f40: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69  s the second pri
6f50: 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63  mary key) then c
6f60: 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  reate an.** erro
6f70: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
6f80: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f  PRIMARY KEY is o
6f90: 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  n a single colum
6fa0: 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65  n whose datatype
6fb0: 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20   is INTEGER,.** 
6fc0: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79  then we will try
6fd0: 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c   to use that col
6fe0: 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 20 69  umn as the row i
6ff0: 64 2e 20 20 28 45 78 63 65 70 74 69 6f 6e 3a 0a  d.  (Exception:.
7000: 2a 2a 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73  ** For backwards
7010: 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
7020: 69 74 68 20 6f 6c 64 65 72 20 64 61 74 61 62 61  ith older databa
7030: 73 65 73 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74  ses, do not do t
7040: 68 69 73 0a 2a 2a 20 69 66 20 74 68 65 20 66 69  his.** if the fi
7050: 6c 65 20 66 6f 72 6d 61 74 20 76 65 72 73 69 6f  le format versio
7060: 6e 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  n number is less
7070: 20 74 68 61 6e 20 31 2e 29 20 20 53 65 74 20 74   than 1.)  Set t
7080: 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a  he Table.iPKey.*
7090: 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74  * field of the t
70a0: 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
70b0: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68  ruction to be th
70c0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a  e index of the.*
70d0: 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  * INTEGER PRIMAR
70e0: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54  Y KEY column.  T
70f0: 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65  able.iPKey is se
7100: 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65  t to -1 if there
7110: 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45   is.** no INTEGE
7120: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
7130: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20  *.** If the key 
7140: 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45  is not an INTEGE
7150: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74  R PRIMARY KEY, t
7160: 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69  hen create a uni
7170: 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72  que.** index for
7180: 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e   the key.  No in
7190: 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66  dex is created f
71a0: 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  or INTEGER PRIMA
71b0: 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64  RY KEYs..*/.void
71c0: 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61   sqlite3AddPrima
71d0: 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a  ryKey(.  Parse *
71e0: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
71f0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
7200: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
7210: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
7220: 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62  field names to b
7230: 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
7240: 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
7250: 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
7260: 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73  ith a uniqueness
7270: 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69   conflict */.  i
7280: 6e 74 20 61 75 74 6f 49 6e 63 20 20 20 20 20 20  nt autoInc      
7290: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
72a0: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65  AUTOINCREMENT ke
72b0: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
72c0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
72d0: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
72e0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72  NewTable;.  char
72f0: 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69   *zType = 0;.  i
7300: 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b  nt iCol = -1, i;
7310: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
7320: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
7330: 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54  y_exit;.  if( pT
7340: 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29  ab->hasPrimKey )
7350: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
7360: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
7370: 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73       "table \"%s
7380: 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  \" has more than
7390: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
73a0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
73b0: 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72  .    goto primar
73c0: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a  y_key_exit;.  }.
73d0: 20 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b    pTab->hasPrimK
73e0: 65 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c  ey = 1;.  if( pL
73f0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43  ist==0 ){.    iC
7400: 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  ol = pTab->nCol 
7410: 2d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61  - 1;.    pTab->a
7420: 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d  Col[iCol].isPrim
7430: 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Key = 1;.  }else
7440: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
7450: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
7460: 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  ++){.      for(i
7470: 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62  Col=0; iCol<pTab
7480: 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b  ->nCol; iCol++){
7490: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
74a0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
74b0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70  t->a[i].zName, p
74c0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
74d0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
74e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
74f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7500: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70        if( iCol<p
7510: 54 61 62 2d 3e 6e 43 6f 6c 20 29 20 70 54 61 62  Tab->nCol ) pTab
7520: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50  ->aCol[iCol].isP
7530: 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  rimKey = 1;.    
7540: 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  }.    if( pList-
7550: 3e 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20  >nExpr>1 ) iCol 
7560: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  = -1;.  }.  if( 
7570: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
7580: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
7590: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
75a0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
75b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70  ;.  }.  if( zTyp
75c0: 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  e && sqlite3StrI
75d0: 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45  Cmp(zType, "INTE
75e0: 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  GER")==0 ){.    
75f0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43  pTab->iPKey = iC
7600: 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65  ol;.    pTab->ke
7610: 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b  yConf = onError;
7620: 0a 20 20 20 20 70 54 61 62 2d 3e 61 75 74 6f 49  .    pTab->autoI
7630: 6e 63 20 3d 20 61 75 74 6f 49 6e 63 3b 0a 20 20  nc = autoInc;.  
7640: 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e  }else if( autoIn
7650: 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  c ){.#ifndef SQL
7660: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
7670: 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74  REMENT.    sqlit
7680: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7690: 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e  e, "AUTOINCREMEN
76a0: 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65  T is only allowe
76b0: 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20  d on an ".      
76c0: 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52   "INTEGER PRIMAR
76d0: 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a  Y KEY");.#endif.
76e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
76f0: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
7700: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
7710: 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c   pList, onError,
7720: 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73   0, 0);.    pLis
7730: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d  t = 0;.  }..prim
7740: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20  ary_key_exit:.  
7750: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
7760: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
7770: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
7780: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
7790: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74  on function of t
77a0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
77b0: 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f   parsed table co
77c0: 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43  lumn.** to the C
77d0: 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f  ollSeq given..*/
77e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
77f0: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
7800: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
7810: 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e   char *zType, in
7820: 74 20 6e 54 79 70 65 29 7b 0a 20 20 54 61 62 6c  t nType){.  Tabl
7830: 65 20 2a 70 3b 0a 20 20 49 6e 64 65 78 20 2a 70  e *p;.  Index *p
7840: 49 64 78 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Idx;.  CollSeq *
7850: 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pColl;.  int i;.
7860: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
7870: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
7880: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
7890: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20 20  = p->nCol-1;..  
78a0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c  pColl = sqlite3L
78b0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
78c0: 72 73 65 2c 20 7a 54 79 70 65 2c 20 6e 54 79 70  rse, zType, nTyp
78d0: 65 29 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d  e);.  p->aCol[i]
78e0: 2e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a  .pColl = pColl;.
78f0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c  .  /* If the col
7900: 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20  umn is declared 
7910: 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41  as "<name> PRIMA
7920: 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c  RY KEY COLLATE <
7930: 74 79 70 65 3e 22 2c 0a 20 20 2a 2a 20 74 68 65  type>",.  ** the
7940: 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68  n an index may h
7950: 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64  ave been created
7960: 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20   on this column 
7970: 62 65 66 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20  before the.  ** 
7980: 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77  collation type w
7990: 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63  as added. Correc
79a0: 74 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20  t this if it is 
79b0: 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20  the case..  */. 
79c0: 20 66 6f 72 28 70 49 64 78 20 3d 20 70 2d 3e 70   for(pIdx = p->p
79d0: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
79e0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
79f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
7a00: 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ->nColumn==1 );.
7a10: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
7a20: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 20 70  Column[0]==i ) p
7a30: 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  Idx->keyInfo.aCo
7a40: 6c 6c 5b 30 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20  ll[0] = pColl;. 
7a50: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61   }.}../*.** Loca
7a60: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  te and return an
7a70: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
7a80: 64 62 2e 61 43 6f 6c 6c 53 65 71 20 68 61 73 68  db.aCollSeq hash
7a90: 20 74 61 62 6c 65 2e 20 49 66 20 74 68 65 20 65   table. If the e
7aa0: 6e 74 72 79 0a 2a 2a 20 73 70 65 63 69 66 69 65  ntry.** specifie
7ab0: 64 20 62 79 20 7a 4e 61 6d 65 20 61 6e 64 20 6e  d by zName and n
7ac0: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 66 6f 75 6e  Name is not foun
7ad0: 64 20 61 6e 64 20 70 61 72 61 6d 65 74 65 72 20  d and parameter 
7ae0: 27 63 72 65 61 74 65 27 20 69 73 0a 2a 2a 20 74  'create' is.** t
7af0: 72 75 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65  rue, then create
7b00: 20 61 20 6e 65 77 20 65 6e 74 72 79 2e 20 4f 74   a new entry. Ot
7b10: 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 4e  herwise return N
7b20: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ULL..**.** Each 
7b30: 70 6f 69 6e 74 65 72 20 73 74 6f 72 65 64 20 69  pointer stored i
7b40: 6e 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 43  n the sqlite3.aC
7b50: 6f 6c 6c 53 65 71 20 68 61 73 68 20 74 61 62 6c  ollSeq hash tabl
7b60: 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 0a 2a 2a  e contains an.**
7b70: 20 61 72 72 61 79 20 6f 66 20 74 68 72 65 65 20   array of three 
7b80: 43 6f 6c 6c 53 65 71 20 73 74 72 75 63 74 75 72  CollSeq structur
7b90: 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 69 73  es. The first is
7ba0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
7bb0: 65 71 75 65 6e 63 65 0a 2a 2a 20 70 72 65 66 66  equence.** preff
7bc0: 65 72 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c  erred for UTF-8,
7bd0: 20 74 68 65 20 73 65 63 6f 6e 64 20 55 54 46 2d   the second UTF-
7be0: 31 36 6c 65 2c 20 61 6e 64 20 74 68 65 20 74 68  16le, and the th
7bf0: 69 72 64 20 55 54 46 2d 31 36 62 65 2e 0a 2a 2a  ird UTF-16be..**
7c00: 0a 2a 2a 20 53 74 6f 72 65 64 20 69 6d 6d 65 64  .** Stored immed
7c10: 69 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65  iately after the
7c20: 20 74 68 72 65 65 20 63 6f 6c 6c 61 74 69 6f 6e   three collation
7c30: 20 73 65 71 75 65 6e 63 65 73 20 69 73 20 61 20   sequences is a 
7c40: 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 63  copy of.** the c
7c50: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
7c60: 65 20 6e 61 6d 65 2e 20 41 20 70 6f 69 6e 74 65  e name. A pointe
7c70: 72 20 74 6f 20 74 68 69 73 20 73 74 72 69 6e 67  r to this string
7c80: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a   is stored in.**
7c90: 20 65 61 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20   each collation 
7ca0: 73 65 71 75 65 6e 63 65 20 73 74 72 75 63 74 75  sequence structu
7cb0: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f  re..*/.static Co
7cc0: 6c 6c 53 65 71 20 2a 20 66 69 6e 64 43 6f 6c 6c  llSeq * findColl
7cd0: 53 65 71 45 6e 74 72 79 28 0a 20 20 73 71 6c 69  SeqEntry(.  sqli
7ce0: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
7cf0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
7d00: 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74  int nName,.  int
7d10: 20 63 72 65 61 74 65 0a 29 7b 0a 20 20 43 6f 6c   create.){.  Col
7d20: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69  lSeq *pColl;.  i
7d30: 66 28 20 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e 61  f( nName<0 ) nNa
7d40: 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  me = strlen(zNam
7d50: 65 29 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71  e);.  pColl = sq
7d60: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
7d70: 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61  b->aCollSeq, zNa
7d80: 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 0a 20 20 69  me, nName);..  i
7d90: 66 28 20 30 3d 3d 70 43 6f 6c 6c 20 26 26 20 63  f( 0==pColl && c
7da0: 72 65 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f  reate ){.    pCo
7db0: 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ll = sqliteMallo
7dc0: 63 28 20 33 2a 73 69 7a 65 6f 66 28 2a 70 43 6f  c( 3*sizeof(*pCo
7dd0: 6c 6c 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 20  ll) + nName + 1 
7de0: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
7df0: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b   ){.      pColl[
7e00: 30 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  0].zName = (char
7e10: 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20  *)&pColl[3];.   
7e20: 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 65 6e 63 20     pColl[0].enc 
7e30: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
7e40: 20 20 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e 7a 4e       pColl[1].zN
7e50: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 43  ame = (char*)&pC
7e60: 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43  oll[3];.      pC
7e70: 6f 6c 6c 5b 31 5d 2e 65 6e 63 20 3d 20 53 51 4c  oll[1].enc = SQL
7e80: 49 54 45 5f 55 54 46 31 36 4c 45 3b 0a 20 20 20  ITE_UTF16LE;.   
7e90: 20 20 20 70 43 6f 6c 6c 5b 32 5d 2e 7a 4e 61 6d     pColl[2].zNam
7ea0: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c  e = (char*)&pCol
7eb0: 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c  l[3];.      pCol
7ec0: 6c 5b 32 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54  l[2].enc = SQLIT
7ed0: 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 20 20 20  E_UTF16BE;.     
7ee0: 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 5b 30 5d   memcpy(pColl[0]
7ef0: 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e  .zName, zName, n
7f00: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43 6f  Name);.      pCo
7f10: 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 5b 6e 4e 61 6d  ll[0].zName[nNam
7f20: 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  e] = 0;.      sq
7f30: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
7f40: 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 70  &db->aCollSeq, p
7f50: 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 6e  Coll[0].zName, n
7f60: 4e 61 6d 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  Name, pColl);.  
7f70: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
7f80: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pColl;.}../*.**
7f90: 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65   Parameter zName
7fa0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 55 54 46   points to a UTF
7fb0: 2d 38 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e  -8 encoded strin
7fc0: 67 20 6e 4e 61 6d 65 20 62 79 74 65 73 20 6c 6f  g nName bytes lo
7fd0: 6e 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ng..** Return th
7fe0: 65 20 43 6f 6c 6c 53 65 71 2a 20 70 6f 69 6e 74  e CollSeq* point
7ff0: 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6c 6c 61  er for the colla
8000: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
8010: 6d 65 64 20 7a 4e 61 6d 65 0a 2a 2a 20 66 6f 72  med zName.** for
8020: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 27 65   the encoding 'e
8030: 6e 63 27 20 66 72 6f 6d 20 74 68 65 20 64 61 74  nc' from the dat
8040: 61 62 61 73 65 20 27 64 62 27 2e 0a 2a 2a 0a 2a  abase 'db'..**.*
8050: 2a 20 49 66 20 74 68 65 20 65 6e 74 72 79 20 73  * If the entry s
8060: 70 65 63 69 66 69 65 64 20 69 73 20 6e 6f 74 20  pecified is not 
8070: 66 6f 75 6e 64 20 61 6e 64 20 27 63 72 65 61 74  found and 'creat
8080: 65 27 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  e' is true, then
8090: 20 63 72 65 61 74 65 20 61 0a 2a 2a 20 6e 65 77   create a.** new
80a0: 20 65 6e 74 72 79 2e 20 20 4f 74 68 65 72 77 69   entry.  Otherwi
80b0: 73 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  se return NULL..
80c0: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
80d0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 0a  te3FindCollSeq(.
80e0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
80f0: 20 75 38 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74   u8 enc,.  const
8100: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
8110: 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74  int nName,.  int
8120: 20 63 72 65 61 74 65 0a 29 7b 0a 20 20 43 6f 6c   create.){.  Col
8130: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 66 69  lSeq *pColl = fi
8140: 6e 64 43 6f 6c 6c 53 65 71 45 6e 74 72 79 28 64  ndCollSeqEntry(d
8150: 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  b, zName, nName,
8160: 20 63 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65   create);.  asse
8170: 72 74 28 20 53 51 4c 49 54 45 5f 55 54 46 38 3d  rt( SQLITE_UTF8=
8180: 3d 31 20 26 26 20 53 51 4c 49 54 45 5f 55 54 46  =1 && SQLITE_UTF
8190: 31 36 4c 45 3d 3d 32 20 26 26 20 53 51 4c 49 54  16LE==2 && SQLIT
81a0: 45 5f 55 54 46 31 36 42 45 3d 3d 33 20 29 3b 0a  E_UTF16BE==3 );.
81b0: 20 20 61 73 73 65 72 74 28 20 65 6e 63 3e 3d 53    assert( enc>=S
81c0: 51 4c 49 54 45 5f 55 54 46 38 20 26 26 20 65 6e  QLITE_UTF8 && en
81d0: 63 3c 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42  c<=SQLITE_UTF16B
81e0: 45 20 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c  E );.  if( pColl
81f0: 20 29 20 70 43 6f 6c 6c 20 2b 3d 20 65 6e 63 2d   ) pColl += enc-
8200: 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c  1;.  return pCol
8210: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  l;.}../*.** Invo
8220: 6b 65 20 74 68 65 20 27 63 6f 6c 6c 61 74 69 6f  ke the 'collatio
8230: 6e 20 6e 65 65 64 65 64 27 20 63 61 6c 6c 62 61  n needed' callba
8240: 63 6b 20 74 6f 20 72 65 71 75 65 73 74 20 61 20  ck to request a 
8250: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
8260: 63 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  ce.** in the dat
8270: 61 62 61 73 65 20 74 65 78 74 20 65 6e 63 6f 64  abase text encod
8280: 69 6e 67 20 6f 66 20 6e 61 6d 65 20 7a 4e 61 6d  ing of name zNam
8290: 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e  e, length nName.
82a0: 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6c 6c 61  .** If the colla
82b0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2f  tion sequence.*/
82c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 6c  .static void cal
82d0: 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 73 71 6c 69  lCollNeeded(sqli
82e0: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
82f0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
8300: 6e 4e 61 6d 65 29 7b 0a 20 20 61 73 73 65 72 74  nName){.  assert
8310: 28 20 21 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  ( !db->xCollNeed
8320: 65 64 20 7c 7c 20 21 64 62 2d 3e 78 43 6f 6c 6c  ed || !db->xColl
8330: 4e 65 65 64 65 64 31 36 20 29 3b 0a 20 20 69 66  Needed16 );.  if
8340: 28 20 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e 61 6d  ( nName<0 ) nNam
8350: 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  e = strlen(zName
8360: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 78 43 6f  );.  if( db->xCo
8370: 6c 6c 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20  llNeeded ){.    
8380: 63 68 61 72 20 2a 7a 45 78 74 65 72 6e 61 6c 20  char *zExternal 
8390: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
83a0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
83b0: 20 20 20 69 66 28 20 21 7a 45 78 74 65 72 6e 61     if( !zExterna
83c0: 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  l ) return;.    
83d0: 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 28  db->xCollNeeded(
83e0: 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41  db->pCollNeededA
83f0: 72 67 2c 20 64 62 2c 20 28 69 6e 74 29 64 62 2d  rg, db, (int)db-
8400: 3e 65 6e 63 2c 20 7a 45 78 74 65 72 6e 61 6c 29  >enc, zExternal)
8410: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
8420: 28 7a 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20 7d  (zExternal);.  }
8430: 0a 20 20 69 66 28 20 64 62 2d 3e 78 43 6f 6c 6c  .  if( db->xColl
8440: 4e 65 65 64 65 64 31 36 20 29 7b 0a 20 20 20 20  Needed16 ){.    
8450: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 45 78 74  char const *zExt
8460: 65 72 6e 61 6c 3b 0a 20 20 20 20 73 71 6c 69 74  ernal;.    sqlit
8470: 65 33 5f 76 61 6c 75 65 20 2a 70 54 6d 70 20 3d  e3_value *pTmp =
8480: 20 73 71 6c 69 74 65 33 47 65 74 54 72 61 6e 73   sqlite3GetTrans
8490: 69 65 6e 74 56 61 6c 75 65 28 64 62 29 3b 0a 20  ientValue(db);. 
84a0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
84b0: 65 74 53 74 72 28 70 54 6d 70 2c 20 2d 31 2c 20  etStr(pTmp, -1, 
84c0: 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54  zName, SQLITE_UT
84d0: 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  F8, SQLITE_STATI
84e0: 43 29 3b 0a 20 20 20 20 7a 45 78 74 65 72 6e 61  C);.    zExterna
84f0: 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
8500: 54 65 78 74 28 70 54 6d 70 2c 20 53 51 4c 49 54  Text(pTmp, SQLIT
8510: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a  E_UTF16NATIVE);.
8520: 20 20 20 20 69 66 28 20 21 7a 45 78 74 65 72 6e      if( !zExtern
8530: 61 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  al ) return;.   
8540: 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
8550: 31 36 28 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64  16(db->pCollNeed
8560: 65 64 41 72 67 2c 20 64 62 2c 20 28 69 6e 74 29  edArg, db, (int)
8570: 64 62 2d 3e 65 6e 63 2c 20 7a 45 78 74 65 72 6e  db->enc, zExtern
8580: 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  al);.  }.}../*.*
8590: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
85a0: 73 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20  s called if the 
85b0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
85c0: 79 20 66 61 69 6c 73 20 74 6f 20 64 65 6c 69 76  y fails to deliv
85d0: 65 72 20 61 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6f  er a.** collatio
85e0: 6e 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68  n function in th
85f0: 65 20 62 65 73 74 20 65 6e 63 6f 64 69 6e 67 20  e best encoding 
8600: 62 75 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  but there may be
8610: 20 6f 74 68 65 72 20 76 65 72 73 69 6f 6e 73 0a   other versions.
8620: 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6c 6c 61  ** of this colla
8630: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 28 66  tion function (f
8640: 6f 72 20 6f 74 68 65 72 20 74 65 78 74 20 65 6e  or other text en
8650: 63 6f 64 69 6e 67 73 29 20 61 76 61 69 6c 61 62  codings) availab
8660: 6c 65 2e 20 55 73 65 20 6f 6e 65 0a 2a 2a 20 6f  le. Use one.** o
8670: 66 20 74 68 65 73 65 20 69 6e 73 74 65 61 64 20  f these instead 
8680: 69 66 20 74 68 65 79 20 65 78 69 73 74 2e 20 41  if they exist. A
8690: 76 6f 69 64 20 61 20 55 54 46 2d 38 20 3c 2d 3e  void a UTF-8 <->
86a0: 20 55 54 46 2d 31 36 20 63 6f 6e 76 65 72 73 69   UTF-16 conversi
86b0: 6f 6e 20 69 66 0a 2a 2a 20 70 6f 73 73 69 62 6c  on if.** possibl
86c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
86d0: 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 50 61   synthCollSeq(Pa
86e0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c  rse *pParse, Col
86f0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20  lSeq *pColl){.  
8700: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 32 3b  CollSeq *pColl2;
8710: 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 70 43 6f  .  char *z = pCo
8720: 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74  ll->zName;.  int
8730: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a   n = strlen(z);.
8740: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8750: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
8760: 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  t i;.  static co
8770: 6e 73 74 20 75 38 20 61 45 6e 63 5b 5d 20 3d 20  nst u8 aEnc[] = 
8780: 7b 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  { SQLITE_UTF16BE
8790: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
87a0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7d 3b  , SQLITE_UTF8 };
87b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 3b  .  for(i=0; i<3;
87c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43 6f 6c 6c   i++){.    pColl
87d0: 32 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  2 = sqlite3FindC
87e0: 6f 6c 6c 53 65 71 28 64 62 2c 20 61 45 6e 63 5b  ollSeq(db, aEnc[
87f0: 69 5d 2c 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20  i], z, n, 0);.  
8800: 20 20 69 66 28 20 70 43 6f 6c 6c 32 2d 3e 78 43    if( pColl2->xC
8810: 6d 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  mp!=0 ){.      m
8820: 65 6d 63 70 79 28 70 43 6f 6c 6c 2c 20 70 43 6f  emcpy(pColl, pCo
8830: 6c 6c 32 2c 20 73 69 7a 65 6f 66 28 43 6f 6c 6c  ll2, sizeof(Coll
8840: 53 65 71 29 29 3b 0a 20 20 20 20 20 20 72 65 74  Seq));.      ret
8850: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
8860: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
8870: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
8880: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
8890: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
88a0: 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e  o such collation
88b0: 20 73 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73 22   sequence: %.*s"
88c0: 2c 20 6e 2c 20 7a 29 3b 0a 20 20 7d 0a 20 20 70  , n, z);.  }.  p
88d0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
88e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
88f0: 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  RROR;.}../*.** T
8900: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
8910: 61 6c 6c 65 64 20 6f 6e 20 61 20 63 6f 6c 6c 61  alled on a colla
8920: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 62 65  tion sequence be
8930: 66 6f 72 65 20 69 74 20 69 73 20 75 73 65 64 20  fore it is used 
8940: 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74 68 61 74  to.** check that
8950: 20 69 74 20 69 73 20 64 65 66 69 6e 65 64 2e 20   it is defined. 
8960: 41 6e 20 75 6e 64 65 66 69 6e 65 64 20 63 6f 6c  An undefined col
8970: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
8980: 65 78 69 73 74 73 20 77 68 65 6e 0a 2a 2a 20 61  exists when.** a
8990: 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 61   database is loa
89a0: 64 65 64 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ded that contain
89b0: 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  s references to 
89c0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
89d0: 63 65 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65  ces.** that have
89e0: 20 6e 6f 74 20 62 65 65 6e 20 64 65 66 69 6e 65   not been define
89f0: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63 72 65  d by sqlite3_cre
8a00: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 29 20  ate_collation() 
8a10: 65 74 63 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65  etc..**.** If re
8a20: 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75  quired, this rou
8a30: 74 69 6e 65 20 63 61 6c 6c 73 20 74 68 65 20 27  tine calls the '
8a40: 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64  collation needed
8a50: 27 20 63 61 6c 6c 62 61 63 6b 20 74 6f 0a 2a 2a  ' callback to.**
8a60: 20 72 65 71 75 65 73 74 20 61 20 64 65 66 69 6e   request a defin
8a70: 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c  ition of the col
8a80: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
8a90: 20 49 66 20 74 68 69 73 20 64 6f 65 73 6e 27 74   If this doesn't
8aa0: 20 77 6f 72 6b 2c 20 0a 2a 2a 20 61 6e 20 65 71   work, .** an eq
8ab0: 75 69 76 61 6c 65 6e 74 20 63 6f 6c 6c 61 74 69  uivalent collati
8ac0: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 68 61 74  ng sequence that
8ad0: 20 75 73 65 73 20 61 20 74 65 78 74 20 65 6e 63   uses a text enc
8ae0: 6f 64 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a  oding different.
8af0: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ** from the main
8b00: 20 64 61 74 61 62 61 73 65 20 69 73 20 73 75 62   database is sub
8b10: 73 74 69 74 75 74 65 64 2c 20 69 66 20 6f 6e 65  stituted, if one
8b20: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
8b30: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
8b40: 63 6b 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  ckCollSeq(Parse 
8b50: 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c 53 65 71  *pParse, CollSeq
8b60: 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 66 28 20   *pColl){.  if( 
8b70: 70 43 6f 6c 6c 20 26 26 20 21 70 43 6f 6c 6c 2d  pColl && !pColl-
8b80: 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 2f 2a 20  >xCmp ){.    /* 
8b90: 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  No collation seq
8ba0: 75 65 6e 63 65 20 6f 66 20 74 68 69 73 20 74 79  uence of this ty
8bb0: 70 65 20 66 6f 72 20 74 68 69 73 20 65 6e 63 6f  pe for this enco
8bc0: 64 69 6e 67 20 69 73 20 72 65 67 69 73 74 65 72  ding is register
8bd0: 65 64 2e 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 20  ed..    ** Call 
8be0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
8bf0: 63 74 6f 72 79 20 74 6f 20 73 65 65 20 69 66 20  ctory to see if 
8c00: 69 74 20 63 61 6e 20 73 75 70 70 6c 79 20 75 73  it can supply us
8c10: 20 77 69 74 68 20 6f 6e 65 2e 0a 20 20 20 20 2a   with one..    *
8c20: 2f 0a 20 20 20 20 63 61 6c 6c 43 6f 6c 6c 4e 65  /.    callCollNe
8c30: 65 64 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  eded(pParse->db,
8c40: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 73   pColl->zName, s
8c50: 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  trlen(pColl->zNa
8c60: 6d 65 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70  me));.    if( !p
8c70: 43 6f 6c 6c 2d 3e 78 43 6d 70 20 26 26 20 73 79  Coll->xCmp && sy
8c80: 6e 74 68 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  nthCollSeq(pPars
8c90: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, pColl) ){.   
8ca0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8cb0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
8cc0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
8cd0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
8ce0: 61 6c 6c 20 73 71 6c 69 74 65 33 43 68 65 63 6b  all sqlite3Check
8cf0: 43 6f 6c 6c 53 65 71 28 29 20 66 6f 72 20 61 6c  CollSeq() for al
8d00: 6c 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  l collating sequ
8d10: 65 6e 63 65 73 20 69 6e 20 61 6e 20 69 6e 64 65  ences in an inde
8d20: 78 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  x,.** in order t
8d30: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 61 6c  o verify that al
8d40: 6c 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  l the necessary 
8d50: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
8d60: 63 65 73 20 61 72 65 0a 2a 2a 20 6c 6f 61 64 65  ces are.** loade
8d70: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
8d80: 33 43 68 65 63 6b 49 6e 64 65 78 43 6f 6c 6c 53  3CheckIndexCollS
8d90: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
8da0: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
8db0: 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
8dc0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
8dd0: 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43  (i=0; i<pIdx->nC
8de0: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
8df0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68     if( sqlite3Ch
8e00: 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
8e10: 65 2c 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f  e, pIdx->keyInfo
8e20: 2e 61 43 6f 6c 6c 5b 69 5d 29 20 29 7b 0a 20 20  .aColl[i]) ){.  
8e30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8e40: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
8e50: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
8e60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8e70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
8e80: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
8e90: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
8ea0: 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62  quence for datab
8eb0: 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a  ase native text.
8ec0: 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e  ** encoding iden
8ed0: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 74  tified by the st
8ee0: 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67  ring zName, leng
8ef0: 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  th nName..**.** 
8f00: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
8f10: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
8f20: 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  nce is not avail
8f30: 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61  able, or not ava
8f40: 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65  ilable.** in the
8f50: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
8f60: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63   encoding, the c
8f70: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
8f80: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a   is invoked to.*
8f90: 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49 66  * request it. If
8fa0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
8fb0: 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20  actory does not 
8fc0: 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73 65  supply such a se
8fd0: 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74  quence,.** and t
8fe0: 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20 61  he sequence is a
8ff0: 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74  vailable in anot
9000: 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  her text encodin
9010: 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a  g, then that is.
9020: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  ** returned inst
9030: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ead..**.** If no
9040: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
9050: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
9060: 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61  tions sequence a
9070: 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  re available, or
9080: 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f  .** another erro
9090: 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
90a0: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61  s returned and a
90b0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
90c0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
90d0: 70 50 61 72 73 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53  pParse..*/.CollS
90e0: 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74  eq *sqlite3Locat
90f0: 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  eCollSeq(Parse *
9100: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
9110: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e  ar *zName, int n
9120: 4e 61 6d 65 29 7b 0a 20 20 75 38 20 65 6e 63 20  Name){.  u8 enc 
9130: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e  = pParse->db->en
9140: 63 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79  c;.  u8 initbusy
9150: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69   = pParse->db->i
9160: 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c  nit.busy;.  Coll
9170: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
9180: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
9190: 70 50 61 72 73 65 2d 3e 64 62 2c 20 65 6e 63 2c  pParse->db, enc,
91a0: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 69   zName, nName, i
91b0: 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20  nitbusy);.  if( 
91c0: 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e 61 6d 65 20  nName<0 ) nName 
91d0: 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
91e0: 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79  .  if( !initbusy
91f0: 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21   && (!pColl || !
9200: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a  pColl->xCmp) ){.
9210: 20 20 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74      /* No collat
9220: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ion sequence of 
9230: 74 68 69 73 20 74 79 70 65 20 66 6f 72 20 74 68  this type for th
9240: 69 73 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 72  is encoding is r
9250: 65 67 69 73 74 65 72 65 64 2e 0a 20 20 20 20 2a  egistered..    *
9260: 2a 20 43 61 6c 6c 20 74 68 65 20 63 6f 6c 6c 61  * Call the colla
9270: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 74 6f 20  tion factory to 
9280: 73 65 65 20 69 66 20 69 74 20 63 61 6e 20 73 75  see if it can su
9290: 70 70 6c 79 20 75 73 20 77 69 74 68 20 6f 6e 65  pply us with one
92a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 6c  ..    */.    cal
92b0: 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 70 50 61 72  lCollNeeded(pPar
92c0: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  se->db, zName, n
92d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  Name);.    pColl
92e0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
92f0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2d 3e 64 62  llSeq(pParse->db
9300: 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  , enc, zName, nN
9310: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ame, 0);.    if(
9320: 20 70 43 6f 6c 6c 20 26 26 20 21 70 43 6f 6c 6c   pColl && !pColl
9330: 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 20 20  ->xCmp ){.      
9340: 2f 2a 20 54 68 65 72 65 20 6d 61 79 20 62 65 20  /* There may be 
9350: 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  a version of the
9360: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
9370: 6e 63 65 20 74 68 61 74 20 72 65 71 75 69 72 65  nce that require
9380: 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73  s.      ** trans
9390: 6c 61 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 65  lation between e
93a0: 6e 63 6f 64 69 6e 67 73 2e 20 53 65 61 72 63 68  ncodings. Search
93b0: 20 66 6f 72 20 69 74 20 77 69 74 68 20 73 79 6e   for it with syn
93c0: 74 68 43 6f 6c 6c 53 65 71 28 29 2e 0a 20 20 20  thCollSeq()..   
93d0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
93e0: 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 70 50 61  synthCollSeq(pPa
93f0: 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 0a 20  rse, pColl) ){. 
9400: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
9410: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9420: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 68   }..  /* If noth
9430: 69 6e 67 20 68 61 73 20 62 65 65 6e 20 66 6f 75  ing has been fou
9440: 6e 64 2c 20 77 72 69 74 65 20 74 68 65 20 65 72  nd, write the er
9450: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f  ror message into
9460: 20 70 50 61 72 73 65 20 2a 2f 0a 20 20 69 66 28   pParse */.  if(
9470: 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21   !initbusy && (!
9480: 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d  pColl || !pColl-
9490: 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 69 66  >xCmp) ){.    if
94a0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
94b0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
94c0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
94d0: 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c  e, "no such coll
94e0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20  ation sequence: 
94f0: 25 2e 2a 73 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e  %.*s", nName, zN
9500: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
9510: 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20  pColl = 0;.  }. 
9520: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
9530: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  ..../*.** Scan t
9540: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e  he column type n
9550: 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74  ame zType (lengt
9560: 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74  h nType) and ret
9570: 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63  urn the.** assoc
9580: 69 61 74 65 64 20 61 66 66 69 6e 69 74 79 20 74  iated affinity t
9590: 79 70 65 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  ype..*/.char sql
95a0: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
95b0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79  (const char *zTy
95c0: 70 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a  pe, int nType){.
95d0: 20 20 69 6e 74 20 6e 2c 20 69 3b 0a 20 20 73 74    int n, i;.  st
95e0: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
95f0: 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
9600: 61 72 20 2a 7a 53 75 62 3b 20 20 2f 2a 20 4b 65  ar *zSub;  /* Ke
9610: 79 77 6f 72 64 73 20 73 75 62 73 74 72 69 6e 67  ywords substring
9620: 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a   to search for *
9630: 2f 0a 20 20 20 20 63 68 61 72 20 6e 53 75 62 3b  /.    char nSub;
9640: 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67           /* leng
9650: 74 68 20 6f 66 20 7a 53 75 62 20 2a 2f 0a 20 20  th of zSub */.  
9660: 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b    char affinity;
9670: 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
9680: 20 74 6f 20 72 65 74 75 72 6e 20 69 66 20 69 74   to return if it
9690: 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 7d 20   matches */.  } 
96a0: 73 75 62 73 74 72 69 6e 67 73 5b 5d 20 3d 20 7b  substrings[] = {
96b0: 0a 20 20 20 20 7b 22 49 4e 54 22 2c 20 20 33 2c  .    {"INT",  3,
96c0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
96d0: 47 45 52 7d 2c 0a 20 20 20 20 7b 22 43 48 41 52  GER},.    {"CHAR
96e0: 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46  ", 4, SQLITE_AFF
96f0: 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22 43 4c  _TEXT},.    {"CL
9700: 4f 42 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41  OB", 4, SQLITE_A
9710: 46 46 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22  FF_TEXT},.    {"
9720: 54 45 58 54 22 2c 20 34 2c 20 53 51 4c 49 54 45  TEXT", 4, SQLITE
9730: 5f 41 46 46 5f 54 45 58 54 7d 2c 0a 20 20 20 20  _AFF_TEXT},.    
9740: 7b 22 42 4c 4f 42 22 2c 20 34 2c 20 53 51 4c 49  {"BLOB", 4, SQLI
9750: 54 45 5f 41 46 46 5f 4e 4f 4e 45 7d 2c 0a 20 20  TE_AFF_NONE},.  
9760: 7d 3b 0a 0a 20 20 69 66 28 20 6e 54 79 70 65 3d  };..  if( nType=
9770: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
9780: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
9790: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
97a0: 20 69 3c 73 69 7a 65 6f 66 28 73 75 62 73 74 72   i<sizeof(substr
97b0: 69 6e 67 73 29 2f 73 69 7a 65 6f 66 28 73 75 62  ings)/sizeof(sub
97c0: 73 74 72 69 6e 67 73 5b 30 5d 29 3b 20 69 2b 2b  strings[0]); i++
97d0: 29 7b 0a 20 20 20 20 69 6e 74 20 63 31 20 3d 20  ){.    int c1 = 
97e0: 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 7a 53  substrings[i].zS
97f0: 75 62 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20 63  ub[0];.    int c
9800: 32 20 3d 20 74 6f 6c 6f 77 65 72 28 63 31 29 3b  2 = tolower(c1);
9810: 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d  .    int limit =
9820: 20 6e 54 79 70 65 20 2d 20 73 75 62 73 74 72 69   nType - substri
9830: 6e 67 73 5b 69 5d 2e 6e 53 75 62 3b 0a 20 20 20  ngs[i].nSub;.   
9840: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
9850: 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 7a   substrings[i].z
9860: 53 75 62 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30  Sub;.    for(n=0
9870: 3b 20 6e 3c 3d 6c 69 6d 69 74 3b 20 6e 2b 2b 29  ; n<=limit; n++)
9880: 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 20 3d 20  {.      int c = 
9890: 7a 54 79 70 65 5b 6e 5d 3b 0a 20 20 20 20 20 20  zType[n];.      
98a0: 69 66 28 20 28 63 3d 3d 63 31 20 7c 7c 20 63 3d  if( (c==c1 || c=
98b0: 3d 63 32 29 0a 20 20 20 20 20 20 20 20 20 20 20  =c2).           
98c0: 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53    && 0==sqlite3S
98d0: 74 72 4e 49 43 6d 70 28 26 7a 54 79 70 65 5b 6e  trNICmp(&zType[n
98e0: 5d 2c 20 7a 2c 20 73 75 62 73 74 72 69 6e 67 73  ], z, substrings
98f0: 5b 69 5d 2e 6e 53 75 62 29 20 29 7b 0a 20 20 20  [i].nSub) ){.   
9900: 20 20 20 20 20 72 65 74 75 72 6e 20 73 75 62 73       return subs
9910: 74 72 69 6e 67 73 5b 69 5d 2e 61 66 66 69 6e 69  trings[i].affini
9920: 74 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ty;.      }.    
9930: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
9940: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
9950: 43 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  C;.}../*.** Gene
9960: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
9970: 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  ill increment th
9980: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
9990: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d  .**.** The schem
99a0: 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64  a cookie is used
99b0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
99c0: 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f  en the schema fo
99d0: 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  r the.** databas
99e0: 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65  e changes.  Afte
99f0: 72 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68  r each schema ch
9a00: 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65  ange, the cookie
9a10: 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65   value.** change
9a20: 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65  s.  When a proce
9a30: 73 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74  ss first reads t
9a40: 68 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63  he schema it rec
9a50: 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b  ords the.** cook
9a60: 69 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c  ie.  Thereafter,
9a70: 20 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65   whenever it goe
9a80: 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  s to access the 
9a90: 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20  database,.** it 
9aa0: 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69  checks the cooki
9ab0: 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
9ac0: 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f  he schema has no
9ad0: 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e  t changed.** sin
9ae0: 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72  ce it was last r
9af0: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ead..**.** This 
9b00: 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70  plan is not comp
9b10: 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72  letely bullet-pr
9b20: 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73  oof.  It is poss
9b30: 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  ible for.** the 
9b40: 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65  schema to change
9b50: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
9b60: 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b  and for the cook
9b70: 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20  ie to be.** set 
9b80: 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61  back to prior va
9b90: 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61  lue.  But schema
9ba0: 20 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66   changes are inf
9bb0: 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74  requent.** and t
9bc0: 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
9bd0: 66 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61  f hitting the sa
9be0: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  me cookie value 
9bf0: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61  is only.** 1 cha
9c00: 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f  nce in 2^32.  So
9c10: 20 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75   we're safe enou
9c20: 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  gh..*/.void sqli
9c30: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
9c40: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62  sqlite3 *db, Vdb
9c50: 65 20 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a  e *v, int iDb){.
9c60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9c70: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
9c80: 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73  , db->aDb[iDb].s
9c90: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20  chema_cookie+1, 
9ca0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
9cb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
9cc0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30 29 3b  Cookie, iDb, 0);
9cd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
9ce0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
9cf0: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
9d00: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
9d10: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
9d20: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
9d30: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
9d40: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
9d50: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
9d60: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
9d70: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
9d80: 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
9d90: 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69  te is conservati
9da0: 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65  ve.  It might be
9db0: 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61   larger that wha
9dc0: 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e  t is.** really n
9dd0: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
9de0: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
9df0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
9e00: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28  .  int n;.  for(
9e10: 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b  n=0; *z; n++, z+
9e20: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
9e30: 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20  '"' ){ n++; }.  
9e40: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32  }.  return n + 2
9e50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
9e60: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f   an identifier o
9e70: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
9e80: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e  he given string.
9e90: 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63    Add.** quote c
9ea0: 68 61 72 61 63 74 65 72 73 20 61 73 20 6e 65 65  haracters as nee
9eb0: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ded..*/.static v
9ec0: 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61  oid identPut(cha
9ed0: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c  r *z, int *pIdx,
9ee0: 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64   char *zSignedId
9ef0: 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ent){.  unsigned
9f00: 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20   char *zIdent = 
9f10: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
9f20: 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20  zSignedIdent;.  
9f30: 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75  int i, j, needQu
9f40: 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78  ote;.  i = *pIdx
9f50: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
9f60: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
9f70: 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a    if( !isalnum(z
9f80: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
9f90: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
9fa0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
9fb0: 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a  uote =  zIdent[j
9fc0: 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28  ]!=0 || isdigit(
9fd0: 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20  zIdent[0]).     
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
9ff0: 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f  sqlite3KeywordCo
a000: 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54  de(zIdent, j)!=T
a010: 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64  K_ID;.  if( need
a020: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
a030: 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b   '"';.  for(j=0;
a040: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
a050: 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a  {.    z[i++] = z
a060: 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66  Ident[j];.    if
a070: 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27  ( zIdent[j]=='"'
a080: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
a090: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51  .  }.  if( needQ
a0a0: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
a0b0: 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b  '"';.  z[i] = 0;
a0c0: 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a  .  *pIdx = i;.}.
a0d0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
a0e0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
a0f0: 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72  tatement appropr
a100: 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76  iate for the giv
a110: 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65  en.** table.  Me
a120: 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  mory to hold the
a130: 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61   text of the sta
a140: 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e  tement is obtain
a150: 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74  ed.** from sqlit
a160: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
a170: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
a180: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
a190: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ion..*/.static c
a1a0: 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65  har *createTable
a1b0: 53 74 6d 74 28 54 61 62 6c 65 20 2a 70 29 7b 0a  Stmt(Table *p){.
a1c0: 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20    int i, k, n;. 
a1d0: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
a1e0: 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65  char *zSep, *zSe
a1f0: 70 32 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20  p2, *zEnd, *z;. 
a200: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
a210: 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   n = 0;.  for(pC
a220: 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d  ol = p->aCol, i=
a230: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
a240: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
a250: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
a260: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pCol->zName);. 
a270: 20 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79     z = pCol->zTy
a280: 70 65 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b  pe;.    if( z ){
a290: 0a 20 20 20 20 20 20 6e 20 2b 3d 20 28 73 74 72  .      n += (str
a2a0: 6c 65 6e 28 7a 29 20 2b 20 31 29 3b 0a 20 20 20  len(z) + 1);.   
a2b0: 20 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64   }.  }.  n += id
a2c0: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61  entLength(p->zNa
a2d0: 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20  me);.  if( n<50 
a2e0: 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22  ){.    zSep = ""
a2f0: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
a300: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29  ";.    zEnd = ")
a310: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
a320: 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20  zSep = "\n  ";. 
a330: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20     zSep2 = ",\n 
a340: 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22   ";.    zEnd = "
a350: 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d  \n)";.  }.  n +=
a360: 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b   35 + 6*p->nCol;
a370: 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  zStmt = sqlit
a380: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b  eMallocRaw( n );
a390: 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20  .  if( zStmt==0 
a3a0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 74  ) return 0;.  st
a3b0: 72 63 70 79 28 7a 53 74 6d 74 2c 20 70 2d 3e 69  rcpy(zStmt, p->i
a3c0: 44 62 3d 3d 31 20 3f 20 22 43 52 45 41 54 45 20  Db==1 ? "CREATE 
a3d0: 54 45 4d 50 20 54 41 42 4c 45 20 22 20 3a 20 22  TEMP TABLE " : "
a3e0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b  CREATE TABLE ");
a3f0: 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53  .  k = strlen(zS
a400: 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74  tmt);.  identPut
a410: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a  (zStmt, &k, p->z
a420: 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b  Name);.  zStmt[k
a430: 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72  ++] = '(';.  for
a440: 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69  (pCol=p->aCol, i
a450: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
a460: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
a470: 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b   strcpy(&zStmt[k
a480: 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20  ], zSep);.    k 
a490: 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74 6d 74  += strlen(&zStmt
a4a0: 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d  [k]);.    zSep =
a4b0: 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e   zSep2;.    iden
a4c0: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
a4d0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
a4e0: 20 20 69 66 28 20 28 7a 20 3d 20 70 43 6f 6c 2d    if( (z = pCol-
a4f0: 3e 7a 54 79 70 65 29 21 3d 30 20 29 7b 0a 20 20  >zType)!=0 ){.  
a500: 20 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d      zStmt[k++] =
a510: 20 27 20 27 3b 0a 20 20 20 20 20 20 73 74 72 63   ' ';.      strc
a520: 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 29  py(&zStmt[k], z)
a530: 3b 0a 20 20 20 20 20 20 6b 20 2b 3d 20 73 74 72  ;.      k += str
a540: 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  len(z);.    }.  
a550: 7d 0a 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d  }.  strcpy(&zStm
a560: 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20 72  t[k], zEnd);.  r
a570: 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a  eturn zStmt;.}..
a580: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
a590: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
a5a0: 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c  report the final
a5b0: 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e   ")" that termin
a5c0: 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45  ates.** a CREATE
a5d0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
a5e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
a5f0: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
a600: 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f   other action ro
a610: 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e  utines have been
a620: 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20   building.** is 
a630: 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74  added to the int
a640: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
a650: 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65  s, assuming no e
a660: 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63  rrors have.** oc
a670: 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  curred..**.** An
a680: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74   entry for the t
a690: 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20  able is made in 
a6a0: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
a6b0: 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73   on disk, unless
a6c0: 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65  .** this is a te
a6d0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
a6e0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
a6f0: 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69  1.  When db->ini
a700: 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20  t.busy==1.** it 
a710: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
a720: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
a730: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
a740: 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20  ause we just.** 
a750: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65  connected to the
a760: 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63   database or bec
a770: 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  ause the sqlite_
a780: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73  master table has
a790: 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61  .** recently cha
a7a0: 6e 67 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74  nges, so the ent
a7b0: 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
a7c0: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
a7d0: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   in.** the sqlit
a7e0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
a7f0: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
a800: 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61  to create it aga
a810: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  in..**.** If the
a820: 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e   pSelect argumen
a830: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  t is not NULL, i
a840: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  t means that thi
a850: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73  s routine.** was
a860: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
a870: 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61  e a table genera
a880: 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22  ted from a .** "
a890: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e  CREATE TABLE ...
a8a0: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20   AS SELECT ..." 
a8b0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
a8c0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a  column names of.
a8d0: 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
a8e0: 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20   will match the 
a8f0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
a900: 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
a910: 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  d sqlite3EndTabl
a920: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
a930: 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65   Token *pEnd, Se
a940: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
a950: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71    Table *p;.  sq
a960: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
a970: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28  se->db;..  if( (
a980: 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65  pEnd==0 && pSele
a990: 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65  ct==0) || pParse
a9a0: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
a9b0: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
a9c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20  ) return;.  p = 
a9d0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
a9e0: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  e;.  if( p==0 ) 
a9f0: 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
aa00: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
aa10: 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b  y || !pSelect );
aa20: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
aa30: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31  ->init.busy is 1
aa40: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
aa50: 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
aa60: 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
aa70: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72  qlite_master" or
aa80: 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61   "sqlite_temp_ma
aa90: 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74  ster" table on t
aaa0: 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f  he disk..  ** So
aab0: 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f   do not write to
aac0: 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e   the disk again.
aad0: 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f    Extract the ro
aae0: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  ot page number. 
aaf0: 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c   ** for the tabl
ab00: 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69  e from the db->i
ab10: 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c  nit.newTnum fiel
ab20: 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75  d.  (The page nu
ab30: 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  mber.  ** should
ab40: 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74   have been put t
ab50: 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69  here by the sqli
ab60: 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65  teOpenCb routine
ab70: 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  .).  */.  if( db
ab80: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
ab90: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d     p->tnum = db-
aba0: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
abb0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20   }..  /* If not 
abc0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68  initializing, th
abd0: 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f  en create a reco
abe0: 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  rd for the new t
abf0: 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  able.  ** in the
ac00: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
ac10: 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61  able of the data
ac20: 62 61 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72  base.  The recor
ac30: 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f  d number.  ** fo
ac40: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  r the new table 
ac50: 65 6e 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72  entry should alr
ac60: 65 61 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73  eady be on the s
ac70: 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tack..  **.  ** 
ac80: 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  If this is a TEM
ac90: 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72  PORARY table, wr
aca0: 69 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e  ite the entry in
acb0: 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  to the auxiliary
acc0: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65  .  ** file inste
acd0: 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d  ad of into the m
ace0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
acf0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  e..  */.  if( !d
ad00: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
ad10: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56      int n;.    V
ad20: 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
ad30: 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22   *zType;    /* "
ad40: 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22  view" or "table"
ad50: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54   */.    char *zT
ad60: 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57  ype2;   /* "VIEW
ad70: 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a  " or "TABLE" */.
ad80: 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b      char *zStmt;
ad90: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74      /* Text of t
ada0: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
adb0: 6f 72 20 43 52 45 41 54 45 20 56 49 45 57 20 73  or CREATE VIEW s
adc0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20  tatement */..   
add0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
ade0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
adf0: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
ae00: 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  rn;..    sqlite3
ae10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ae20: 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 0a 20  Close, 0, 0);.. 
ae30: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
ae40: 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68   rootpage for th
ae50: 65 20 6e 65 77 20 74 61 62 6c 65 20 61 6e 64 20  e new table and 
ae60: 70 75 73 68 20 69 74 20 6f 6e 74 6f 20 74 68 65  push it onto the
ae70: 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 41   stack..    ** A
ae80: 20 76 69 65 77 20 68 61 73 20 6e 6f 20 72 6f 6f   view has no roo
ae90: 74 70 61 67 65 2c 20 73 6f 20 6a 75 73 74 20 70  tpage, so just p
aea0: 75 73 68 20 61 20 7a 65 72 6f 20 6f 6e 74 6f 20  ush a zero onto 
aeb0: 74 68 65 20 73 74 61 63 6b 20 66 6f 72 0a 20 20  the stack for.  
aec0: 20 20 2a 2a 20 76 69 65 77 73 2e 20 20 49 6e 69    ** views.  Ini
aed0: 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 61 74  tialize zType at
aee0: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
aef0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
af00: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
af10: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c        /* A regul
af20: 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ar table */.    
af30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
af40: 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54  Op(v, OP_CreateT
af50: 61 62 6c 65 2c 20 70 2d 3e 69 44 62 2c 20 30 29  able, p->iDb, 0)
af60: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  ;.      zType = 
af70: 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a  "table";.      z
af80: 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b  Type2 = "TABLE";
af90: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
afa0: 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20    /* A view */. 
afb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
afc0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
afd0: 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
afe0: 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22    zType = "view"
aff0: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d  ;.      zType2 =
b000: 20 22 56 49 45 57 22 3b 0a 20 20 20 20 7d 0a 0a   "VIEW";.    }..
b010: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
b020: 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  s a CREATE TABLE
b030: 20 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e   xx AS SELECT ..
b040: 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53  ., execute the S
b050: 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61  ELECT.    ** sta
b060: 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61  tement to popula
b070: 74 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  te the new table
b080: 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  . The root-page 
b090: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20  number for the. 
b0a0: 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20     ** new table 
b0b0: 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  is on the top of
b0c0: 20 74 68 65 20 76 64 62 65 20 73 74 61 63 6b 2e   the vdbe stack.
b0d0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
b0e0: 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68  nce the SELECT h
b0f0: 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79  as been coded by
b100: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
b110: 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20  , it is in a.   
b120: 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61   ** suitable sta
b130: 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20  te to query for 
b140: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
b150: 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65   and types to be
b160: 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20   used.    ** by 
b170: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20  the new table.. 
b180: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
b190: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 54  elect ){.      T
b1a0: 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20  able *pSelTab;. 
b1b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b1c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
b1d0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
b1e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b1f0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 2d  , OP_Integer, p-
b200: 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  >iDb, 0);.      
b210: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b220: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
b230: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  , 1, 0);.      p
b240: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b  Parse->nTab = 2;
b250: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
b260: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
b270: 6c 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c  lect, SRT_Table,
b280: 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b   1, 0, 0, 0, 0);
b290: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b2a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
b2b0: 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ose, 1, 0);.    
b2c0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
b2d0: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rr==0 ){.       
b2e0: 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
b2f0: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
b300: 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ect(pParse, 0, p
b310: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
b320: 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20   if( pSelTab==0 
b330: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
b340: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
b350: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l==0 );.        
b360: 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->nCol = pSelTa
b370: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->nCol;.       
b380: 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54   p->aCol = pSelT
b390: 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->aCol;.      
b3a0: 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
b3b0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65  = 0;.        pSe
b3c0: 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  lTab->aCol = 0;.
b3d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
b3e0: 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53  eleteTable(0, pS
b3f0: 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a  elTab);.      }.
b400: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
b410: 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65  mpute the comple
b420: 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
b430: 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  REATE statement 
b440: 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  */.    if( pSele
b450: 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d  ct ){.      zStm
b460: 74 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53  t = createTableS
b470: 74 6d 74 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73  tmt(p);.    }els
b480: 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 41 64 64  e{.      n = Add
b490: 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64  r(pEnd->z) - Add
b4a0: 72 28 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  r(pParse->sNameT
b4b0: 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20 20  oken.z) + 1;.   
b4c0: 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
b4d0: 65 33 4d 50 72 69 6e 74 66 28 22 43 52 45 41 54  e3MPrintf("CREAT
b4e0: 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70  E %s %.*s", zTyp
b4f0: 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73  e2, n, pParse->s
b500: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20  NameToken.z);.  
b510: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c    }..    /* A sl
b520: 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72  ot for the recor
b530: 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  d has already be
b540: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20  en allocated in 
b550: 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49  the .    ** SQLI
b560: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
b570: 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74    We just need t
b580: 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c  o update that sl
b590: 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20  ot with all.    
b5a0: 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  ** the informati
b5b0: 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74  on we've collect
b5c0: 65 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 66  ed.  The rowid f
b5d0: 6f 72 20 74 68 65 20 70 72 65 61 6c 6c 6f 63 61  or the prealloca
b5e0: 74 65 64 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20  ted.    ** slot 
b5f0: 69 73 20 74 68 65 20 32 6e 64 20 69 74 65 6d 20  is the 2nd item 
b600: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54  on the stack.  T
b610: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
b620: 61 63 6b 20 69 73 20 74 68 65 0a 20 20 20 20 2a  ack is the.    *
b630: 2a 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20  * root page for 
b640: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28 6f  the new table (o
b650: 72 20 61 20 30 20 69 66 20 74 68 69 73 20 69 73  r a 0 if this is
b660: 20 61 20 76 69 65 77 29 2e 0a 20 20 20 20 2a 2f   a view)..    */
b670: 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
b680: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
b690: 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51        "UPDATE %Q
b6a0: 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22  .%s ".         "
b6b0: 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e  SET type='%s', n
b6c0: 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65  ame=%Q, tbl_name
b6d0: 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 30  =%Q, rootpage=#0
b6e0: 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20  , sql=%Q ".     
b6f0: 20 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23    "WHERE rowid=#
b700: 31 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44  1",.      db->aD
b710: 62 5b 70 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 2c  b[p->iDb].zName,
b720: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 2d   SCHEMA_TABLE(p-
b730: 3e 69 44 62 29 2c 0a 20 20 20 20 20 20 7a 54 79  >iDb),.      zTy
b740: 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  pe,.      p->zNa
b750: 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  me,.      p->zNa
b760: 6d 65 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 0a  me,.      zStmt.
b770: 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
b780: 65 46 72 65 65 28 7a 53 74 6d 74 29 3b 0a 20 20  eFree(zStmt);.  
b790: 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
b7a0: 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70 2d 3e  ookie(db, v, p->
b7b0: 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
b7c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
b7d0: 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20  NCREMENT.    /* 
b7e0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
b7f0: 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  we need to creat
b800: 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75  e an sqlite_sequ
b810: 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20  ence table for. 
b820: 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72     ** keeping tr
b830: 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65  ack of autoincre
b840: 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a  ment keys..    *
b850: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 75 74  /.    if( p->aut
b860: 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 44 62  oInc ){.      Db
b870: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
b880: 5b 70 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 20 20  [p->iDb];.      
b890: 69 66 28 20 70 44 62 2d 3e 70 53 65 71 54 61 62  if( pDb->pSeqTab
b8a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
b8b0: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
b8c0: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
b8d0: 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
b8e0: 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75  E %Q.sqlite_sequ
b8f0: 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c  ence(name,seq)",
b900: 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
b910: 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b  zName.        );
b920: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
b930: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65  endif..    /* Re
b940: 70 61 72 73 65 20 65 76 65 72 79 74 68 69 6e 67  parse everything
b950: 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69   to update our i
b960: 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72  nternal data str
b970: 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73  uctures */.    s
b980: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
b990: 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c   OP_ParseSchema,
b9a0: 20 70 2d 3e 69 44 62 2c 20 30 2c 0a 20 20 20 20   p->iDb, 0,.    
b9b0: 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
b9c0: 74 66 28 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71  tf("tbl_name='%q
b9d0: 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33  '",p->zName), P3
b9e0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a  _DYNAMIC);.  }..
b9f0: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61  .  /* Add the ta
ba00: 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65  ble to the in-me
ba10: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
ba20: 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
ba30: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
ba40: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
ba50: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
ba60: 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
ba70: 4f 6c 64 3b 0a 20 20 20 20 46 4b 65 79 20 2a 70  Old;.    FKey *p
ba80: 46 4b 65 79 3b 20 0a 20 20 20 20 44 62 20 2a 70  FKey; .    Db *p
ba90: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70 2d  Db = &db->aDb[p-
baa0: 3e 69 44 62 5d 3b 0a 20 20 20 20 70 4f 6c 64 20  >iDb];.    pOld 
bab0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
bac0: 65 72 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73  ert(&pDb->tblHas
bad0: 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72  h, p->zName, str
bae0: 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c  len(p->zName)+1,
baf0: 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c   p);.    if( pOl
bb00: 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  d ){.      asser
bb10: 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f  t( p==pOld );  /
bb20: 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
bb30: 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65  ve failed inside
bb40: 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f   HashInsert() */
bb50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
bb60: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 46 4b     }.    for(pFK
bb70: 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b  ey=p->pFKey; pFK
bb80: 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d  ey; pFKey=pFKey-
bb90: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
bba0: 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72     int nTo = str
bbb0: 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20  len(pFKey->zTo) 
bbc0: 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 4b 65 79  + 1;.      pFKey
bbd0: 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69  ->pNextTo = sqli
bbe0: 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 44 62  te3HashFind(&pDb
bbf0: 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e  ->aFKey, pFKey->
bc00: 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20  zTo, nTo);.     
bc10: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
bc20: 72 74 28 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20  rt(&pDb->aFKey, 
bc30: 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c  pFKey->zTo, nTo,
bc40: 20 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20   pFKey);.    }. 
bc50: 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
bc60: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
bc70: 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20  ->nTable++;.    
bc80: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
bc90: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
bca0: 73 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  s;.  }.}..#ifnde
bcb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
bcc0: 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72  EW./*.** The par
bcd0: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
bce0: 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20  outine in order 
bcf0: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
bd00: 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  VIEW.*/.void sql
bd10: 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a  ite3CreateView(.
bd20: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
bd30: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
bd40: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
bd50: 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20   Token *pBegin, 
bd60: 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
bd70: 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
bd80: 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ins the statemen
bd90: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
bda0: 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame1,     /* The
bdb0: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
bdc0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
bdd0: 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  e view */.  Toke
bde0: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
bdf0: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
be00: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
be10: 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
be20: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
be30: 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20  ,   /* A SELECT 
be40: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77  statement that w
be50: 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
be60: 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  ew view */.  int
be70: 20 69 73 54 65 6d 70 20 20 20 20 20 20 20 20 20   isTemp         
be80: 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45  /* TRUE for a TE
be90: 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a  MPORARY view */.
bea0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
beb0: 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20   int n;.  const 
bec0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
bed0: 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  ;.  Token sEnd;.
bee0: 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a    DbFixer sFix;.
bef0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a    Token *pName;.
bf00: 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  .  sqlite3StartT
bf10: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 42 65  able(pParse, pBe
bf20: 67 69 6e 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  gin, pName1, pNa
bf30: 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 29 3b  me2, isTemp, 1);
bf40: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
bf50: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
bf60: 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
bf70: 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  nErr ){.    sqli
bf80: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
bf90: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
bfa0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
bfb0: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
bfc0: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
bfd0: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
bfe0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78    if( sqlite3Fix
bff0: 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72  Init(&sFix, pPar
c000: 73 65 2c 20 70 2d 3e 69 44 62 2c 20 22 76 69 65  se, p->iDb, "vie
c010: 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20 26  w", pName).    &
c020: 26 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65  & sqlite3FixSele
c030: 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63  ct(&sFix, pSelec
c040: 74 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  t).  ){.    sqli
c050: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
c060: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
c070: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
c080: 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  Make a copy of t
c090: 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54  he entire SELECT
c0a0: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
c0b0: 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
c0c0: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c  ..  ** This will
c0d0: 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45   force all the E
c0e0: 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75  xpr.token.z valu
c0f0: 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  es to be dynamic
c100: 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  ally.  ** alloca
c110: 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e 20  ted rather than 
c120: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70  point to the inp
c130: 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63  ut string - whic
c140: 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a  h means that.  *
c150: 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73  * they will pers
c160: 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63 75  ist after the cu
c170: 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78  rrent sqlite3_ex
c180: 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  ec() call return
c190: 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65  s..  */.  p->pSe
c1a0: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
c1b0: 6c 65 63 74 44 75 70 28 70 53 65 6c 65 63 74 29  lectDup(pSelect)
c1c0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
c1d0: 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29  tDelete(pSelect)
c1e0: 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  ;.  if( !pParse-
c1f0: 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  >db->init.busy )
c200: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 69 65  {.    sqlite3Vie
c210: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
c220: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a  pParse, p);.  }.
c230: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
c240: 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41   end of the CREA
c250: 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e  TE VIEW statemen
c260: 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f  t.  Make sEnd po
c270: 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  int to.  ** the 
c280: 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64  end..  */.  sEnd
c290: 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74   = pParse->sLast
c2a0: 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e  Token;.  if( sEn
c2b0: 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e  d.z[0]!=0 && sEn
c2c0: 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20  d.z[0]!=';' ){. 
c2d0: 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e     sEnd.z += sEn
c2e0: 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e  d.n;.  }.  sEnd.
c2f0: 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 73 45 6e  n = 0;.  n = sEn
c300: 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 3b  d.z - pBegin->z;
c310: 0a 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e  .  z = (const un
c320: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 65  signed char*)pBe
c330: 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28  gin->z;.  while(
c340: 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d   n>0 && (z[n-1]=
c350: 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28  =';' || isspace(
c360: 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b  z[n-1])) ){ n--;
c370: 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a   }.  sEnd.z = &z
c380: 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20  [n-1];.  sEnd.n 
c390: 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73  = 1;..  /* Use s
c3a0: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
c3b0: 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77   to add the view
c3c0: 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   to the SQLITE_M
c3d0: 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20  ASTER table */. 
c3e0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
c3f0: 28 70 50 61 72 73 65 2c 20 26 73 45 6e 64 2c 20  (pParse, &sEnd, 
c400: 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  0);.  return;.}.
c410: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
c420: 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23  _OMIT_VIEW */..#
c430: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c440: 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68  IT_VIEW./*.** Th
c450: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
c460: 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c  e pTable is real
c470: 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c  ly a VIEW.  Fill
c480: 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66   in the names of
c490: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  .** the columns 
c4a0: 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74  of the view in t
c4b0: 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74  he pTable struct
c4c0: 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ure.  Return the
c4d0: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
c4e0: 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72  rors.  If an err
c4f0: 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65  or is seen leave
c500: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
c510: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
c520: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
c530: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
c540: 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50  nNames(Parse *pP
c550: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
c560: 62 6c 65 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  ble){.  ExprList
c570: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 53 65 6c 65   *pEList;.  Sele
c580: 63 74 20 2a 70 53 65 6c 3b 0a 20 20 54 61 62 6c  ct *pSel;.  Tabl
c590: 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20 69 6e  e *pSelTab;.  in
c5a0: 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 61  t nErr = 0;..  a
c5b0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b  ssert( pTable );
c5c0: 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76  ..  /* A positiv
c5d0: 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65  e nCol means the
c5e0: 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66   columns names f
c5f0: 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65  or this view are
c600: 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e  .  ** already kn
c610: 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  own..  */.  if( 
c620: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29  pTable->nCol>0 )
c630: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
c640: 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   A negative nCol
c650: 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61   is a special ma
c660: 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61  rker meaning tha
c670: 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74  t we are current
c680: 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  ly.  ** trying t
c690: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  o compute the co
c6a0: 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20  lumn names.  If 
c6b0: 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f  we enter this ro
c6c0: 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20  utine with.  ** 
c6d0: 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c  a negative nCol,
c6e0: 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72   it means two or
c6f0: 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d   more views form
c700: 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68   a loop, like th
c710: 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
c720: 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e    CREATE VIEW on
c730: 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  e AS SELECT * FR
c740: 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20  OM two;.  **    
c750: 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f   CREATE VIEW two
c760: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
c770: 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  M one;.  **.  **
c780: 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20   Actually, this 
c790: 65 72 72 6f 72 20 69 73 20 63 61 75 67 68 74 20  error is caught 
c7a0: 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64 20 73  previously and s
c7b0: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
c7c0: 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  test.  ** should
c7d0: 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 42   always fail.  B
c7e0: 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65  ut we will leave
c7f0: 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a 75 73   it in place jus
c800: 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a 20 20  t to be safe..  
c810: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
c820: 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73  >nCol<0 ){.    s
c830: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
c840: 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20  Parse, "view %s 
c850: 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65  is circularly de
c860: 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e  fined", pTable->
c870: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
c880: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
c890: 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
c8a0: 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20  ar, it means we 
c8b0: 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
c8c0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e  the table names.
c8d0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
c8e0: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20  pTable->pSelect 
c8f0: 29 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30  ); /* If nCol==0
c900: 2c 20 74 68 65 6e 20 70 54 61 62 6c 65 20 6d 75  , then pTable mu
c910: 73 74 20 62 65 20 61 20 56 49 45 57 20 2a 2f 0a  st be a VIEW */.
c920: 20 20 70 53 65 6c 20 3d 20 70 54 61 62 6c 65 2d    pSel = pTable-
c930: 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20  >pSelect;..  /* 
c940: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61  Note that the ca
c950: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73  ll to sqlite3Res
c960: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
c970: 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79   will expand any
c980: 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e  .  ** "*" elemen
c990: 74 73 20 69 6e 20 74 68 69 73 20 6c 69 73 74 2e  ts in this list.
c9a0: 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6e 65    But we will ne
c9b0: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
c9c0: 65 20 6c 69 73 74 0a 20 20 2a 2a 20 62 61 63 6b  e list.  ** back
c9d0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
c9e0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61   configuration a
c9f0: 66 74 65 72 77 61 72 64 73 2c 20 73 6f 20 77 65  fterwards, so we
ca00: 20 73 61 76 65 20 61 20 63 6f 70 79 20 6f 66 0a   save a copy of.
ca10: 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61    ** the origina
ca20: 6c 20 69 6e 20 70 45 4c 69 73 74 2e 0a 20 20 2a  l in pEList..  *
ca30: 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  /.  pEList = pSe
ca40: 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 53 65  l->pEList;.  pSe
ca50: 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  l->pEList = sqli
ca60: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
ca70: 45 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 70 53  EList);.  if( pS
ca80: 65 6c 2d 3e 70 45 4c 69 73 74 3d 3d 30 20 29 7b  el->pEList==0 ){
ca90: 0a 20 20 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73  .    pSel->pELis
caa0: 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20  t = pEList;.    
cab0: 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4d 61  return 1;  /* Ma
cac0: 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20  lloc failed */. 
cad0: 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   }.  pTable->nCo
cae0: 6c 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61  l = -1;.  pSelTa
caf0: 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
cb00: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
cb10: 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20  rse, 0, pSel);. 
cb20: 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a   if( pSelTab ){.
cb30: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
cb40: 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20  le->aCol==0 );. 
cb50: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
cb60: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
cb70: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f  .    pTable->aCo
cb80: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
cb90: 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  l;.    pSelTab->
cba0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53  nCol = 0;.    pS
cbb0: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
cbc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
cbd0: 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54  teTable(0, pSelT
cbe0: 61 62 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72  ab);.    DbSetPr
cbf0: 6f 70 65 72 74 79 28 70 50 61 72 73 65 2d 3e 64  operty(pParse->d
cc00: 62 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62 2c 20  b, pTable->iDb, 
cc10: 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
cc20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
cc30: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
cc40: 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d  .    nErr++;.  }
cc50: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
cc60: 55 6e 62 69 6e 64 28 70 53 65 6c 29 3b 0a 20 20  Unbind(pSel);.  
cc70: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
cc80: 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70 45 4c 69  elete(pSel->pELi
cc90: 73 74 29 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c  st);.  pSel->pEL
cca0: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
ccb0: 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
ccc0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ccd0: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
cce0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ccf0: 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43  MIT_VIEW./*.** C
cd00: 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
cd10: 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79  names from every
cd20: 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73   VIEW in databas
cd30: 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  e idx..*/.static
cd40: 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77   void sqliteView
cd50: 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33  ResetAll(sqlite3
cd60: 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a   *db, int idx){.
cd70: 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
cd80: 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65   if( !DbHasPrope
cd90: 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
cda0: 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20  UnresetViews) ) 
cdb0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
cdc0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
cdd0: 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 74 62  &db->aDb[idx].tb
cde0: 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c  lHash); i; i=sql
cdf0: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
ce00: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
ce10: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
ce20: 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54  a(i);.    if( pT
ce30: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
ce40: 20 20 20 20 20 73 71 6c 69 74 65 52 65 73 65 74       sqliteReset
ce50: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62  ColumnNames(pTab
ce60: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44  );.    }.  }.  D
ce70: 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64  bClearProperty(d
ce80: 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73  b, idx, DB_Unres
ce90: 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73  etViews);.}.#els
cea0: 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74  e.# define sqlit
ceb0: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c  eViewResetAll(A,
cec0: 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  B).#endif /* SQL
ced0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
cee0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
cef0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
cf00: 62 79 20 74 68 65 20 56 44 42 45 20 74 6f 20 61  by the VDBE to a
cf10: 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e  djust the intern
cf20: 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65  al schema.** use
cf30: 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e  d by SQLite when
cf40: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
cf50: 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72   moves a table r
cf60: 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a  oot page. The.**
cf70: 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20   root-page of a 
cf80: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69  table or index i
cf90: 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20 68  n database iDb h
cfa0: 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  as changed from 
cfb0: 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e  iFrom.** to iTo.
cfc0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
cfd0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
cfe0: 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  UM.void sqlite3R
cff0: 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 44 62 20  ootPageMoved(Db 
d000: 2a 70 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  *pDb, int iFrom,
d010: 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73   int iTo){.  Has
d020: 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20  hElem *pElem;.  
d030: 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
d040: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44  iteHashFirst(&pD
d050: 62 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70 45 6c  b->tblHash); pEl
d060: 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
d070: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
d080: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
d090: 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
d0a0: 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69  ta(pElem);.    i
d0b0: 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69  f( pTab->tnum==i
d0c0: 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54  From ){.      pT
d0d0: 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a  ab->tnum = iTo;.
d0e0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
d0f0: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 45    }.  }.  for(pE
d100: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
d110: 72 73 74 28 26 70 44 62 2d 3e 69 64 78 48 61 73  rst(&pDb->idxHas
d120: 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
d130: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
d140: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64  pElem)){.    Ind
d150: 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74  ex *pIdx = sqlit
d160: 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
d170: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  ;.    if( pIdx->
d180: 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  tnum==iFrom ){. 
d190: 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20       pIdx->tnum 
d1a0: 3d 20 69 54 6f 3b 0a 20 20 20 20 20 20 72 65 74  = iTo;.      ret
d1b0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  urn;.    }.  }. 
d1c0: 20 61 73 73 65 72 74 28 30 29 3b 0a 7d 0a 23 65   assert(0);.}.#e
d1d0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
d1e0: 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  e code to erase 
d1f0: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
d200: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
d210: 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44  from database iD
d220: 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65  b..** Also write
d230: 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20   code to modify 
d240: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
d250: 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65  r table and inte
d260: 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69  rnal schema.** i
d270: 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  f a root-page of
d280: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
d290: 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
d2a0: 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73  tree-layer whils
d2b0: 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61  t.** erasing iTa
d2c0: 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61  ble (this can ha
d2d0: 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74  ppen with an aut
d2e0: 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
d2f0: 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  e)..*/ .static v
d300: 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50  oid destroyRootP
d310: 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  age(Parse *pPars
d320: 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  e, int iTable, i
d330: 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
d340: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
d350: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 73  dbe(pParse);.  s
d360: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d370: 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69  v, OP_Destroy, i
d380: 54 61 62 6c 65 2c 20 69 44 62 29 3b 0a 23 69 66  Table, iDb);.#if
d390: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d3a0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
d3b0: 20 4f 50 5f 44 65 73 74 72 6f 79 20 70 75 73 68   OP_Destroy push
d3c0: 65 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 6e  es an integer on
d3d0: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66  to the stack. If
d3e0: 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20   this integer.  
d3f0: 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ** is non-zero, 
d400: 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
d410: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
d420: 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64  of a table moved
d430: 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f   to.  ** locatio
d440: 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f  n iTable. The fo
d450: 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64  llowing code mod
d460: 69 66 69 73 20 74 68 65 20 73 71 6c 69 74 65 5f  ifis the sqlite_
d470: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a  master table to.
d480: 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69    ** reflect thi
d490: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
d4a0: 20 22 23 30 22 20 69 6e 20 74 68 65 20 53 51 4c   "#0" in the SQL
d4b0: 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f   is a special co
d4c0: 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e  nstant that mean
d4d0: 73 20 77 68 61 74 65 76 65 72 20 76 61 6c 75 65  s whatever value
d4e0: 0a 20 20 2a 2a 20 69 73 20 6f 6e 20 74 68 65 20  .  ** is on the 
d4f0: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
d500: 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 52 65  .  See sqlite3Re
d510: 67 69 73 74 65 72 45 78 70 72 28 29 2e 0a 20 20  gisterExpr()..  
d520: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74  */.  sqlite3Nest
d530: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
d540: 0a 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51  .     "UPDATE %Q
d550: 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65  .%s SET rootpage
d560: 3d 25 64 20 57 48 45 52 45 20 23 30 20 41 4e 44  =%d WHERE #0 AND
d570: 20 72 6f 6f 74 70 61 67 65 3d 23 30 22 2c 0a 20   rootpage=#0",. 
d580: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
d590: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
d5a0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
d5b0: 29 2c 20 69 54 61 62 6c 65 29 3b 0a 23 65 6e 64  ), iTable);.#end
d5c0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  if.}../*.** Writ
d5d0: 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65  e VDBE code to e
d5e0: 72 61 73 65 20 74 61 62 6c 65 20 70 54 61 62 20  rase table pTab 
d5f0: 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74  and all associat
d600: 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69  ed indices on di
d610: 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75  sk..** Code to u
d620: 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  pdate the sqlite
d630: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 61  _master tables a
d640: 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
d650: 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a  ma definitions.*
d660: 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74  * in case a root
d670: 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20  -page belonging 
d680: 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  to another table
d690: 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65   is moved by the
d6a0: 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20   btree layer.** 
d6b0: 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74  is also added (t
d6c0: 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
d6d0: 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ith an auto-vacu
d6e0: 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  um database)..*/
d6f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73  .static void des
d700: 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20  troyTable(Parse 
d710: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
d720: 70 54 61 62 29 7b 0a 23 69 66 64 65 66 20 53 51  pTab){.#ifdef SQ
d730: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
d740: 43 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49  CUUM.  Index *pI
d750: 64 78 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f  dx;.  destroyRoo
d760: 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 54  tPage(pParse, pT
d770: 61 62 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e  ab->tnum, pTab->
d780: 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78  iDb);.  for(pIdx
d790: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
d7a0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
d7b0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74  pNext){.    dest
d7c0: 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
d7d0: 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  se, pIdx->tnum, 
d7e0: 70 49 64 78 2d 3e 69 44 62 29 3b 0a 20 20 7d 0a  pIdx->iDb);.  }.
d7f0: 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68  #else.  /* If th
d800: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62  e database may b
d810: 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61  e auto-vacuum ca
d820: 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45  pable (if SQLITE
d830: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
d840: 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66  .  ** is not def
d850: 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69  ined), then it i
d860: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63  s important to c
d870: 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f  all OP_Destroy o
d880: 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65  n the.  ** table
d890: 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d   and index root-
d8a0: 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20  pages in order, 
d8b0: 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68  starting with th
d8c0: 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20  e numerically . 
d8d0: 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74   ** largest root
d8e0: 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68  -page number. Th
d8f0: 69 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  is guarantees th
d900: 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72  at none of the r
d910: 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74  oot-pages.  ** t
d920: 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 69  o be destroyed i
d930: 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61  s relocated by a
d940: 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73  n earlier OP_Des
d950: 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68  troy. i.e. if th
d960: 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  e.  ** following
d970: 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a   were coded:.  *
d980: 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f  *.  ** OP_Destro
d990: 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20  y 4 0.  ** .... 
d9a0: 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35   ** OP_Destroy 5
d9b0: 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64   0.  **.  ** and
d9c0: 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70   root page 5 hap
d9d0: 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20  pened to be the 
d9e0: 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
d9f0: 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a  e number in the.
da00: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74    ** database, t
da10: 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20  hen root page 5 
da20: 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74  would be moved t
da30: 6f 20 70 61 67 65 20 34 20 62 79 20 74 68 65 20  o page 4 by the 
da40: 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f  .  ** "OP_Destro
da50: 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54  y 4 0" opcode. T
da60: 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f  he subsequent "O
da70: 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20 77  P_Destroy 5 0" w
da80: 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20  ould hit.  ** a 
da90: 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a  free-list page..
daa0: 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20    */.  int iTab 
dab0: 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20  = pTab->tnum;.  
dac0: 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d  int iDestroyed =
dad0: 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20   0;..  while( 1 
dae0: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
daf0: 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72  dx;.    int iLar
db00: 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69  gest = 0;..    i
db10: 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30  f( iDestroyed==0
db20: 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f   || iTab<iDestro
db30: 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61  yed ){.      iLa
db40: 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20  rgest = iTab;.  
db50: 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78    }.    for(pIdx
db60: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
db70: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
db80: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
db90: 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74  t iIdx = pIdx->t
dba0: 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  num;.      asser
dbb0: 74 28 20 70 49 64 78 2d 3e 69 44 62 3d 3d 70 54  t( pIdx->iDb==pT
dbc0: 61 62 2d 3e 69 44 62 20 29 3b 0a 20 20 20 20 20  ab->iDb );.     
dbd0: 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65 64   if( (iDestroyed
dbe0: 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65  ==0 || (iIdx<iDe
dbf0: 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49 64  stroyed)) && iId
dc00: 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20  x>iLargest ){.  
dc10: 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d        iLargest =
dc20: 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20   iIdx;.      }. 
dc30: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61     }.    if( iLa
dc40: 72 67 65 73 74 3d 3d 30 20 29 20 72 65 74 75 72  rgest==0 ) retur
dc50: 6e 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f  n;.    destroyRo
dc60: 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 69  otPage(pParse, i
dc70: 4c 61 72 67 65 73 74 2c 20 70 54 61 62 2d 3e 69  Largest, pTab->i
dc80: 44 62 29 3b 0a 20 20 20 20 69 44 65 73 74 72 6f  Db);.    iDestro
dc90: 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a  yed = iLargest;.
dca0: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
dcb0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
dcc0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f   is called to do
dcd0: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44   the work of a D
dce0: 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ROP TABLE statem
dcf0: 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73  ent..** pName is
dd00: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
dd10: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f   table to be dro
dd20: 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  pped..*/.void sq
dd30: 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50  lite3DropTable(P
dd40: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
dd50: 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
dd60: 74 20 69 73 56 69 65 77 29 7b 0a 20 20 54 61 62  t isView){.  Tab
dd70: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65  le *pTab;.  Vdbe
dd80: 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
dd90: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
dda0: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69  .  int iDb;..  i
ddb0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
ddc0: 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
ddd0: 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  c_failed ) goto 
dde0: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
ddf0: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
de00: 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70  ->nSrc==1 );.  p
de10: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
de20: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
de30: 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61   pName->a[0].zNa
de40: 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  me, pName->a[0].
de50: 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a 20 20 69  zDatabase);..  i
de60: 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74  f( pTab==0 ) got
de70: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
de80: 65 3b 0a 20 20 69 44 62 20 3d 20 70 54 61 62 2d  e;.  iDb = pTab-
de90: 3e 69 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20  >iDb;.  assert( 
dea0: 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
deb0: 2d 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65 66  ->nDb );.#ifndef
dec0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ded0: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
dee0: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
def0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
df00: 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
df10: 28 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20  (pTab->iDb);.   
df20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
df30: 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d   = db->aDb[pTab-
df40: 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >iDb].zName;.   
df50: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
df60: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
df70: 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
df80: 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20  b, 0, zDb)){.   
df90: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
dfa0: 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
dfb0: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
dfc0: 0a 20 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d  .      if( iDb==
dfd0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
dfe0: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
dff0: 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  TEMP_VIEW;.     
e000: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e010: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
e020: 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  OP_VIEW;.      }
e030: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e040: 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a    if( iDb==1 ){.
e050: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
e060: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
e070: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  TABLE;.      }el
e080: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
e090: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
e0a0: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
e0b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
e0c0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
e0d0: 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d  rse, code, pTab-
e0e0: 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20  >zName, 0, zDb) 
e0f0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
e100: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
e110: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
e120: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
e130: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
e140: 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ETE, pTab->zName
e150: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
e160: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
e170: 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
e180: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
e190: 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c  pTab->readOnly |
e1a0: 7c 20 70 54 61 62 3d 3d 64 62 2d 3e 61 44 62 5b  | pTab==db->aDb[
e1b0: 69 44 62 5d 2e 70 53 65 71 54 61 62 20 29 7b 0a  iDb].pSeqTab ){.
e1c0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
e1d0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
e1e0: 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65  le %s may not be
e1f0: 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d   dropped", pTab-
e200: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
e210: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
e220: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 56  e;.  }.  if( isV
e230: 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
e240: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  lect==0 ){.    s
e250: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
e260: 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
e270: 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65   TABLE to delete
e280: 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62   table %s", pTab
e290: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
e2a0: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
e2b0: 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69  le;.  }.  if( !i
e2c0: 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
e2d0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
e2e0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
e2f0: 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
e300: 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76  VIEW to delete v
e310: 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  iew %s", pTab->z
e320: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
e330: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
e340: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
e350: 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
e360: 76 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  ve the table fro
e370: 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
e380: 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e  le.  ** on disk.
e390: 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
e3a0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
e3b0: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
e3c0: 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69     Trigger *pTri
e3d0: 67 67 65 72 3b 0a 20 20 20 20 69 6e 74 20 69 44  gger;.    int iD
e3e0: 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20  b = pTab->iDb;. 
e3f0: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
e400: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20  ->aDb[iDb];.    
e410: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
e420: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
e430: 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 20 20 20  e, 0, iDb);..   
e440: 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69   /* Drop all tri
e450: 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64  ggers associated
e460: 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
e470: 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43  being dropped. C
e480: 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73 20 67 65  ode.    ** is ge
e490: 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76  nerated to remov
e4a0: 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73  e entries from s
e4b0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64  qlite_master and
e4c0: 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  /or.    ** sqlit
e4d0: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66  e_temp_master if
e4e0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
e4f0: 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d  /.    pTrigger =
e500: 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b   pTab->pTrigger;
e510: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54 72 69  .    while( pTri
e520: 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73  gger ){.      as
e530: 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e  sert( pTrigger->
e540: 69 44 62 3d 3d 69 44 62 20 7c 7c 20 70 54 72 69  iDb==iDb || pTri
e550: 67 67 65 72 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a  gger->iDb==1 );.
e560: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f        sqlite3Dro
e570: 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61 72  pTriggerPtr(pPar
e580: 73 65 2c 20 70 54 72 69 67 67 65 72 2c 20 31 29  se, pTrigger, 1)
e590: 3b 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72  ;.      pTrigger
e5a0: 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65   = pTrigger->pNe
e5b0: 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  xt;.    }..    /
e5c0: 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54  * Drop all SQLIT
e5d0: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61  E_MASTER table a
e5e0: 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  nd index entries
e5f0: 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
e600: 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e  he.    ** table.
e610: 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d   The program nam
e620: 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  e loops through 
e630: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
e640: 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 20   and deletes.   
e650: 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68   ** every row th
e660: 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  at refers to a t
e670: 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65  able of the same
e680: 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65   name as the one
e690: 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64 72   being.    ** dr
e6a0: 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73 20  opped. Triggers 
e6b0: 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 65  are handled sepe
e6c0: 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20 61  rately because a
e6d0: 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a   trigger can be.
e6e0: 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69      ** created i
e6f0: 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  n the temp datab
e700: 61 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20  ase that refers 
e710: 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e  to a table in an
e720: 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 61 74  other.    ** dat
e730: 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  abase..    */.  
e740: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
e750: 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
e760: 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
e770: 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 74  OM %Q.%s WHERE t
e780: 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74  bl_name=%Q and t
e790: 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c  ype!='trigger'",
e7a0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  .        pDb->zN
e7b0: 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
e7c0: 45 28 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e  E(iDb), pTab->zN
e7d0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21 69  ame);.    if( !i
e7e0: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 64  sView ){.      d
e7f0: 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72  estroyTable(pPar
e800: 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d  se, pTab);.    }
e810: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e820: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
e830: 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  ENT.    /* Remov
e840: 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66  e any entries of
e850: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75   the sqlite_sequ
e860: 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63  ence table assoc
e870: 69 61 74 65 64 20 77 69 74 68 0a 20 20 20 20 2a  iated with.    *
e880: 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * the table bein
e890: 67 20 64 72 6f 70 70 65 64 20 2a 2f 0a 20 20 20  g dropped */.   
e8a0: 20 69 66 28 20 70 54 61 62 2d 3e 61 75 74 6f 49   if( pTab->autoI
e8b0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nc ){.      sqli
e8c0: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
e8d0: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
e8e0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e 73  DELETE FROM %s.s
e8f0: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57  qlite_sequence W
e900: 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20  HERE name=%Q",. 
e910: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d         pDb->zNam
e920: 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20  e, pTab->zName. 
e930: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65       );.    }.#e
e940: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  ndif..    /* Rem
e950: 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 65 6e  ove the table en
e960: 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65 27  try from SQLite'
e970: 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  s internal schem
e980: 61 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  a.    */.    sql
e990: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
e9a0: 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62  P_DropTable, iDb
e9b0: 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
e9c0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
e9d0: 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64  teViewResetAll(d
e9e0: 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64  b, iDb);..exit_d
e9f0: 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c  rop_table:.  sql
ea00: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
ea10: 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pName);.}../*.
ea20: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ea30: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  is called to cre
ea40: 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67  ate a new foreig
ea50: 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62  n key on the tab
ea60: 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  le.** currently 
ea70: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
ea80: 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65  on.  pFromCol de
ea90: 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63  termines which c
eaa0: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
eab0: 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70   current table p
eac0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65  oint to the fore
ead0: 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72  ign key.  If pFr
eae0: 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a  omCol==0 then.**
eaf0: 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79   connect the key
eb00: 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   to the last col
eb10: 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70  umn inserted.  p
eb20: 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  To is the name o
eb30: 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72  f.** the table r
eb40: 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f  eferred to.  pTo
eb50: 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66  Col is a list of
eb60: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f   tables in the o
eb70: 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c  ther.** pTo tabl
eb80: 65 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69  e that the forei
eb90: 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f  gn key points to
eba0: 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e  .  flags contain
ebb0: 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  s all.** informa
ebc0: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
ebd0: 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
ebe0: 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70  on algorithms sp
ebf0: 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68  ecified.** in th
ec00: 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20  e ON DELETE, ON 
ec10: 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e  UPDATE and ON IN
ec20: 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SERT clauses..**
ec30: 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75  .** An FKey stru
ec40: 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64  cture is created
ec50: 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
ec60: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
ec70: 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74  y.** under const
ec80: 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ruction in the p
ec90: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
eca0: 20 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77   field.  The new
ecb0: 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20   FKey.** is not 
ecc0: 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e  linked into db->
ecd0: 61 46 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f  aFKey at this po
ece0: 69 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20  int - that does 
ecf0: 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e  not happen.** un
ed00: 74 69 6c 20 73 71 6c 69 74 65 33 45 6e 64 54 61  til sqlite3EndTa
ed10: 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ble()..**.** The
ed20: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
ed30: 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
ed40: 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
ed50: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
ed60: 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
ed70: 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
ed80: 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
ed90: 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
eda0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
edb0: 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
edc0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
edd0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
ede0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
edf0: 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f  xprList *pFromCo
ee00: 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69  l,  /* Columns i
ee10: 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
ee20: 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
ee30: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
ee40: 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
ee50: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
ee60: 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
ee70: 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f   ExprList *pToCo
ee80: 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
ee90: 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
eea0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
eeb0: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
eec0: 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
eed0: 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
eee0: 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
eef0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
ef00: 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70  GN_KEY.  FKey *p
ef10: 46 4b 65 79 20 3d 20 30 3b 0a 20 20 54 61 62 6c  FKey = 0;.  Tabl
ef20: 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *p = pParse->p
ef30: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20  NewTable;.  int 
ef40: 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  nByte;.  int i;.
ef50: 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68    int nCol;.  ch
ef60: 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74  ar *z;..  assert
ef70: 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66  ( pTo!=0 );.  if
ef80: 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  ( p==0 || pParse
ef90: 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 66 6b  ->nErr ) goto fk
efa0: 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f  _end;.  if( pFro
efb0: 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mCol==0 ){.    i
efc0: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f  nt iCol = p->nCo
efd0: 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  l-1;.    if( iCo
efe0: 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  l<0 ) goto fk_en
eff0: 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f  d;.    if( pToCo
f000: 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78  l && pToCol->nEx
f010: 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  pr!=1 ){.      s
f020: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
f030: 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20  Parse, "foreign 
f040: 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20  key on %s".     
f050: 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66      " should ref
f060: 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20  erence only one 
f070: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
f080: 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d  %T",.         p-
f090: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
f0a0: 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67  e, pTo);.      g
f0b0: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
f0c0: 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a  }.    nCol = 1;.
f0d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43    }else if( pToC
f0e0: 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45  ol && pToCol->nE
f0f0: 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  xpr!=pFromCol->n
f100: 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Expr ){.    sqli
f110: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
f120: 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d  se,.        "num
f130: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
f140: 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f  n foreign key do
f150: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
f160: 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20   number of ".   
f170: 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e       "columns in
f180: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
f190: 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74  table");.    got
f1a0: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73  o fk_end;.  }els
f1b0: 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46  e{.    nCol = pF
f1c0: 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20  romCol->nExpr;. 
f1d0: 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a   }.  nByte = siz
f1e0: 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43  eof(*pFKey) + nC
f1f0: 6f 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d  ol*sizeof(pFKey-
f200: 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d  >aCol[0]) + pTo-
f210: 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54  >n + 1;.  if( pT
f220: 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28  oCol ){.    for(
f230: 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e  i=0; i<pToCol->n
f240: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
f250: 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c 65    nByte += strle
f260: 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  n(pToCol->a[i].z
f270: 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d  Name) + 1;.    }
f280: 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73  .  }.  pFKey = s
f290: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79  qliteMalloc( nBy
f2a0: 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65  te );.  if( pFKe
f2b0: 79 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65  y==0 ) goto fk_e
f2c0: 6e 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72  nd;.  pFKey->pFr
f2d0: 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d  om = p;.  pFKey-
f2e0: 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e  >pNextFrom = p->
f2f0: 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68  pFKey;.  z = (ch
f300: 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a 20  ar*)&pFKey[1];. 
f310: 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20 28   pFKey->aCol = (
f320: 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a 29  struct sColMap*)
f330: 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f 66  z;.  z += sizeof
f340: 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 29  (struct sColMap)
f350: 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e  *nCol;.  pFKey->
f360: 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70  zTo = z;.  memcp
f370: 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f  y(z, pTo->z, pTo
f380: 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e  ->n);.  z[pTo->n
f390: 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70 54  ] = 0;.  z += pT
f3a0: 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d  o->n+1;.  pFKey-
f3b0: 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20 20  >pNextTo = 0;.  
f3c0: 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43  pFKey->nCol = nC
f3d0: 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43  ol;.  if( pFromC
f3e0: 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b  ol==0 ){.    pFK
f3f0: 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f  ey->aCol[0].iFro
f400: 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  m = p->nCol-1;. 
f410: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
f420: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
f430: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  ){.      int j;.
f440: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
f450: 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  <p->nCol; j++){.
f460: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
f470: 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43  te3StrICmp(p->aC
f480: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72  ol[j].zName, pFr
f490: 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
f4a0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
f4b0: 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69     pFKey->aCol[i
f4c0: 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20  ].iFrom = j;.   
f4d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
f4e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f4f0: 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e        if( j>=p->
f500: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
f510: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f520: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
f530: 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75     "unknown colu
f540: 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72  mn \"%s\" in for
f550: 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
f560: 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  ion", .         
f570: 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
f580: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
f590: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
f5a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
f5b0: 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
f5c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
f5d0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
f5e0: 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70  int n = strlen(p
f5f0: 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
f600: 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
f610: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
f620: 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  z;.      memcpy(
f630: 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
f640: 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
f650: 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[n] = 0;.     
f660: 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d   z += n+1;.    }
f670: 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73  .  }.  pFKey->is
f680: 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20  Deferred = 0;.  
f690: 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e  pFKey->deleteCon
f6a0: 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66 66  f = flags & 0xff
f6b0: 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61 74  ;.  pFKey->updat
f6c0: 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e  eConf = (flags >
f6d0: 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20 20  > 8 ) & 0xff;.  
f6e0: 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e  pFKey->insertCon
f6f0: 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31 36  f = (flags >> 16
f700: 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a   ) & 0xff;..  /*
f710: 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67   Link the foreig
f720: 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62  n key to the tab
f730: 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73  le as the last s
f740: 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  tep..  */.  p->p
f750: 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20  FKey = pFKey;.  
f760: 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65  pFKey = 0;..fk_e
f770: 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65  nd:.  sqliteFree
f780: 28 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20  (pFKey);.#endif 
f790: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
f7a0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
f7b0: 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  KEY) */.  sqlite
f7c0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
f7d0: 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c  pFromCol);.  sql
f7e0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
f7f0: 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f  te(pToCol);.}../
f800: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f810: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
f820: 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d   an INITIALLY IM
f830: 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49  MEDIATE or INITI
f840: 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a  ALLY DEFERRED.**
f850: 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20   clause is seen 
f860: 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72  as part of a for
f870: 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
f880: 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65  ion.  The isDefe
f890: 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  rred.** paramete
f8a0: 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49  r is 1 for INITI
f8b0: 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e  ALLY DEFERRED an
f8c0: 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  d 0 for INITIALL
f8d0: 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20  Y IMMEDIATE..** 
f8e0: 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  The behavior of 
f8f0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
f900: 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67  y created foreig
f910: 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65  n key is adjuste
f920: 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79  d.** accordingly
f930: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
f940: 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
f950: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
f960: 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b  int isDeferred){
f970: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f980: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
f990: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
f9a0: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20    FKey *pFKey;. 
f9b0: 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61   if( (pTab = pPa
f9c0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
f9d0: 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70  =0 || (pFKey = p
f9e0: 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29  Tab->pFKey)==0 )
f9f0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79   return;.  pFKey
fa00: 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 69  ->isDeferred = i
fa10: 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69  sDeferred;.#endi
fa20: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  f.}../*.** Gener
fa30: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
fa40: 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 66  ll erase and ref
fa50: 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e  ill index *pIdx.
fa60: 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65    This is.** use
fa70: 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
fa80: 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20  a newly created 
fa90: 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f  index or to reco
faa0: 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e  mpute the.** con
fab0: 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  tent of an index
fac0: 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20   in response to 
fad0: 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e  a REINDEX comman
fae0: 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52  d..**.** if memR
faf0: 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  ootPage is not n
fb00: 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e  egative, it mean
fb10: 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78  s that the index
fb20: 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65   is newly.** cre
fb30: 61 74 65 64 2e 20 20 54 68 65 20 6d 65 6d 6f 72  ated.  The memor
fb40: 79 20 63 65 6c 6c 20 73 70 65 63 69 66 69 65 64  y cell specified
fb50: 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   by memRootPage 
fb60: 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20  contains the.** 
fb70: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
fb80: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
fb90: 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69  If memRootPage i
fba0: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
fbb0: 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c  .** the index al
fbc0: 72 65 61 64 79 20 65 78 69 73 74 73 20 61 6e 64  ready exists and
fbd0: 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65 64   must be cleared
fbe0: 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65   before being re
fbf0: 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68  filled and.** th
fc00: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
fc10: 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  er of the index 
fc20: 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49  is taken from pI
fc30: 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73  ndex->tnum..*/.s
fc40: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
fc50: 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61  e3RefillIndex(Pa
fc60: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
fc70: 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20  ex *pIndex, int 
fc80: 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20  memRootPage){.  
fc90: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
fca0: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f  ndex->pTable;  /
fcb0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68 61 74  * The table that
fcc0: 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   is indexed */. 
fcd0: 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
fce0: 73 65 2d 3e 6e 54 61 62 3b 20 20 20 20 20 20 20  se->nTab;       
fcf0: 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20  /* Btree cursor 
fd00: 75 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f  used for pTab */
fd10: 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50  .  int iIdx = pP
fd20: 61 72 73 65 2d 3e 6e 54 61 62 2b 31 3b 20 20 20  arse->nTab+1;   
fd30: 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f    /* Btree curso
fd40: 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65  r used for pInde
fd50: 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31  x */.  int addr1
fd60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fd70: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
fd80: 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20   of top of loop 
fd90: 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20  */.  int tnum;  
fda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdb0: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
fdc0: 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56   of index */.  V
fdd0: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
fde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fdf0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
fe00: 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c  nto this virtual
fe10: 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 69 6e   machine */.  in
fe20: 74 20 69 73 55 6e 69 71 75 65 3b 20 20 20 20 20  t isUnique;     
fe30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fe40: 54 72 75 65 20 66 6f 72 20 61 20 75 6e 69 71 75  True for a uniqu
fe50: 65 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 76 20  e index */..  v 
fe60: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
fe70: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
fe80: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
fe90: 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
fea0: 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
feb0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fec0: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d 52 6f  P_MemLoad, memRo
fed0: 6f 74 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  otPage, 0);.    
fee0: 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tnum = 0;.  }els
fef0: 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49  e{.    tnum = pI
ff00: 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20  ndex->tnum;.    
ff10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ff20: 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e  (v, OP_Clear, tn
ff30: 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29  um, pIndex->iDb)
ff40: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
ff50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
ff60: 6e 74 65 67 65 72 2c 20 70 49 6e 64 65 78 2d 3e  nteger, pIndex->
ff70: 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  iDb, 0);.  sqlit
ff80: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
ff90: 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c  OpenWrite, iIdx,
ffa0: 20 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20   tnum,.         
ffb0: 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
ffc0: 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  *)&pIndex->keyIn
ffd0: 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P3_KEYINFO);
ffe0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
fff0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
10000 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20 30 29  r, pTab->iDb, 0)
10010 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
10020 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  ddOp(v, OP_OpenR
10030 65 61 64 2c 20 69 54 61 62 2c 20 70 54 61 62 2d  ead, iTab, pTab-
10040 3e 74 6e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65  >tnum);.  sqlite
10050 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10060 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
10070 69 54 61 62 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  iTab, pTab->nCol
10080 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  );.  addr1 = sql
10090 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
100a0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
100b0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 47  , 0);.  sqlite3G
100c0 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
100d0 76 2c 20 70 49 6e 64 65 78 2c 20 69 54 61 62 29  v, pIndex, iTab)
100e0 3b 0a 20 20 69 73 55 6e 69 71 75 65 20 3d 20 70  ;.  isUnique = p
100f0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
10100 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 73 71 6c 69 74  OE_None;.  sqlit
10110 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10120 50 5f 49 64 78 50 75 74 2c 20 69 49 64 78 2c 20  P_IdxPut, iIdx, 
10130 69 73 55 6e 69 71 75 65 29 3b 0a 20 20 69 66 28  isUnique);.  if(
10140 20 69 73 55 6e 69 71 75 65 20 29 7b 0a 20 20 20   isUnique ){.   
10150 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
10160 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 69 6e 64  geP3(v, -1, "ind
10170 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65  exed columns are
10180 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33   not unique", P3
10190 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 20 20  _STATIC);.  }.  
101a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
101b0 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61  (v, OP_Next, iTa
101c0 62 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20 20 73  b, addr1+1);.  s
101d0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
101e0 50 32 28 76 2c 20 61 64 64 72 31 2c 20 73 71 6c  P2(v, addr1, sql
101f0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
10200 64 64 72 28 76 29 29 3b 0a 20 20 73 71 6c 69 74  ddr(v));.  sqlit
10210 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10220 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 2c 20 30  P_Close, iTab, 0
10230 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
10240 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
10250 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a 7d 0a 0a  e, iIdx, 0);.}..
10260 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
10270 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20  ew index for an 
10280 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 49 6e 64  SQL table.  pInd
10290 65 78 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  ex is the name o
102a0 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20  f the index .** 
102b0 61 6e 64 20 70 54 61 62 6c 65 20 69 73 20 74 68  and pTable is th
102c0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
102d0 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
102e0 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68  e indexed.  Both
102f0 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c   will .** be NUL
10300 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20  L for a primary 
10310 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20  key or an index 
10320 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20  that is created 
10330 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20  to satisfy a.** 
10340 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
10350 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e  t.  If pTable an
10360 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c  d pIndex are NUL
10370 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70  L, use pParse->p
10380 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74  NewTable.** as t
10390 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
103a0 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d  ndexed.  pParse-
103b0 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20  >pNewTable is a 
103c0 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a  table that is.**
103d0 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
103e0 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
103f0 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
10400 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
10410 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
10420 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
10430 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74   indexed.  pList
10440 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66   will be NULL if
10450 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72   this.** is a pr
10460 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69  imary key or uni
10470 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f  que-constraint o
10480 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
10490 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a  t column added.*
104a0 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  * to the table c
104b0 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
104c0 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a  onstruction.  .*
104d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
104e0 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72  eateIndex(.  Par
104f0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
10500 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   All information
10510 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73   about this pars
10520 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  e */.  Token *pN
10530 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74  ame1,   /* First
10540 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
10550 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
10560 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
10570 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64  me2,   /* Second
10580 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
10590 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
105a0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
105b0 54 62 6c 4e 61 6d 65 2c 20 20 2f 2a 20 54 61 62  TblName,  /* Tab
105c0 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65  le to index. Use
105d0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
105e0 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70  le if 0 */.  Exp
105f0 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
10600 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c  /* A list of col
10610 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
10620 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ed */.  int onEr
10630 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f 45 5f 41  ror,     /* OE_A
10640 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  bort, OE_Ignore,
10650 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20   OE_Replace, or 
10660 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b  OE_None */.  Tok
10670 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a  en *pStart,   /*
10680 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
10690 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 61 20  n that begins a 
106a0 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
106b0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
106c0 6e 20 2a 70 45 6e 64 20 20 20 20 20 20 2f 2a 20  n *pEnd      /* 
106d0 54 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f  The ")" that clo
106e0 73 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49  ses the CREATE I
106f0 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
10700 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
10710 61 62 20 3d 20 30 3b 20 2f 2a 20 54 61 62 6c 65  ab = 0; /* Table
10720 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
10730 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
10740 78 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 69 6e  x = 0; /* The in
10750 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65  dex to be create
10760 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  d */.  char *zNa
10770 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c  me = 0;.  int i,
10780 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c   j;.  Token null
10790 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b 65 20 74  Id;    /* Fake t
107a0 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74  oken for an empt
107b0 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44  y ID list */.  D
107c0 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20  bFixer sFix;    
107d0 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67  /* For assigning
107e0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20   database names 
107f0 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69  to pTable */.  i
10800 6e 74 20 69 73 54 65 6d 70 3b 20 20 20 20 20 20  nt isTemp;      
10810 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 74 65  /* True for a te
10820 6d 70 6f 72 61 72 79 20 69 6e 64 65 78 20 2a 2f  mporary index */
10830 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
10840 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
10850 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
10860 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
10870 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
10880 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
10890 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
108a0 6d 65 20 3d 20 30 3b 20 2f 2a 20 55 6e 71 75 61  me = 0; /* Unqua
108b0 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
108c0 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61  he index to crea
108d0 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61  te */..  if( pPa
108e0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
108f0 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
10900 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  ed ) goto exit_c
10910 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20  reate_index;..  
10920 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
10930 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
10940 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52  o be indexed.  R
10950 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e  eturn early if n
10960 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
10970 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
10980 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20   ){..    /* Use 
10990 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64  the two-part ind
109a0 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  ex name to deter
109b0 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73  mine the databas
109c0 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61  e .    ** to sea
109d0 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c  rch for the tabl
109e0 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62  e. 'Fix' the tab
109f0 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20  le name to this 
10a00 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  db.    ** before
10a10 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20   looking up the 
10a20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
10a30 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
10a40 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20   && pName2 );.  
10a50 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
10a60 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
10a70 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
10a80 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20  2, &pName);.    
10a90 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f  if( iDb<0 ) goto
10aa0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
10ab0 65 78 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  ex;..    /* If t
10ac0 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61  he index name wa
10ad0 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63  s unqualified, c
10ae0 68 65 63 6b 20 69 66 20 74 68 65 20 74 68 65 20  heck if the the 
10af0 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  table.    ** is 
10b00 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66  a temp table. If
10b10 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74   so, set the dat
10b20 61 62 61 73 65 20 74 6f 20 31 2e 0a 20 20 20 20  abase to 1..    
10b30 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71  */.    pTab = sq
10b40 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b  lite3SrcListLook
10b50 75 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e  up(pParse, pTblN
10b60 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ame);.    if( pN
10b70 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e  ame2 && pName2->
10b80 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26 20  n==0 && pTab && 
10b90 70 54 61 62 2d 3e 69 44 62 3d 3d 31 20 29 7b 0a  pTab->iDb==1 ){.
10ba0 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20        iDb = 1;. 
10bb0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71     }..    if( sq
10bc0 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
10bd0 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c  ix, pParse, iDb,
10be0 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29   "index", pName)
10bf0 20 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69   &&.        sqli
10c00 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73  te3FixSrcList(&s
10c10 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20  Fix, pTblName). 
10c20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
10c30 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
10c40 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  ex;.    }.    pT
10c50 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
10c60 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
10c70 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  pTblName->a[0].z
10c80 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70  Name, .        p
10c90 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  TblName->a[0].zD
10ca0 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66  atabase);.    if
10cb0 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65  ( !pTab ) goto e
10cc0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10cd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  ;.    assert( iD
10ce0 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29 3b 0a  b==pTab->iDb );.
10cf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
10d00 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b  ert( pName==0 );
10d10 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70 50 61  .    pTab =  pPa
10d20 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
10d30 20 20 20 20 69 44 62 20 3d 20 70 54 61 62 2d 3e      iDb = pTab->
10d40 69 44 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  iDb;.  }..  if( 
10d50 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73  pTab==0 || pPars
10d60 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65  e->nErr ) goto e
10d70 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10d80 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65  ;.  if( pTab->re
10d90 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71  adOnly ){.    sq
10da0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
10db0 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
10dc0 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
10dd0 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
10de0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
10df0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
10e00 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70   }.  if( pTab->p
10e10 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
10e20 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
10e30 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79  arse, "views may
10e40 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
10e50 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
10e60 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
10e70 20 7d 0a 20 20 69 73 54 65 6d 70 20 3d 20 70 54   }.  isTemp = pT
10e80 61 62 2d 3e 69 44 62 3d 3d 31 3b 0a 0a 20 20 2f  ab->iDb==1;..  /
10e90 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
10ea0 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
10eb0 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  x.  Make sure th
10ec0 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ere is not alrea
10ed0 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20  dy another.  ** 
10ee0 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77  index or table w
10ef0 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
10f00 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  e.  .  **.  ** E
10f10 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65  xception:  If we
10f20 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
10f30 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e   names of perman
10f40 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d  ent indices from
10f50 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
10f60 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 62  _master table (b
10f70 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65  ecause some othe
10f80 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65  r process change
10f90 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e  d the schema) an
10fa0 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  d.  ** one of th
10fb0 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f  e index names co
10fc0 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65 20  llides with the 
10fd0 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72  name of a tempor
10fe0 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a  ary table or.  *
10ff0 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65  * index, then we
11000 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74   will continue t
11010 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 69  o process this i
11020 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
11030 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  If pName==0 it m
11040 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65  eans that we are
11050 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69  .  ** dealing wi
11060 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  th a primary key
11070 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
11080 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20  raint.  We have 
11090 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20  to invent our.  
110a0 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a  ** own name..  *
110b0 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  /.  if( pName ){
110c0 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
110d0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
110e0 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  n(pName);.    if
110f0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
11100 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
11110 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78  Parse) ) goto ex
11120 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
11130 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
11140 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
11150 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
11160 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
11170 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
11180 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
11190 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ame) ){.      go
111a0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
111b0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
111c0 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
111d0 73 79 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65  sy ){.      Inde
111e0 78 20 2a 70 49 53 61 6d 65 4e 61 6d 65 3b 20 20  x *pISameName;  
111f0 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 69 6e 64    /* Another ind
11200 65 78 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ex with the same
11210 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54   name */.      T
11220 61 62 6c 65 20 2a 70 54 53 61 6d 65 4e 61 6d 65  able *pTSameName
11230 3b 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20  ;    /* A table 
11240 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65 20 61  with same name a
11250 73 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  s the index */. 
11260 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
11270 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
11280 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20  chema(pParse) ) 
11290 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
112a0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 66  _index;.      if
112b0 28 20 28 70 49 53 61 6d 65 4e 61 6d 65 20 3d 20  ( (pISameName = 
112c0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
112d0 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e  (db, zName, db->
112e0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 29  aDb[iDb].zName))
112f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
11300 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
11310 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73  Parse, "index %s
11320 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
11330 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
11340 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
11350 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
11360 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 53  }.      if( (pTS
11370 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ameName = sqlite
11380 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
11390 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a  Name, 0))!=0 ){.
113a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
113b0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
113c0 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
113d0 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  y a table named 
113e0 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
113f0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
11400 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
11410 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
11420 73 65 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30 20  se if( pName==0 
11430 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  ){.    char zBuf
11440 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  [30];.    int n;
11450 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f  .    Index *pLoo
11460 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  p;.    for(pLoop
11470 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e  =pTab->pIndex, n
11480 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =1; pLoop; pLoop
11490 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e  =pLoop->pNext, n
114a0 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e 74  ++){}.    sprint
114b0 66 28 7a 42 75 66 2c 22 5f 25 64 22 2c 6e 29 3b  f(zBuf,"_%d",n);
114c0 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a  .    zName = 0;.
114d0 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
114e0 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 73 71  ring(&zName, "sq
114f0 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22  lite_autoindex_"
11500 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
11510 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Buf, (char*)0);.
11520 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
11530 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
11540 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
11550 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61    /* Check for a
11560 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
11570 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e  create an index.
11580 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
11590 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
115a0 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
115b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
115c0 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e  = db->aDb[pTab->
115d0 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
115e0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
115f0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
11600 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45  ITE_INSERT, SCHE
11610 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29  MA_TABLE(isTemp)
11620 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
11630 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
11640 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
11650 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f  .    i = SQLITE_
11660 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20  CREATE_INDEX;.  
11670 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 20 69    if( isTemp ) i
11680 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
11690 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
116a0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
116b0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c  Check(pParse, i,
116c0 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e   zName, pTab->zN
116d0 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ame, zDb) ){.   
116e0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
116f0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
11700 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
11710 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69  * If pList==0, i
11720 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75  t means this rou
11730 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20  tine was called 
11740 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72  to make a primar
11750 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f  y.  ** key out o
11760 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  f the last colum
11770 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  n added to the t
11780 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
11790 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f  ruction..  ** So
117a0 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c   create a fake l
117b0 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  ist to simulate 
117c0 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  this..  */.  if(
117d0 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
117e0 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62   nullId.z = pTab
117f0 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f  ->aCol[pTab->nCo
11800 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  l-1].zName;.    
11810 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65  nullId.n = strle
11820 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20  n(nullId.z);.   
11830 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
11840 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30  ExprListAppend(0
11850 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20  , 0, &nullId);. 
11860 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
11870 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
11880 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20  te_index;.  }.. 
11890 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61   /* .  ** Alloca
118a0 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72  te the index str
118b0 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20  ucture. .  */.  
118c0 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 4d  pIndex = sqliteM
118d0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 6e  alloc( sizeof(In
118e0 64 65 78 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e  dex) + strlen(zN
118f0 61 6d 65 29 20 2b 20 31 20 2b 0a 20 20 20 20 20  ame) + 1 +.     
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11910 20 20 20 28 73 69 7a 65 6f 66 28 69 6e 74 29 20     (sizeof(int) 
11920 2b 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  + sizeof(CollSeq
11930 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e 45 78 70 72  *))*pList->nExpr
11940 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78   );.  if( pIndex
11950 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
11960 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11970 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
11980 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64 65 78   = (int*)&pIndex
11990 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
119a0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20  pList->nExpr];. 
119b0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d   pIndex->zName =
119c0 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d   (char*)&pIndex-
119d0 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d  >aiColumn[pList-
119e0 3e 6e 45 78 70 72 5d 3b 0a 20 20 73 74 72 63 70  >nExpr];.  strcp
119f0 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  y(pIndex->zName,
11a00 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65   zName);.  pInde
11a10 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
11a20 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ;.  pIndex->nCol
11a30 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  umn = pList->nEx
11a40 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e  pr;.  pIndex->on
11a50 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b  Error = onError;
11a60 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49  .  pIndex->autoI
11a70 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b  ndex = pName==0;
11a80 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 3d  .  pIndex->iDb =
11a90 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e   iDb;..  /* Scan
11aa0 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
11ab0 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
11ac0 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
11ad0 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f  exed and.  ** lo
11ae0 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  ad the column in
11af0 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49  dices into the I
11b00 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
11b10 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
11b20 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c  .  ** if any col
11b30 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  umn is not found
11b40 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
11b50 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
11b60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28  ; i++){.    for(
11b70 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
11b80 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; j++){.      i
11b90 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
11ba0 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
11bb0 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ame, pTab->aCol[
11bc0 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  j].zName)==0 ) b
11bd0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11be0 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f  if( j>=pTab->nCo
11bf0 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
11c00 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
11c10 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73  e, "table %s has
11c20 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64   no column named
11c30 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54   %s",.        pT
11c40 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69 73 74  ab->zName, pList
11c50 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
11c60 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
11c70 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
11c80 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61   }.    pIndex->a
11c90 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a  iColumn[i] = j;.
11ca0 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
11cb0 5b 69 5d 2e 70 45 78 70 72 20 29 7b 0a 20 20 20  [i].pExpr ){.   
11cc0 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
11cd0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43  ->a[i].pExpr->pC
11ce0 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 49 6e  oll );.      pIn
11cf0 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  dex->keyInfo.aCo
11d00 6c 6c 5b 69 5d 20 3d 20 70 4c 69 73 74 2d 3e 61  ll[i] = pList->a
11d10 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  [i].pExpr->pColl
11d20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11d30 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e     pIndex->keyIn
11d40 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 54  fo.aColl[i] = pT
11d50 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c  ab->aCol[j].pCol
11d60 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  l;.    }.    ass
11d70 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6b 65 79  ert( pIndex->key
11d80 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 29 3b  Info.aColl[i] );
11d90 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
11da0 69 74 2e 62 75 73 79 20 26 26 20 0a 20 20 20 20  it.busy && .    
11db0 20 20 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b      sqlite3Check
11dc0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
11dd0 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e  pIndex->keyInfo.
11de0 61 43 6f 6c 6c 5b 69 5d 29 20 0a 20 20 20 20 29  aColl[i]) .    )
11df0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
11e00 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
11e10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 6e 64      }.  }.  pInd
11e20 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69 65  ex->keyInfo.nFie
11e30 6c 64 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ld = pList->nExp
11e40 72 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  r;..  if( pTab==
11e50 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
11e60 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  e ){.    /* This
11e70 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65   routine has bee
11e80 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  n called to crea
11e90 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  te an automatic 
11ea0 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a  index as a.    *
11eb0 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52  * result of a PR
11ec0 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
11ed0 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20  QUE clause on a 
11ee0 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  column definitio
11ef0 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50  n, or.    ** a P
11f00 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
11f10 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c  IQUE clause foll
11f20 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e  owing the column
11f30 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20   definitions..  
11f40 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66    ** i.e. one of
11f50 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
11f60 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78  CREATE TABLE t(x
11f70 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29   PRIMARY KEY, y)
11f80 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20  ;.    ** CREATE 
11f90 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e  TABLE t(x, y, UN
11fa0 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20  IQUE(x, y));.   
11fb0 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65   **.    ** Eithe
11fc0 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20  r way, check to 
11fd0 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c 65  see if the table
11fe0 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75 63   already has suc
11ff0 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20  h an index. If. 
12000 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20     ** so, don't 
12010 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67 20  bother creating 
12020 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f  this one. This o
12030 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20  nly applies to. 
12040 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61     ** automatica
12050 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 69  lly created indi
12060 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64  ces. Users can d
12070 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20 77  o as they wish w
12080 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69  ith.    ** expli
12090 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20  cit indices..   
120a0 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
120b0 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
120c0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
120d0 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
120e0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
120f0 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  nt k;.      asse
12100 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  rt( pIdx->onErro
12110 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20  r!=OE_None );.  
12120 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
12130 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20  ->autoIndex );. 
12140 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
12150 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  dex->onError!=OE
12160 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20  _None );..      
12170 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  if( pIdx->nColum
12180 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  n!=pIndex->nColu
12190 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
121a0 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
121b0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b  pIdx->nColumn; k
121c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
121d0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
121e0 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f  k]!=pIndex->aiCo
121f0 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b  lumn[k] ) break;
12200 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
12210 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
12220 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 6b 65 79  [k]!=pIndex->key
12230 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20 29 20  Info.aColl[k] ) 
12240 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
12250 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78       if( k==pIdx
12260 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
12270 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
12280 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e  nError!=pIndex->
12290 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  onError ){.     
122a0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
122b0 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73 20  straint creates 
122c0 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61  the same index a
122d0 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  s a previous.   
122e0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
122f0 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20 73  aint specified s
12300 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20  omewhere in the 
12310 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
12320 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20  tement..        
12330 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65    ** However the
12340 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
12350 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72 65  uses are differe
12360 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73  nt. If both this
12370 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63   .          ** c
12380 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68  onstraint and th
12390 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69 76  e previous equiv
123a0 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74  alent constraint
123b0 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20   have explicit. 
123c0 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43           ** ON C
123d0 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
123e0 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72  this is an error
123f0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65  . Otherwise, use
12400 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
12410 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  * explicitly spe
12420 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 75 72  cified behaviour
12430 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a   for the index..
12440 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
12450 20 20 20 20 20 20 20 69 66 28 20 21 28 70 49 64         if( !(pId
12460 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
12470 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78  efault || pIndex
12480 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
12490 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20  fault) ){.      
124a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
124b0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
124c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
124d0 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43  conflicting ON C
124e0 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
124f0 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a  specified", 0);.
12500 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12510 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
12520 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
12530 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ult ){.         
12540 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72     pIdx->onError
12550 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72   = pIndex->onErr
12560 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  or;.          }.
12570 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12580 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
12590 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
125a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
125b0 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49  * Link the new I
125c0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74  ndex structure t
125d0 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20  o its table and 
125e0 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a  to the other.  *
125f0 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
12600 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e  base structures.
12610 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d   .  */.  if( db-
12620 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
12630 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
12640 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
12650 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70  nsert(&db->aDb[p
12660 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 69 64 78 48  Index->iDb].idxH
12670 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ash, .          
12680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
12690 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74  Index->zName, st
126a0 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e 61  rlen(pIndex->zNa
126b0 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b 0a  me)+1, pIndex);.
126c0 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
126d0 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49     assert( p==pI
126e0 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  ndex );  /* Mall
126f0 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
12700 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74  led */.      got
12710 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
12720 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  dex;.    }.    d
12730 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
12740 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
12750 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61  ;.    if( pTblNa
12760 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  me!=0 ){.      p
12770 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62  Index->tnum = db
12780 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a  ->init.newTnum;.
12790 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
127a0 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  If the db->init.
127b0 62 75 73 79 20 69 73 20 30 20 74 68 65 6e 20 63  busy is 0 then c
127c0 72 65 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  reate the index 
127d0 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20  on disk.  This. 
127e0 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69   ** involves wri
127f0 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69  ting the index i
12800 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74  nto the master t
12810 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67  able and filling
12820 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64   in the.  ** ind
12830 65 78 20 77 69 74 68 20 74 68 65 20 63 75 72 72  ex with the curr
12840 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e  ent table conten
12850 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ts..  **.  ** Th
12860 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
12870 69 73 20 30 20 77 68 65 6e 20 74 68 65 20 75 73  is 0 when the us
12880 65 72 20 66 69 72 73 74 20 65 6e 74 65 72 73 20  er first enters 
12890 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a  a CREATE INDEX .
128a0 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64    ** command.  d
128b0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
128c0 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73  1 when a databas
128d0 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20  e is opened and 
128e0 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44  .  ** CREATE IND
128f0 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  EX statements ar
12900 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68  e read out of th
12910 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e master table. 
12920 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74   In.  ** the lat
12930 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e 64  ter case the ind
12940 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
12950 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68  s on disk, which
12960 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20   is why.  ** we 
12970 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65  don't want to re
12980 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a  create it..  **.
12990 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65    ** If pTblName
129a0 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69  ==0 it means thi
129b0 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72  s index is gener
129c0 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61 72  ated as a primar
129d0 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e  y key.  ** or UN
129e0 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
129f0 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  of a CREATE TABL
12a00 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69  E statement.  Si
12a10 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  nce the table.  
12a20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ** has just been
12a30 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e   created, it con
12a40 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e  tains no data an
12a50 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74  d the index init
12a60 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  ialization.  ** 
12a70 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70  step can be skip
12a80 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  ped..  */.  else
12a90 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
12aa0 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62  sy==0 ){.    Vdb
12ab0 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a  e *v;.    char *
12ac0 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69  zStmt;.    int i
12ad0 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
12ae0 65 6d 2b 2b 3b 0a 0a 20 20 20 20 76 20 3d 20 73  em++;..    v = s
12af0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
12b00 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
12b10 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
12b20 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20  create_index;.. 
12b30 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
12b40 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68   rootpage for th
12b50 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20  e index.    */. 
12b60 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
12b70 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
12b80 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
12b90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12ba0 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  dOp(v, OP_Create
12bb0 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 29 3b 0a  Index, iDb, 0);.
12bc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12bd0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
12be0 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 0a  ore, iMem, 0);..
12bf0 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68      /* Gather th
12c00 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
12c10 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49 4e  of the CREATE IN
12c20 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  DEX statement in
12c30 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53  to.    ** the zS
12c40 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20  tmt variable.   
12c50 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61   */.    if( pSta
12c60 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20  rt && pEnd ){.  
12c70 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69      /* A named i
12c80 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70  ndex with an exp
12c90 6c 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44  licit CREATE IND
12ca0 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EX statement */.
12cb0 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71        zStmt = sq
12cc0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 43 52  lite3MPrintf("CR
12cd0 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a  EATE%s INDEX %.*
12ce0 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72  s",.        onEr
12cf0 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22  ror==OE_None ? "
12d00 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 0a 20  " : " UNIQUE",. 
12d10 20 20 20 20 20 20 20 41 64 64 72 28 70 45 6e 64         Addr(pEnd
12d20 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 4e 61 6d  ->z) - Addr(pNam
12d30 65 2d 3e 7a 29 20 2b 20 31 2c 0a 20 20 20 20 20  e->z) + 1,.     
12d40 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20     pName->z);.  
12d50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
12d60 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  * An automatic i
12d70 6e 64 65 78 20 63 72 65 61 74 65 64 20 62 79 20  ndex created by 
12d80 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
12d90 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
12da0 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a  nt */.      /* z
12db0 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
12dc0 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20  rintf(""); */.  
12dd0 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20      zStmt = 0;. 
12de0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
12df0 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c   an entry in sql
12e00 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74  ite_master for t
12e10 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f  his index.    */
12e20 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
12e30 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
12e40 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54  .        "INSERT
12e50 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55   INTO %Q.%s VALU
12e60 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51  ES('index',%Q,%Q
12e70 2c 23 30 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20  ,#0,%Q);",.     
12e80 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
12e90 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
12ea0 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20  BLE(iDb),.      
12eb0 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c    pIndex->zName,
12ec0 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
12ed0 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 53  Name,.        zS
12ee0 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  tmt.    );.    s
12ef0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
12f00 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
12f10 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
12f20 28 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a  (zStmt);..    /*
12f30 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20   Fill the index 
12f40 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65  with data and re
12f50 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61  parse the schema
12f60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
12f70 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  pTblName ){.    
12f80 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
12f90 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
12fa0 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  dex, iMem);.    
12fb0 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
12fc0 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62  ookie(db, v, iDb
12fd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12fe0 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61  VdbeOp3(v, OP_Pa
12ff0 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
13000 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  0,.         sqli
13010 74 65 33 4d 50 72 69 6e 74 66 28 22 6e 61 6d 65  te3MPrintf("name
13020 3d 27 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e  ='%q'", pIndex->
13030 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d  zName), P3_DYNAM
13040 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  IC);.    }.  }..
13050 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67    /* When adding
13060 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65   an index to the
13070 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73   list of indices
13080 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61   for a table, ma
13090 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c  ke.  ** sure all
130a0 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64   indices labeled
130b0 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65   OE_Replace come
130c0 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65   after all those
130d0 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45   labeled.  ** OE
130e0 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69  _Ignore.  This i
130f0 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20  s necessary for 
13100 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
13110 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a  ation of UPDATE.
13120 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e    ** and INSERT.
13130 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
13140 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62  init.busy || pTb
13150 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  lName==0 ){.    
13160 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  if( onError!=OE_
13170 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d  Replace || pTab-
13180 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20  >pIndex==0.     
13190 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e      || pTab->pIn
131a0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
131b0 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20  _Replace){.     
131c0 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
131d0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
131e0 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65       pTab->pInde
131f0 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  x = pIndex;.    
13200 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
13210 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61  ex *pOther = pTa
13220 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
13230 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e   while( pOther->
13240 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d  pNext && pOther-
13250 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21  >pNext->onError!
13260 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20  =OE_Replace ){. 
13270 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20         pOther = 
13280 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
13290 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
132a0 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74  dex->pNext = pOt
132b0 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
132c0 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20    pOther->pNext 
132d0 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  = pIndex;.    }.
132e0 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
132f0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20    }..  /* Clean 
13300 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  up before exitin
13310 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65  g */.exit_create
13320 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49  _index:.  if( pI
13330 6e 64 65 78 20 29 7b 0a 20 20 20 20 66 72 65 65  ndex ){.    free
13340 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20  Index(pIndex);. 
13350 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
13360 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
13370 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  );.  sqlite3SrcL
13380 69 73 74 44 65 6c 65 74 65 28 70 54 62 6c 4e 61  istDelete(pTblNa
13390 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  me);.  sqliteFre
133a0 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  e(zName);.  retu
133b0 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rn;.}../*.** Thi
133c0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  s routine will d
133d0 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20  rop an existing 
133e0 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68  named index.  Th
133f0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d  is routine.** im
13400 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f  plements the DRO
13410 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  P INDEX statemen
13420 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
13430 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73  e3DropIndex(Pars
13440 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
13450 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e  st *pName){.  In
13460 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56  dex *pIndex;.  V
13470 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
13480 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
13490 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  db;..  if( pPars
134a0 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
134b0 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
134c0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
134d0 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
134e0 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ==1 );.  if( SQL
134f0 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
13500 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
13510 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 49  ) ) return;.  pI
13520 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
13530 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d  ndIndex(db, pNam
13540 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70  e->a[0].zName, p
13550 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
13560 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e  base);.  if( pIn
13570 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  dex==0 ){.    sq
13580 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13590 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
135a0 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65  ndex: %S", pName
135b0 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
135c0 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
135d0 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  1;.    goto exit
135e0 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
135f0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61  .  if( pIndex->a
13600 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  utoIndex ){.    
13610 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
13620 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61  pParse, "index a
13630 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55  ssociated with U
13640 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f  NIQUE ".      "o
13650 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
13660 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
13670 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b  be dropped", 0);
13680 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
13690 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  rop_index;.  }.#
136a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
136b0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
136c0 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
136d0 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
136e0 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65  INDEX;.    Table
136f0 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
13700 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e  >pTable;.    con
13710 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
13720 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69  b->aDb[pIndex->i
13730 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  Db].zName;.    c
13740 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
13750 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70  = SCHEMA_TABLE(p
13760 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20  Index->iDb);.   
13770 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
13780 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
13790 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
137a0 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  b, 0, zDb) ){.  
137b0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
137c0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
137d0 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
137e0 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c  iDb ) code = SQL
137f0 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
13800 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
13810 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
13820 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64  arse, code, pInd
13830 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  ex->zName, pTab-
13840 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
13850 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
13860 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
13870 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
13880 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
13890 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69   to remove the i
138a0 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68  ndex and from th
138b0 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e master table *
138c0 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
138d0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
138e0 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 69    if( v ){.    i
138f0 6e 74 20 69 44 62 20 3d 20 70 49 6e 64 65 78 2d  nt iDb = pIndex-
13900 3e 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  >iDb;.    sqlite
13910 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
13920 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c  rse,.       "DEL
13930 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
13940 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20  HERE name=%Q",. 
13950 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
13960 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
13970 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
13980 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
13990 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  e.    );.    sql
139a0 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
139b0 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20  (db, v, iDb);.  
139c0 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
139d0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  e(pParse, pIndex
139e0 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
139f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
13a00 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78  (v, OP_DropIndex
13a10 2c 20 69 44 62 2c 20 30 2c 20 70 49 6e 64 65 78  , iDb, 0, pIndex
13a20 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d  ->zName, 0);.  }
13a30 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  ..exit_drop_inde
13a40 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  x:.  sqlite3SrcL
13a50 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29  istDelete(pName)
13a60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
13a70 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
13a80 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c  to the given IdL
13a90 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
13aa0 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20  ew IdList if.** 
13ab0 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41  need be..**.** A
13ac0 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72   new IdList is r
13ad0 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
13ae0 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
13af0 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73  ls..*/.IdList *s
13b00 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
13b10 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  nd(IdList *pList
13b20 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
13b30 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  {.  if( pList==0
13b40 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
13b50 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
13b60 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a  zeof(IdList) );.
13b70 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
13b80 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
13b90 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
13ba0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   0;.  }.  if( pL
13bb0 69 73 74 2d 3e 6e 49 64 3e 3d 70 4c 69 73 74 2d  ist->nId>=pList-
13bc0 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 73  >nAlloc ){.    s
13bd0 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
13be0 6d 20 2a 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d  m *a;.    pList-
13bf0 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4c 69 73 74 2d  >nAlloc = pList-
13c00 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20  >nAlloc*2 + 5;. 
13c10 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61     a = sqliteRea
13c20 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 70  lloc(pList->a, p
13c30 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69 7a  List->nAlloc*siz
13c40 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
13c50 20 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30   );.    if( a==0
13c60 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13c70 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  3IdListDelete(pL
13c80 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ist);.      retu
13c90 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
13ca0 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20  pList->a = a;.  
13cb0 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73  }.  memset(&pLis
13cc0 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d  t->a[pList->nId]
13cd0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73  , 0, sizeof(pLis
13ce0 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 70 4c 69  t->a[0]));.  pLi
13cf0 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64  st->a[pList->nId
13d00 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
13d10 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
13d20 54 6f 6b 65 6e 29 3b 0a 20 20 70 4c 69 73 74 2d  Token);.  pList-
13d30 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  >nId++;.  return
13d40 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
13d50 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61   Append a new ta
13d60 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20  ble name to the 
13d70 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20  given SrcList.  
13d80 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63  Create a new Src
13d90 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
13da0 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  be.  A new entry
13db0 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74   is created in t
13dc0 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20  he SrcList even 
13dd0 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c  if pToken is NUL
13de0 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53  L..**.** A new S
13df0 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  rcList is return
13e00 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
13e10 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
13e20 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73  *.** If pDatabas
13e30 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69  e is not null, i
13e40 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
13e50 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70   table has an op
13e60 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  tional.** databa
13e70 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20  se name prefix. 
13e80 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61   Like this:  "da
13e90 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20  tabase.table".  
13ea0 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a  The pDatabase.**
13eb0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74   points to the t
13ec0 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
13ed0 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20  e pTable points 
13ee0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
13ef0 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63  name..** The Src
13f00 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66  List.a[].zName f
13f10 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77  ield is filled w
13f20 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ith the table na
13f30 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a  me which might.*
13f40 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62  * come from pTab
13f50 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65  le (if pDatabase
13f60 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f   is NULL) or fro
13f70 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a  m pDatabase.  .*
13f80 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44  * SrcList.a[].zD
13f90 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65  atabase is fille
13fa0 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
13fb0 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54  ase name from pT
13fc0 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68  able,.** or with
13fd0 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61   NULL if no data
13fe0 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65  base is specifie
13ff0 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65  d..**.** In othe
14000 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c  r words, if call
14010 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
14020 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
14030 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41  3SrcListAppend(A
14040 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,0);.**.** The
14050 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e  n B is a table n
14060 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
14070 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73  base name is uns
14080 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61  pecified.  If ca
14090 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69  lled.** like thi
140a0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
140b0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
140c0 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a  ppend(A,B,C);.**
140d0 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68  .** Then C is th
140e0 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
140f0 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61   B is the databa
14100 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c  se name..*/.SrcL
14110 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
14120 69 73 74 41 70 70 65 6e 64 28 53 72 63 4c 69 73  istAppend(SrcLis
14130 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
14140 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a  *pTable, Token *
14150 70 44 61 74 61 62 61 73 65 29 7b 0a 20 20 73 74  pDatabase){.  st
14160 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
14170 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
14180 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
14190 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61  pList = sqliteMa
141a0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53 72 63  lloc( sizeof(Src
141b0 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
141c0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
141d0 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
141e0 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d  >nAlloc = 1;.  }
141f0 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 53  .  if( pList->nS
14200 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  rc>=pList->nAllo
14210 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  c ){.    SrcList
14220 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73   *pNew;.    pLis
14230 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a  t->nAlloc *= 2;.
14240 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
14250 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a  eRealloc(pList,.
14260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
14270 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20  izeof(*pList) + 
14280 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31  (pList->nAlloc-1
14290 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  )*sizeof(pList->
142a0 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
142b0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
142c0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
142d0 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
142e0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
142f0 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d     }.    pList =
14300 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74   pNew;.  }.  pIt
14310 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
14320 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20 20 6d  List->nSrc];.  m
14330 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20  emset(pItem, 0, 
14340 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
14350 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 44 61 74  0]));.  if( pDat
14360 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61  abase && pDataba
14370 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  se->z==0 ){.    
14380 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  pDatabase = 0;. 
14390 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61   }.  if( pDataba
143a0 73 65 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a  se && pTable ){.
143b0 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70      Token *pTemp
143c0 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20   = pDatabase;.  
143d0 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 70 54    pDatabase = pT
143e0 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65  able;.    pTable
143f0 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20   = pTemp;.  }.  
14400 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
14410 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
14420 6b 65 6e 28 70 54 61 62 6c 65 29 3b 0a 20 20 70  ken(pTable);.  p
14430 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
14440 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
14450 6d 54 6f 6b 65 6e 28 70 44 61 74 61 62 61 73 65  mToken(pDatabase
14460 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 43 75 72  );.  pItem->iCur
14470 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 4c 69 73  sor = -1;.  pLis
14480 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74  t->nSrc++;.  ret
14490 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
144a0 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75 72 73 6f  .** Assign curso
144b0 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73  rs to all tables
144c0 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f   in a SrcList.*/
144d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
144e0 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
144f0 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
14500 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29   SrcList *pList)
14510 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
14520 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
14530 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Src; i++){.    i
14540 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  f( pList->a[i].i
14550 43 75 72 73 6f 72 3c 30 20 29 7b 0a 20 20 20 20  Cursor<0 ){.    
14560 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43    pList->a[i].iC
14570 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
14580 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nTab++;.    }.  
14590 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
145a0 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20 6c  n alias to the l
145b0 61 73 74 20 69 64 65 6e 74 69 66 69 65 72 20 6f  ast identifier o
145c0 6e 20 74 68 65 20 67 69 76 65 6e 20 69 64 65 6e  n the given iden
145d0 74 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a  tifier list..*/.
145e0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
145f0 69 73 74 41 64 64 41 6c 69 61 73 28 53 72 63 4c  istAddAlias(SrcL
14600 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
14610 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
14620 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74  ( pList && pList
14630 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ->nSrc>0 ){.    
14640 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
14650 6e 53 72 63 2d 31 5d 2e 7a 41 6c 69 61 73 20 3d  nSrc-1].zAlias =
14660 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
14670 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20  Token(pToken);. 
14680 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
14690 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f  te an IdList..*/
146a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c  .void sqlite3IdL
146b0 69 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74  istDelete(IdList
146c0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
146d0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
146e0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
146f0 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
14700 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
14710 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
14720 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
14730 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
14740 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
14750 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
14760 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
14770 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  he index in pLis
14780 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66  t of the identif
14790 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20  ier named zId.  
147a0 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
147b0 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e  not found..*/.in
147c0 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  t sqlite3IdListI
147d0 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69  ndex(IdList *pLi
147e0 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
147f0 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  zName){.  int i;
14800 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
14810 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66  ) return -1;.  f
14820 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
14830 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
14840 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
14850 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
14860 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
14870 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
14880 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
14890 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
148a0 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69  entire SrcList i
148b0 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73  ncluding all its
148c0 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a   substructure..*
148d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
148e0 63 4c 69 73 74 44 65 6c 65 74 65 28 53 72 63 4c  cListDelete(SrcL
148f0 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
14900 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53  nt i;.  struct S
14910 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
14920 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
14930 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
14940 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
14950 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
14960 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
14970 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
14980 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 44 61 74  Free(pItem->zDat
14990 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  abase);.    sqli
149a0 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e  teFree(pItem->zN
149b0 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
149c0 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 41 6c 69  Free(pItem->zAli
149d0 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  as);.    if( pIt
149e0 65 6d 2d 3e 70 54 61 62 20 26 26 20 70 49 74 65  em->pTab && pIte
149f0 6d 2d 3e 70 54 61 62 2d 3e 69 73 54 72 61 6e 73  m->pTab->isTrans
14a00 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ient ){.      sq
14a10 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
14a20 28 30 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29  (0, pItem->pTab)
14a30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
14a40 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
14a50 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pItem->pSelect);
14a60 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
14a70 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 4f  Delete(pItem->pO
14a80 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49  n);.    sqlite3I
14a90 64 4c 69 73 74 44 65 6c 65 74 65 28 70 49 74 65  dListDelete(pIte
14aa0 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a  m->pUsing);.  }.
14ab0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
14ac0 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  st);.}../*.** Be
14ad0 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  gin a transactio
14ae0 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
14af0 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  3BeginTransactio
14b00 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
14b10 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71   int type){.  sq
14b20 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
14b30 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  e *v;.  int i;..
14b40 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
14b50 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
14b60 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62  b)==0 || db->aDb
14b70 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74  [0].pBt==0 ) ret
14b80 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
14b90 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
14ba0 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
14bb0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
14bc0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
14bd0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
14be0 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42  _TRANSACTION, "B
14bf0 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 20 72  EGIN", 0, 0) ) r
14c00 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71  eturn;..  v = sq
14c10 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
14c20 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29  rse);.  if( !v )
14c30 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74   return;.  if( t
14c40 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44  ype!=TK_DEFERRED
14c50 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
14c60 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
14c70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
14c80 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54  dbeAddOp(v, OP_T
14c90 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28  ransaction, i, (
14ca0 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49  type==TK_EXCLUSI
14cb0 56 45 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  VE)+1);.    }.  
14cc0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
14cd0 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43  ddOp(v, OP_AutoC
14ce0 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a  ommit, 0, 0);.}.
14cf0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20  ./*.** Commit a 
14d00 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
14d10 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
14d20 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  tTransaction(Par
14d30 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
14d40 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
14d50 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50  be *v;..  if( pP
14d60 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
14d70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
14d80 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
14d90 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
14da0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
14db0 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
14dc0 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
14dd0 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( sqlite3
14de0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
14df0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
14e00 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  TION, "COMMIT", 
14e10 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
14e20 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
14e30 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
14e40 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
14e50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
14e60 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c  , OP_AutoCommit,
14e70 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   1, 0);.  }.}../
14e80 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20  *.** Rollback a 
14e90 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
14ea0 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  oid sqlite3Rollb
14eb0 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ackTransaction(P
14ec0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
14ed0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
14ee0 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
14ef0 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
14f00 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
14f10 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
14f20 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
14f30 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
14f40 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
14f50 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
14f60 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
14f70 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
14f80 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
14f90 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43  ACTION, "ROLLBAC
14fa0 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75  K", 0, 0) ) retu
14fb0 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  rn;..  v = sqlit
14fc0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
14fd0 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
14fe0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14ff0 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  Op(v, OP_AutoCom
15000 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a  mit, 1, 1);.  }.
15010 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
15020 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61  re the TEMP data
15030 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64  base is open and
15040 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
15050 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  se.  Return.** t
15060 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
15070 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20  ors.  Leave any 
15080 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
15090 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
150a0 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
150b0 63 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65  c int sqlite3Ope
150c0 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50 61  nTempDatabase(Pa
150d0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
150e0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
150f0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
15100 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d  db->aDb[1].pBt==
15110 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78  0 && !pParse->ex
15120 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74  plain ){.    int
15130 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
15140 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30 2c  eeFactory(db, 0,
15150 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 26   0, MAX_PAGES, &
15160 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b  db->aDb[1].pBt);
15170 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
15180 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15190 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
151a0 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
151b0 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
151c0 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20  ary database ". 
151d0 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72         "file for
151e0 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61   storing tempora
151f0 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  ry tables");.   
15200 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
15210 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
15220 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
15230 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 21 64  ( db->flags & !d
15240 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
15250 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
15260 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
15270 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  ns(db->aDb[1].pB
15280 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 1);.      if(
15290 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
152a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
152b0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
152c0 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74  , "unable to get
152d0 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e   a write lock on
152e0 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 74 68   ".          "th
152f0 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  e temporary data
15300 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20 20 20  base file");.   
15310 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
15320 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 65  = rc;.        re
15330 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
15340 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
15350 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
15360 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
15370 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69  e that will veri
15380 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  fy the schema co
15390 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a  okie and start.*
153a0 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  * a read-transac
153b0 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d  tion for all nam
153c0 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
153d0 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  s..**.** It is i
153e0 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c  mportant that al
153f0 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73  l schema cookies
15400 20 62 65 20 76 65 72 69 66 69 65 64 20 61 6e 64   be verified and
15410 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61   all.** read tra
15420 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61  nsactions be sta
15430 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74  rted before anyt
15440 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e  hing else happen
15450 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45  s in.** the VDBE
15460 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74   program.  But t
15470 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
15480 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
15490 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f  much other.** co
154a0 64 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65  de has been gene
154b0 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20  rated.  So here 
154c0 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a  is what we do:.*
154d0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
154e0 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
154f0 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63   is called, we c
15500 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 74  ode an OP_Goto t
15510 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70  hat.** will jump
15520 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65   to a subroutine
15530 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
15540 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65  he program.  The
15550 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65  n we.** record e
15560 76 65 72 79 20 64 61 74 61 62 61 73 65 20 74 68  very database th
15570 61 74 20 6e 65 65 64 73 20 69 74 73 20 73 63 68  at needs its sch
15580 65 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e 20  ema verified in 
15590 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63  the.** pParse->c
155a0 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e  ookieMask field.
155b0 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61    Later, after a
155c0 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61  ll other code ha
155d0 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61  s been.** genera
155e0 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ted, the subrout
155f0 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74 68  ine that does th
15600 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63  e cookie verific
15610 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74  ations and.** st
15620 61 72 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  arts the transac
15630 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f  tions will be co
15640 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47  ded and the OP_G
15650 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20  oto P2 value.** 
15660 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20  will be made to 
15670 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75  point to that su
15680 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67  broutine.  The g
15690 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  eneration of the
156a0 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  .** cookie verif
156b0 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69  ication subrouti
156c0 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20  ne code happens 
156d0 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  in sqlite3Finish
156e0 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20  Coding()..**.** 
156f0 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63 6f  If iDb<0 then co
15700 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 6f  de the OP_Goto o
15710 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74 20  nly - don't set 
15720 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20 74  flag to verify t
15730 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e 20  he.** schema on 
15740 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20 20  any databases.  
15750 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
15760 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65   to position the
15770 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c   OP_Goto.** earl
15780 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20 62  y in the code, b
15790 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69 66  efore we know if
157a0 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 74 61   any database ta
157b0 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65  bles will be use
157c0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
157d0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
157e0 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
157f0 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
15800 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
15810 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73 6b  e *v;.  int mask
15820 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
15830 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
15840 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
15850 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f  turn;  /* This o
15860 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20 74  nly happens if t
15870 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f 72  here was a prior
15880 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20 3d   error */.  db =
15890 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
158a0 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  f( pParse->cooki
158b0 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  eGoto==0 ){.    
158c0 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
158d0 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  to = sqlite3Vdbe
158e0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
158f0 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20  , 0, 0)+1;.  }. 
15900 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20   if( iDb>=0 ){. 
15910 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64     assert( iDb<d
15920 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73  b->nDb );.    as
15930 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44  sert( db->aDb[iD
15940 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62  b].pBt!=0 || iDb
15950 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
15960 74 28 20 69 44 62 3c 33 32 20 29 3b 0a 20 20 20  t( iDb<32 );.   
15970 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a   mask = 1<<iDb;.
15980 20 20 20 20 69 66 28 20 28 70 50 61 72 73 65 2d      if( (pParse-
15990 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61  >cookieMask & ma
159a0 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
159b0 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
159c0 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
159d0 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
159e0 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d  Value[iDb] = db-
159f0 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61  >aDb[iDb].schema
15a00 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69  _cookie;.      i
15a10 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  f( iDb==1 ){.   
15a20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
15a30 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 50 61  TempDatabase(pPa
15a40 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rse);.      }.  
15a50 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
15a60 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
15a70 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65  ode that prepare
15a80 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f  s for doing an o
15a90 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  peration that.**
15aa0 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
15ab0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
15ac0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
15ad0 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e  tarts a new tran
15ae0 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72  saction if we ar
15af0 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69  e not already wi
15b00 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61  thin.** a transa
15b10 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72  ction.  If we ar
15b20 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e  e already within
15b30 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
15b40 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e  then a checkpoin
15b50 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74  t.** is set if t
15b60 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20  he setStatement 
15b70 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75  parameter is tru
15b80 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74  e.  A checkpoint
15b90 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65   should.** be se
15ba0 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73  t for operations
15bb0 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c   that might fail
15bc0 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74   (due to a const
15bd0 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a  raint) part of.*
15be0 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67  * the way throug
15bf0 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c  h and which will
15c00 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f   need to undo so
15c10 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75  me writes withou
15c20 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72  t having to.** r
15c30 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c  ollback the whol
15c40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
15c50 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77  For operations w
15c60 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  here all constra
15c70 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63  ints.** can be c
15c80 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e  hecked before an
15c90 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  y changes are ma
15ca0 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  de to the databa
15cb0 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a  se, it is never.
15cc0 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ** necessary to 
15cd0 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64  undo a write and
15ce0 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
15cf0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65  should not be se
15d00 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61  t..**.** Only da
15d10 74 61 62 61 73 65 20 69 44 62 20 61 6e 64 20 74  tabase iDb and t
15d20 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
15d30 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62   are made writab
15d40 6c 65 20 62 79 20 74 68 69 73 20 63 61 6c 6c 2e  le by this call.
15d50 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20 74  .** If iDb==0, t
15d60 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e 64  hen the main and
15d70 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 73 20   temp databases 
15d80 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c  are made writabl
15d90 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d 3d  e.   If.** iDb==
15da0 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20  1 then only the 
15db0 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 69 73  temp database is
15dc0 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20   made writable. 
15dd0 20 49 66 20 69 44 62 3e 31 20 74 68 65 6e 20 74   If iDb>1 then t
15de0 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  he.** specified 
15df0 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
15e00 73 65 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20  se and the temp 
15e10 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 64  database are mad
15e20 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76  e writable..*/.v
15e30 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
15e40 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50  WriteOperation(P
15e50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
15e60 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20  t setStatement, 
15e70 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
15e80 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
15e90 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
15ea0 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
15eb0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65  n;.  sqlite3Code
15ec0 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
15ed0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 50 61  rse, iDb);.  pPa
15ee0 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c  rse->writeMask |
15ef0 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20  = 1<<iDb;.  if( 
15f00 73 65 74 53 74 61 74 65 6d 65 6e 74 20 26 26 20  setStatement && 
15f10 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
15f20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
15f30 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
15f40 53 74 61 74 65 6d 65 6e 74 2c 20 69 44 62 2c 20  Statement, iDb, 
15f50 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44  0);.  }.  if( iD
15f60 62 21 3d 31 20 26 26 20 70 50 61 72 73 65 2d 3e  b!=1 && pParse->
15f70 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 21 3d  db->aDb[1].pBt!=
15f80 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
15f90 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
15fa0 69 6f 6e 28 70 50 61 72 73 65 2c 20 73 65 74 53  ion(pParse, setS
15fb0 74 61 74 65 6d 65 6e 74 2c 20 31 29 3b 0a 20 20  tatement, 1);.  
15fc0 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75  }.}../* .** Retu
15fd0 72 6e 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  rn the transient
15fe0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f   sqlite3_value o
15ff0 62 6a 65 63 74 20 75 73 65 64 20 66 6f 72 20 65  bject used for e
16000 6e 63 6f 64 69 6e 67 20 63 6f 6e 76 65 72 73 69  ncoding conversi
16010 6f 6e 73 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51  ons.** during SQ
16020 4c 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2e 0a 2a  L compilation..*
16030 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  /.sqlite3_value 
16040 2a 73 71 6c 69 74 65 33 47 65 74 54 72 61 6e 73  *sqlite3GetTrans
16050 69 65 6e 74 56 61 6c 75 65 28 73 71 6c 69 74 65  ientValue(sqlite
16060 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 21 64  3 *db){.  if( !d
16070 62 2d 3e 70 56 61 6c 75 65 20 29 7b 0a 20 20 20  b->pValue ){.   
16080 20 64 62 2d 3e 70 56 61 6c 75 65 20 3d 20 73 71   db->pValue = sq
16090 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b  lite3ValueNew();
160a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62  .  }.  return db
160b0 2d 3e 70 56 61 6c 75 65 3b 0a 7d 0a 0a 2f 2a 0a  ->pValue;.}../*.
160c0 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
160d0 69 66 20 70 49 6e 64 65 78 20 75 73 65 73 20 74  if pIndex uses t
160e0 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
160f0 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65  uence pColl.  Re
16100 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
16110 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73  it does and fals
16120 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  e if it does not
16130 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
16140 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
16150 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c  .static int coll
16160 61 74 69 6f 6e 4d 61 74 63 68 28 43 6f 6c 6c 53  ationMatch(CollS
16170 65 71 20 2a 70 43 6f 6c 6c 2c 20 49 6e 64 65 78  eq *pColl, Index
16180 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74   *pIndex){.  int
16190 20 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6b 65 79   n = pIndex->key
161a0 49 6e 66 6f 2e 6e 46 69 65 6c 64 3b 0a 20 20 43  Info.nField;.  C
161b0 6f 6c 6c 53 65 71 20 2a 2a 70 70 20 3d 20 70 49  ollSeq **pp = pI
161c0 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  ndex->keyInfo.aC
161d0 6f 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d  oll;.  while( n-
161e0 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 2a 70 70  - ){.    if( *pp
161f0 3d 3d 70 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e  ==pColl ) return
16200 20 31 3b 0a 20 20 20 20 70 70 2b 2b 3b 0a 20 20   1;.    pp++;.  
16210 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
16220 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
16230 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
16240 63 65 73 20 6f 66 20 70 54 61 62 20 74 68 61 74  ces of pTab that
16250 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69   use the collati
16260 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
16270 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d  l..** If pColl==
16280 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65  0 then recompute
16290 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
162a0 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  pTab..*/.#ifndef
162b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
162c0 4e 44 45 58 0a 76 6f 69 64 20 72 65 69 6e 64 65  NDEX.void reinde
162d0 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  xTable(Parse *pP
162e0 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
162f0 62 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  b, CollSeq *pCol
16300 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  l){.  Index *pIn
16310 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
16320 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
16330 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
16340 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e  ab */..  for(pIn
16350 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  dex=pTab->pIndex
16360 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
16370 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b  =pIndex->pNext){
16380 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d  .    if( pColl==
16390 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61  0 || collationMa
163a0 74 63 68 28 70 43 6f 6c 6c 2c 70 49 6e 64 65 78  tch(pColl,pIndex
163b0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
163c0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
163d0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
163e0 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20   pTab->iDb);.   
163f0 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
16400 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
16410 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  ndex, -1);.    }
16420 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
16430 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61  *.** Recompute a
16440 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61 6c  ll indices of al
16450 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20  l tables in all 
16460 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65 20  databases where 
16470 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75  the.** indices u
16480 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  se the collating
16490 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
164a0 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68    If pColl==0 th
164b0 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20  en recompute.** 
164c0 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65 72  all indices ever
164d0 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64  ywhere..*/.#ifnd
164e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
164f0 45 49 4e 44 45 58 0a 76 6f 69 64 20 72 65 69 6e  EINDEX.void rein
16500 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72  dexDatabases(Par
16510 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c  se *pParse, Coll
16520 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 44  Seq *pColl){.  D
16530 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20  b *pDb;         
16540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
16550 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
16560 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
16570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16580 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
16590 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   index number */
165a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
165b0 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
165c0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
165d0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48  onnection */.  H
165e0 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20  ashElem *k;     
165f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
16600 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
16610 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a  ables in pDb */.
16620 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
16630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16640 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
16650 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 66  database */..  f
16660 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62  or(iDb=0, pDb=db
16670 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e  ->aDb; iDb<db->n
16680 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b  Db; iDb++, pDb++
16690 29 7b 0a 20 20 20 20 69 66 28 20 70 44 62 3d 3d  ){.    if( pDb==
166a0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
166b0 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65      for(k=sqlite
166c0 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e  HashFirst(&pDb->
166d0 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d  tblHash);  k; k=
166e0 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b  sqliteHashNext(k
166f0 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d  )){.      pTab =
16700 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48   (Table*)sqliteH
16710 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20  ashData(k);.    
16720 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70    reindexTable(p
16730 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 43 6f  Parse, pTab, pCo
16740 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ll);.    }.  }.}
16750 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
16760 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
16770 20 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d   the REINDEX com
16780 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mand..**.**     
16790 20 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20     REINDEX      
167a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167b0 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20        -- 1.**   
167c0 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63       REINDEX  <c
167d0 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20  ollation>       
167e0 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20          -- 2.** 
167f0 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
16800 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61  ?<database>.?<ta
16810 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a  blename>  -- 3.*
16820 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
16830 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c    ?<database>.?<
16840 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34  indexname>  -- 4
16850 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61  .**.** Form 1 ca
16860 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  uses all indices
16870 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64   in all attached
16880 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65   databases to be
16890 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72   rebuilt..** For
168a0 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c  m 2 rebuilds all
168b0 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
168c0 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75  databases that u
168d0 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20  se the named.** 
168e0 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
168f0 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64  on.  Forms 3 and
16900 20 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e   4 rebuild the n
16910 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c  amed index or al
16920 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73  l.** indices ass
16930 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
16940 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f   named table..*/
16950 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16960 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69  OMIT_REINDEX.voi
16970 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78  d sqlite3Reindex
16980 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
16990 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54  Token *pName1, T
169a0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20  oken *pName2){. 
169b0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
169c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
169d0 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
169e0 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ce to be reindex
169f0 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ed, or NULL */. 
16a00 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
16a10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16a20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20  Name of a table 
16a30 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f  or index */.  co
16a40 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20  nst char *zDb;  
16a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
16a60 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
16a70 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  e */.  Table *pT
16a80 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
16a90 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e     /* A table in
16aa0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
16ab0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
16ac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
16ad0 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63  * An index assoc
16ae0 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20  iated with pTab 
16af0 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
16b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b10 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
16b20 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   index number */
16b30 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
16b40 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
16b50 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
16b60 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  onnection */.  T
16b70 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20  oken *pObjName; 
16b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
16b90 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
16ba0 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72  or index to be r
16bb0 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 69  eindexed */..  i
16bc0 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 7c 7c 20  f( pName1==0 || 
16bd0 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30 20 29 7b 0a  pName1->z==0 ){.
16be0 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62      reindexDatab
16bf0 61 73 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b  ases(pParse, 0);
16c00 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
16c10 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 32 3d  else if( pName2=
16c20 3d 30 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d  =0 || pName2->z=
16c30 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  =0 ){.    pColl 
16c40 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
16c50 6c 53 65 71 28 64 62 2c 20 64 62 2d 3e 65 6e 63  lSeq(db, db->enc
16c60 2c 20 70 4e 61 6d 65 31 2d 3e 7a 2c 20 70 4e 61  , pName1->z, pNa
16c70 6d 65 31 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20  me1->n, 0);.    
16c80 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
16c90 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61     reindexDataba
16ca0 73 65 73 28 70 50 61 72 73 65 2c 20 70 43 6f 6c  ses(pParse, pCol
16cb0 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  l);.      return
16cc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 44  ;.    }.  }.  iD
16cd0 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
16ce0 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
16cf0 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
16d00 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  pObjName);.  if(
16d10 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
16d20 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61  .  z = sqlite3Na
16d30 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4f 62 6a  meFromToken(pObj
16d40 4e 61 6d 65 29 3b 0a 20 20 7a 44 62 20 3d 20 64  Name);.  zDb = d
16d50 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
16d60 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  e;.  pTab = sqli
16d70 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
16d80 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20   z, zDb);.  if( 
16d90 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e  pTab ){.    rein
16da0 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c  dexTable(pParse,
16db0 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73   pTab, 0);.    s
16dc0 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
16dd0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
16de0 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
16df0 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c  FindIndex(db, z,
16e00 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 46   zDb);.  sqliteF
16e10 72 65 65 28 7a 29 3b 0a 20 20 69 66 28 20 70 49  ree(z);.  if( pI
16e20 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  ndex ){.    sqli
16e30 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
16e40 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
16e50 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
16e60 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
16e70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
16e80 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  1);.    return;.
16e90 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72    }.  sqlite3Err
16ea0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
16eb0 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66  nable to identif
16ec0 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20  y the object to 
16ed0 62 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a  be reindexed");.
16ee0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
16ef0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
16f00 54 45 52 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 47  TERTABLE./*.** G
16f10 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
16f20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 22 41  implement the "A
16f30 4c 54 45 52 20 54 41 42 4c 45 20 78 78 78 20 52  LTER TABLE xxx R
16f40 45 4e 41 4d 45 20 54 4f 20 79 79 79 22 20 0a 2a  ENAME TO yyy" .*
16f50 2a 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 76  * command. .*/.v
16f60 6f 69 64 20 73 71 6c 69 74 65 33 41 6c 74 65 72  oid sqlite3Alter
16f70 52 65 6e 61 6d 65 54 61 62 6c 65 28 0a 20 20 50  RenameTable(.  P
16f80 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
16f90 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
16fa0 65 72 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20  er context. */. 
16fb0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
16fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16fd0 65 20 74 61 62 6c 65 20 74 6f 20 72 65 6e 61 6d  e table to renam
16fe0 65 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  e. */.  Token *p
16ff0 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  Name            
17000 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74 61 62    /* The new tab
17010 6c 65 20 6e 61 6d 65 2e 20 2a 2f 0a 29 7b 0a 20  le name. */.){. 
17020 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
17030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
17040 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74  tabase that cont
17050 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20 2a  ains the table *
17060 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 20 20  /.  char *zDb;  
17070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17080 20 4e 61 6d 65 20 6f 66 20 64 61 74 61 62 61 73   Name of databas
17090 65 20 69 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65  e iDb */.  Table
170a0 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
170b0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65       /* Table be
170c0 69 6e 67 20 72 65 6e 61 6d 65 64 20 2a 2f 0a 20  ing renamed */. 
170d0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
170e0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 55  ;          /* NU
170f0 4c 4c 2d 74 65 72 6d 69 6e 61 74 65 64 20 76 65  LL-terminated ve
17100 72 73 69 6f 6e 20 6f 66 20 70 4e 61 6d 65 20 2a  rsion of pName *
17110 2f 20 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72  / .  char *zWher
17120 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  e = 0;         /
17130 2a 20 57 68 65 72 65 20 63 6c 61 75 73 65 20 6f  * Where clause o
17140 66 20 73 63 68 65 6d 61 20 65 6c 65 6d 65 6e 74  f schema element
17150 73 20 74 6f 20 72 65 70 61 72 73 65 20 2a 2f 0a  s to reparse */.
17160 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
17170 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 44  pParse->db; /* D
17180 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
17190 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  on */.  Vdbe *v;
171a0 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 53  .  .  assert( pS
171b0 72 63 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 0a  rc->nSrc==1 );..
171c0 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
171d0 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
171e0 73 65 2c 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 7a  se, pSrc->a[0].z
171f0 4e 61 6d 65 2c 20 70 53 72 63 2d 3e 61 5b 30 5d  Name, pSrc->a[0]
17200 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69  .zDatabase);.  i
17210 66 28 20 21 70 54 61 62 20 29 20 72 65 74 75 72  f( !pTab ) retur
17220 6e 3b 0a 20 20 69 44 62 20 3d 20 70 54 61 62 2d  n;.  iDb = pTab-
17230 3e 69 44 62 3b 0a 20 20 7a 44 62 20 3d 20 64 62  >iDb;.  zDb = db
17240 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
17250 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 4e 55  ;..  /* Get a NU
17260 4c 4c 20 74 65 72 6d 69 6e 61 74 65 64 20 76 65  LL terminated ve
17270 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77  rsion of the new
17280 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 2a 2f 0a   table name. */.
17290 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
172a0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
172b0 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 7a 4e  Name);.  if( !zN
172c0 61 6d 65 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ame ) return;.. 
172d0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61   /* Check that a
172e0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
172f0 6e 61 6d 65 64 20 27 7a 4e 61 6d 65 27 20 64 6f  named 'zName' do
17300 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
17310 78 69 73 74 0a 20 20 2a 2a 20 69 6e 20 64 61 74  xist.  ** in dat
17320 61 62 61 73 65 20 69 44 62 2e 20 49 66 20 73 6f  abase iDb. If so
17330 2c 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72  , this is an err
17340 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  or..  */.  if( s
17350 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
17360 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  db, zName, zDb) 
17370 7c 7c 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  || sqlite3FindIn
17380 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  dex(db, zName, z
17390 44 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Db) ){.    sqlit
173a0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
173b0 65 2c 20 0a 20 20 20 20 20 20 20 20 22 74 68 65  e, .        "the
173c0 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
173d0 6f 74 68 65 72 20 74 61 62 6c 65 20 6f 72 20 69  other table or i
173e0 6e 64 65 78 20 77 69 74 68 20 74 68 69 73 20 6e  ndex with this n
173f0 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29  ame: %s", zName)
17400 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
17410 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  (zName);.    ret
17420 75 72 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  urn;.  }..#ifnde
17430 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
17440 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a  THORIZATION.  /*
17450 20 49 6e 76 6f 6b 65 20 74 68 65 20 61 75 74 68   Invoke the auth
17460 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61  orization callba
17470 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ck. */.  if( sql
17480 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
17490 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 41 4c 54  arse, SQLITE_ALT
174a0 45 52 5f 54 41 42 4c 45 2c 20 7a 44 62 2c 20 70  ER_TABLE, zDb, p
174b0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 20 29  Tab->zName, 0) )
174c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
174d0 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  (zName);.    ret
174e0 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
174f0 0a 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 74 72  .  /* Begin a tr
17500 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 63 6f  ansaction and co
17510 64 65 20 74 68 65 20 56 65 72 69 66 79 43 6f 6f  de the VerifyCoo
17520 6b 69 65 20 66 6f 72 20 64 61 74 61 62 61 73 65  kie for database
17530 20 69 44 62 2e 20 0a 20 20 2a 2a 20 54 68 65 6e   iDb. .  ** Then
17540 20 6d 6f 64 69 66 79 20 74 68 65 20 73 63 68 65   modify the sche
17550 6d 61 20 63 6f 6f 6b 69 65 20 28 73 69 6e 63 65  ma cookie (since
17560 20 74 68 65 20 41 4c 54 45 52 20 54 41 42 4c 45   the ALTER TABLE
17570 20 6d 6f 64 69 66 69 65 73 20 74 68 65 0a 20 20   modifies the.  
17580 2a 2a 20 73 63 68 65 6d 61 29 2e 0a 20 20 2a 2f  ** schema)..  */
17590 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
175a0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
175b0 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
175c0 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
175d0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
175e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 65 67    }.  sqlite3Beg
175f0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
17600 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
17610 3b 0a 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67  ;.  sqlite3Chang
17620 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69  eCookie(db, v, i
17630 44 62 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 64 69 66  Db);..  /* Modif
17640 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  y the sqlite_mas
17650 74 65 72 20 74 61 62 6c 65 20 74 6f 20 75 73 65  ter table to use
17660 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e   the new table n
17670 61 6d 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ame. */.  sqlite
17680 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
17690 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41  rse,.      "UPDA
176a0 54 45 20 25 51 2e 25 73 20 53 45 54 20 22 0a 20  TE %Q.%s SET ". 
176b0 20 20 20 20 20 20 20 20 20 22 73 71 6c 20 3d 20           "sql = 
176c0 73 71 6c 69 74 65 5f 61 6c 74 65 72 5f 74 61 62  sqlite_alter_tab
176d0 6c 65 28 73 71 6c 2c 20 25 51 29 2c 20 22 0a 20  le(sql, %Q), ". 
176e0 20 20 20 20 20 20 20 20 20 22 74 62 6c 5f 6e 61           "tbl_na
176f0 6d 65 20 3d 20 25 51 2c 20 22 0a 20 20 20 20 20  me = %Q, ".     
17700 20 20 20 20 20 22 6e 61 6d 65 20 3d 20 43 41 53       "name = CAS
17710 45 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  E ".            
17720 22 57 48 45 4e 20 74 79 70 65 3d 27 74 61 62 6c  "WHEN type='tabl
17730 65 27 20 54 48 45 4e 20 25 51 20 22 0a 20 20 20  e' THEN %Q ".   
17740 20 20 20 20 20 20 20 20 20 22 57 48 45 4e 20 6e           "WHEN n
17750 61 6d 65 20 4c 49 4b 45 20 27 73 71 6c 69 74 65  ame LIKE 'sqlite
17760 5f 61 75 74 6f 69 6e 64 65 78 25 25 27 20 41 4e  _autoindex%%' AN
17770 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20 54  D type='index' T
17780 48 45 4e 20 22 0a 20 20 20 20 20 20 20 20 20 20  HEN ".          
17790 20 20 20 20 22 27 73 71 6c 69 74 65 5f 61 75 74      "'sqlite_aut
177a0 6f 69 6e 64 65 78 5f 27 20 7c 7c 20 25 51 20 7c  oindex_' || %Q |
177b0 7c 20 73 75 62 73 74 72 28 6e 61 6d 65 2c 20 25  | substr(name, %
177c0 64 2b 31 38 2c 31 30 29 20 22 0a 20 20 20 20 20  d+18,10) ".     
177d0 20 20 20 20 20 20 20 22 45 4c 53 45 20 6e 61 6d         "ELSE nam
177e0 65 20 45 4e 44 20 22 0a 20 20 20 20 20 20 22 57  e END ".      "W
177f0 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51  HERE tbl_name=%Q
17800 20 41 4e 44 20 74 79 70 65 20 49 4e 20 28 27 74   AND type IN ('t
17810 61 62 6c 65 27 2c 20 27 69 6e 64 65 78 27 29 3b  able', 'index');
17820 22 2c 20 0a 20 20 20 20 20 20 64 62 2d 3e 61 44  ", .      db->aD
17830 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
17840 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
17850 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 7a   zName, zName, z
17860 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 7a 4e 61  Name, .      zNa
17870 6d 65 2c 20 73 74 72 6c 65 6e 28 70 54 61 62 2d  me, strlen(pTab-
17880 3e 7a 4e 61 6d 65 29 2c 20 70 54 61 62 2d 3e 7a  >zName), pTab->z
17890 4e 61 6d 65 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  Name.  );..  /* 
178a0 44 72 6f 70 20 74 68 65 20 65 6c 65 6d 65 6e 74  Drop the element
178b0 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  s of the in-memo
178c0 72 79 20 73 63 68 65 6d 61 20 74 68 61 74 20 72  ry schema that r
178d0 65 66 65 72 65 64 20 74 6f 20 74 68 65 20 74 61  efered to the ta
178e0 62 6c 65 0a 20 20 2a 2a 20 72 65 6e 61 6d 65 64  ble.  ** renamed
178f0 20 61 6e 64 20 6c 6f 61 64 20 74 68 65 20 6e 65   and load the ne
17900 77 20 76 65 72 73 69 6f 6e 73 20 66 72 6f 6d 20  w versions from 
17910 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
17920 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
17930 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
17940 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
17950 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20  , OP_DropTable, 
17960 69 44 62 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  iDb, 0, pTab->zN
17970 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7a 57 68  ame, 0);.    zWh
17980 65 72 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ere = sqlite3MPr
17990 69 6e 74 66 28 22 74 62 6c 5f 6e 61 6d 65 3d 25  intf("tbl_name=%
179a0 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Q", zName);.    
179b0 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
179c0 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61  , OP_ParseSchema
179d0 2c 20 69 44 62 2c 20 30 2c 20 7a 57 68 65 72 65  , iDb, 0, zWhere
179e0 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P3_DYNAMIC);. 
179f0 20 7d 0a 0a 20 20 73 71 6c 69 74 65 46 72 65 65   }..  sqliteFree
17a00 28 7a 4e 61 6d 65 29 3b 0a 7d 0a 23 65 6e 64 69  (zName);.}.#endi
17a10 66 0a                                            f.