/ Hex Artifact Content
Login

Artifact 7b9427a2f9fccde0a4f543dd7ef6966ac005df78:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 0a 2a 2a    ROLLBACK.**.**
02d0: 20 24 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20   $Id: build.c,v 
02e0: 31 2e 33 30 37 20 32 30 30 35 2f 30 32 2f 30 31  1.307 2005/02/01
02f0: 20 30 33 3a 30 39 3a 35 32 20 64 61 6e 69 65 6c   03:09:52 daniel
0300: 6b 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23  k1977 Exp $.*/.#
0310: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0320: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
0330: 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  ctype.h>../*.** 
0340: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0350: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65  called when a ne
0360: 77 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  w SQL statement 
0370: 69 73 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a  is beginning to.
0380: 2a 2a 20 62 65 20 70 61 72 73 65 64 2e 20 20 49  ** be parsed.  I
0390: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 70 50  nitialize the pP
03a0: 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20 61  arse structure a
03b0: 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69  s needed..*/.voi
03c0: 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 50 61  d sqlite3BeginPa
03d0: 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rse(Parse *pPars
03e0: 65 2c 20 69 6e 74 20 65 78 70 6c 61 69 6e 46 6c  e, int explainFl
03f0: 61 67 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 65  ag){.  pParse->e
0400: 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61 69 6e  xplain = explain
0410: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
0420: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nVar = 0;.}../*.
0430: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0440: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
0450: 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61  a single SQL sta
0460: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
0470: 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20 61 20  ** parsed and a 
0480: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 74 6f 20  VDBE program to 
0490: 65 78 65 63 75 74 65 20 74 68 61 74 20 73 74 61  execute that sta
04a0: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
04b0: 2a 2a 20 70 72 65 70 61 72 65 64 2e 20 20 54 68  ** prepared.  Th
04c0: 69 73 20 72 6f 75 74 69 6e 65 20 70 75 74 73 20  is routine puts 
04d0: 74 68 65 20 66 69 6e 69 73 68 69 6e 67 20 74 6f  the finishing to
04e0: 75 63 68 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  uches on the.** 
04f0: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 6e 64  VDBE program and
0500: 20 72 65 73 65 74 73 20 74 68 65 20 70 50 61 72   resets the pPar
0510: 73 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  se structure for
0520: 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 70 61 72   the next.** par
0530: 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  se..**.** Note t
0540: 68 61 74 20 69 66 20 61 6e 20 65 72 72 6f 72 20  hat if an error 
0550: 6f 63 63 75 72 72 65 64 2c 20 69 74 20 6d 69 67  occurred, it mig
0560: 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
0570: 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63  hat.** no VDBE c
0580: 6f 64 65 20 77 61 73 20 67 65 6e 65 72 61 74 65  ode was generate
0590: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
05a0: 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 50  e3FinishCoding(P
05b0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
05c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
05d0: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
05e0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
05f0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
0600: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65    if( pParse->ne
0610: 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 0a  sted ) return;..
0620: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70    if( !pParse->p
0630: 56 64 62 65 20 29 20 72 65 74 75 72 6e 3b 0a 0a  Vdbe ) return;..
0640: 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 67 65    /* Begin by ge
0650: 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65 20 74 65  nerating some te
0660: 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20 61  rmination code a
0670: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
0680: 0a 20 20 2a 2a 20 76 64 62 65 20 70 72 6f 67 72  .  ** vdbe progr
0690: 61 6d 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70  am.  */.  db = p
06a0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d  Parse->db;.  v =
06b0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
06c0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
06d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
06e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 48  dbeAddOp(v, OP_H
06f0: 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  alt, 0, 0);..   
0700: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
0710: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
0720: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
0730: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
0740: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
0750: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
0760: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
0770: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
0780: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
0790: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
07a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
07b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
07c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
07d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
07e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
07f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
0800: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
0810: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
0820: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
0830: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
0840: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  if( pParse->cook
0850: 69 65 47 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20  ieGoto>0 ){.    
0860: 20 20 75 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20    u32 mask;.    
0870: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
0880: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
0890: 67 65 50 32 28 76 2c 20 70 50 61 72 73 65 2d 3e  geP2(v, pParse->
08a0: 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 2c 20 73 71  cookieGoto-1, sq
08b0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
08c0: 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 20 20  Addr(v));.      
08d0: 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73 6b 3d  for(iDb=0, mask=
08e0: 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  1; iDb<db->nDb; 
08f0: 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b 29  mask<<=1, iDb++)
0900: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
0910: 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 63 6f  ask & pParse->co
0920: 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29 20 63  okieMask)==0 ) c
0930: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
0940: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
0950: 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74  p(v, OP_Transact
0960: 69 6f 6e 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20  ion, iDb, (mask 
0970: 26 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d  & pParse->writeM
0980: 61 73 6b 29 21 3d 30 29 3b 0a 20 20 20 20 20 20  ask)!=0);.      
0990: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
09a0: 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43  Op(v, OP_VerifyC
09b0: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 70 50 61 72  ookie, iDb, pPar
09c0: 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b  se->cookieValue[
09d0: 69 44 62 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iDb]);.      }. 
09e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
09f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
0a00: 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  , 0, pParse->coo
0a10: 6b 69 65 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a  kieGoto);.    }.
0a20: 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 20 4e 6f  .    /* Add a No
0a30: 2d 6f 70 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  -op that contain
0a40: 73 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  s the complete t
0a50: 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 69  ext of the compi
0a60: 6c 65 64 20 53 51 4c 0a 20 20 20 20 2a 2a 20 73  led SQL.    ** s
0a70: 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74 73 20  tatement as its 
0a80: 50 33 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68  P3 argument.  Th
0a90: 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e  is does not chan
0aa0: 67 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 61  ge the functiona
0ab0: 6c 69 74 79 0a 20 20 20 20 2a 2a 20 6f 66 20 74  lity.    ** of t
0ac0: 68 65 20 70 72 6f 67 72 61 6d 2e 20 0a 20 20 20  he program. .   
0ad0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
0ae0: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
0af0: 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 74 72 61  ment sqlite3_tra
0b00: 63 65 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ce()..    */.   
0b10: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
0b20: 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30  v, OP_Noop, 0, 0
0b30: 2c 20 70 50 61 72 73 65 2d 3e 7a 53 71 6c 2c 20  , pParse->zSql, 
0b40: 70 50 61 72 73 65 2d 3e 7a 54 61 69 6c 2d 70 50  pParse->zTail-pP
0b50: 61 72 73 65 2d 3e 7a 53 71 6c 29 3b 0a 20 20 7d  arse->zSql);.  }
0b60: 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ...  /* Get the 
0b70: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65 61  VDBE program rea
0b80: 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  dy for execution
0b90: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26  .  */.  if( v &&
0ba0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
0bb0: 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74 72   ){.    FILE *tr
0bc0: 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  ace = (db->flags
0bd0: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72   & SQLITE_VdbeTr
0be0: 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74  ace)!=0 ? stdout
0bf0: 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   : 0;.    sqlite
0c00: 33 56 64 62 65 54 72 61 63 65 28 76 2c 20 74 72  3VdbeTrace(v, tr
0c10: 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ace);.    sqlite
0c20: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76  3VdbeMakeReady(v
0c30: 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  , pParse->nVar, 
0c40: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 33 2c 0a  pParse->nMem+3,.
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c60: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
0c70: 3e 6e 54 61 62 2b 33 2c 20 70 50 61 72 73 65 2d  >nTab+3, pParse-
0c80: 3e 6e 4d 61 78 44 65 70 74 68 2b 31 2c 20 70 50  >nMaxDepth+1, pP
0c90: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29 3b 0a  arse->explain);.
0ca0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
0cb0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 3f 20   pParse->nErr ? 
0cc0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a 20 53  SQLITE_ERROR : S
0cd0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
0ce0: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
0cf0: 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Set = 0;.  }else
0d00: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d   if( pParse->rc=
0d10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
0d20: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
0d30: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
0d40: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20  .  pParse->nTab 
0d50: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
0d60: 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Mem = 0;.  pPars
0d70: 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70  e->nSet = 0;.  p
0d80: 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b  Parse->nVar = 0;
0d90: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  .  pParse->cooki
0da0: 65 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61  eMask = 0;.  pPa
0db0: 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20  rse->cookieGoto 
0dc0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75  = 0;.}../*.** Ru
0dd0: 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 6e 64  n the parser and
0de0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
0df0: 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e 20 6f  recursively in o
0e00: 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65  rder to generate
0e10: 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74 68 65  .** code for the
0e20: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 67   SQL statement g
0e30: 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e  iven onto the en
0e40: 64 20 6f 66 20 74 68 65 20 70 50 61 72 73 65 20  d of the pParse 
0e50: 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72 65  context.** curre
0e60: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
0e70: 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74  ruction.  When t
0e80: 68 65 20 70 61 72 73 65 72 20 69 73 20 72 75 6e  he parser is run
0e90: 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20   recursively.** 
0ea0: 74 68 69 73 20 77 61 79 2c 20 74 68 65 20 66 69  this way, the fi
0eb0: 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e  nal OP_Halt is n
0ec0: 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e 64 20  ot appended and 
0ed0: 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69 7a 61  other initializa
0ee0: 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61  tion.** and fina
0ef0: 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 61  lization steps a
0f00: 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63 61 75  re omitted becau
0f10: 73 65 20 74 68 6f 73 65 20 61 72 65 20 68 61 6e  se those are han
0f20: 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20  dling by the.** 
0f30: 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73 65 72  outermost parser
0f40: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72  ..**.** Not ever
0f50: 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74 61 62  ything is nestab
0f60: 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69 6c 69  le.  This facili
0f70: 74 79 20 69 73 20 64 65 73 69 67 6e 65 64 20 74  ty is designed t
0f80: 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45  o permit.** INSE
0f90: 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20  RT, UPDATE, and 
0fa0: 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e  DELETE operation
0fb0: 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49 54 45  s against SQLITE
0fc0: 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a  _MASTER.  Use.**
0fd0: 20 63 61 72 65 20 69 66 20 79 6f 75 20 64 65 63   care if you dec
0fe0: 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20 75 73  ide to try to us
0ff0: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  e this routine f
1000: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
1010: 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  rposes..*/.void 
1020: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
1030: 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
1040: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
1050: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
1060: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61  a_list ap;.  cha
1070: 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72  r *zSql;.  int r
1080: 63 3b 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45  c;.# define SAVE
1090: 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72  _SZ  (sizeof(Par
10a0: 73 65 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50  se) - offsetof(P
10b0: 61 72 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68  arse,nVar)).  ch
10c0: 61 72 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f  ar saveBuf[SAVE_
10d0: 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  SZ];..  if( pPar
10e0: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
10f0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  n;.  assert( pPa
1100: 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29  rse->nested<10 )
1110: 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68  ;  /* Nesting sh
1120: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20  ould only be of 
1130: 6c 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f  limited depth */
1140: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
1150: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c  zFormat);.  zSql
1160: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
1170: 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  tf(zFormat, ap);
1180: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
1190: 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a   if( zSql==0 ){.
11a0: 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a      return;   /*
11b0: 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68   A malloc must h
11c0: 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ave failed */.  
11d0: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  }.  pParse->nest
11e0: 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73  ed++;.  memcpy(s
11f0: 61 76 65 42 75 66 2c 20 26 70 50 61 72 73 65 2d  aveBuf, &pParse-
1200: 3e 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b  >nVar, SAVE_SZ);
1210: 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73  .  memset(&pPars
1220: 65 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41 56 45  e->nVar, 0, SAVE
1230: 5f 53 5a 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  _SZ);.  rc = sql
1240: 69 74 65 33 52 75 6e 50 61 72 73 65 72 28 70 50  ite3RunParser(pP
1250: 61 72 73 65 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a  arse, zSql, 0);.
1260: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 53 71    sqliteFree(zSq
1270: 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50  l);.  memcpy(&pP
1280: 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65  arse->nVar, save
1290: 42 75 66 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20  Buf, SAVE_SZ);. 
12a0: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d   pParse->nested-
12b0: 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  -;.}../*.** Loca
12c0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
12d0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
12e0: 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74  describes a part
12f0: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a  icular database.
1300: 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  ** table given t
1310: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
1320: 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f  table and (optio
1330: 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20  nally) the name 
1340: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
1350: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
1360: 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
1370: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
1380: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61  nd..**.** If zDa
1390: 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c  tabase is 0, all
13a0: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73   databases are s
13b0: 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 20  earched for the 
13c0: 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a  table and the.**
13d0: 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
13e0: 74 61 62 6c 65 20 69 73 20 72 65 74 75 72 6e 65  table is returne
13f0: 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67  d.  (No checking
1400: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 74   for duplicate t
1410: 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73  able.** names is
1420: 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61   done.)  The sea
1430: 72 63 68 20 6f 72 64 65 72 20 69 73 20 54 45 4d  rch order is TEM
1440: 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41  P first, then MA
1450: 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20  IN, then any.** 
1460: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
1470: 73 65 73 20 61 64 64 65 64 20 75 73 69 6e 67 20  ses added using 
1480: 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61  the ATTACH comma
1490: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  nd..**.** See al
14a0: 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  so sqlite3Locate
14b0: 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c  Table()..*/.Tabl
14c0: 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 54 61  e *sqlite3FindTa
14d0: 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ble(sqlite3 *db,
14e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
14f0: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
1500: 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20 54 61  zDatabase){.  Ta
1510: 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e  ble *p = 0;.  in
1520: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  t i;.  assert( z
1530: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Name!=0 );.  ass
1540: 65 72 74 28 20 28 64 62 2d 3e 66 6c 61 67 73 20  ert( (db->flags 
1550: 26 20 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c  & SQLITE_Initial
1560: 69 7a 65 64 29 20 7c 7c 20 64 62 2d 3e 69 6e 69  ized) || db->ini
1570: 74 2e 62 75 73 79 20 29 3b 0a 20 20 66 6f 72 28  t.busy );.  for(
1580: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
1590: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20  i++){.    int j 
15a0: 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20  = (i<2) ? i^1 : 
15b0: 69 3b 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54  i;   /* Search T
15c0: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
15d0: 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61  */.    if( zData
15e0: 62 61 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74  base!=0 && sqlit
15f0: 65 33 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62  e3StrICmp(zDatab
1600: 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  ase, db->aDb[j].
1610: 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75  zName) ) continu
1620: 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  e;.    p = sqlit
1630: 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  e3HashFind(&db->
1640: 61 44 62 5b 6a 5d 2e 74 62 6c 48 61 73 68 2c 20  aDb[j].tblHash, 
1650: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
1660: 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28  ame)+1);.    if(
1670: 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   p ) break;.  }.
1680: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
1690: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
16a0: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
16b0: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
16c0: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
16d0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
16e0: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
16f0: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
1700: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
1710: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
1720: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
1730: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
1740: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
1750: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c  f not found.  Al
1760: 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65  so leave an.** e
1770: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
1780: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
1790: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
17a0: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
17b0: 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73  is routine and s
17c0: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
17d0: 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
17e0: 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73  * routine leaves
17f0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
1800: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
1810: 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71  rMsg where.** sq
1820: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29  lite3FindTable()
1830: 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61   does not..*/.Ta
1840: 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  ble *sqlite3Loca
1850: 74 65 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  teTable(Parse *p
1860: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
1870: 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
1880: 63 68 61 72 20 2a 7a 44 62 61 73 65 29 7b 0a 20  char *zDbase){. 
1890: 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a   Table *p;..  /*
18a0: 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
18b0: 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
18c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
18d0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
18e0: 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
18f0: 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
1900: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
1910: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
1920: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
1930: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
1940: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1950: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
1960: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
1970: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  ->db, zName, zDb
1980: 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
1990: 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 62 61   ){.    if( zDba
19a0: 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  se ){.      sqli
19b0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
19c0: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  se, "no such tab
19d0: 6c 65 3a 20 25 73 2e 25 73 22 2c 20 7a 44 62 61  le: %s.%s", zDba
19e0: 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  se, zName);.    
19f0: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
1a00: 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
1a10: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  e->db, zName, 0)
1a20: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
1a30: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1a40: 72 73 65 2c 20 22 74 61 62 6c 65 20 5c 22 25 73  rse, "table \"%s
1a50: 5c 22 20 69 73 20 6e 6f 74 20 69 6e 20 64 61 74  \" is not in dat
1a60: 61 62 61 73 65 20 5c 22 25 73 5c 22 22 2c 0a 20  abase \"%s\"",. 
1a70: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 7a          zName, z
1a80: 44 62 61 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Dbase);.    }els
1a90: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1aa0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1ab0: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
1ac0: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
1ad0: 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
1ae0: 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
1af0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
1b00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
1b10: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
1b20: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
1b30: 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61  scribes .** a pa
1b40: 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67  rticular index g
1b50: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
1b60: 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61   that index.** a
1b70: 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nd the name of t
1b80: 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
1b90: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e   contains the in
1ba0: 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e  dex..** Return N
1bb0: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
1bc0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61  ..**.** If zData
1bd0: 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64  base is 0, all d
1be0: 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61  atabases are sea
1bf0: 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a  rched for the.**
1c00: 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20 66   table and the f
1c10: 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 69 6e  irst matching in
1c20: 64 65 78 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dex is returned.
1c30: 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a    (No checking.*
1c40: 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  * for duplicate 
1c50: 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73 20 64  index names is d
1c60: 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63  one.)  The searc
1c70: 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54 45  h order is.** TE
1c80: 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d  MP first, then M
1c90: 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61 75  AIN, then any au
1ca0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
1cb0: 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67  s added.** using
1cc0: 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d   the ATTACH comm
1cd0: 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73  and..*/.Index *s
1ce0: 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
1cf0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
1d00: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
1d10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29  const char *zDb)
1d20: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 30  {.  Index *p = 0
1d30: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
1d40: 65 72 74 28 20 28 64 62 2d 3e 66 6c 61 67 73 20  ert( (db->flags 
1d50: 26 20 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c  & SQLITE_Initial
1d60: 69 7a 65 64 29 20 7c 7c 20 64 62 2d 3e 69 6e 69  ized) || db->ini
1d70: 74 2e 62 75 73 79 20 29 3b 0a 20 20 66 6f 72 28  t.busy );.  for(
1d80: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
1d90: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20  i++){.    int j 
1da0: 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20  = (i<2) ? i^1 : 
1db0: 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  i;  /* Search TE
1dc0: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
1dd0: 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26 26  /.    if( zDb &&
1de0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1df0: 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  zDb, db->aDb[j].
1e00: 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75  zName) ) continu
1e10: 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  e;.    p = sqlit
1e20: 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  e3HashFind(&db->
1e30: 61 44 62 5b 6a 5d 2e 69 64 78 48 61 73 68 2c 20  aDb[j].idxHash, 
1e40: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
1e50: 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28  ame)+1);.    if(
1e60: 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   p ) break;.  }.
1e70: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
1e80: 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68 65  *.** Reclaim the
1e90: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
1ea0: 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74  an index.*/.stat
1eb0: 69 63 20 76 6f 69 64 20 66 72 65 65 49 6e 64 65  ic void freeInde
1ec0: 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 73  x(Index *p){.  s
1ed0: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 43 6f  qliteFree(p->zCo
1ee0: 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 46  lAff);.  sqliteF
1ef0: 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ree(p);.}../*.**
1f00: 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69 76 65   Remove the give
1f10: 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65  n index from the
1f20: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
1f30: 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69  e, and free.** i
1f40: 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ts memory struct
1f50: 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ures..**.** The 
1f60: 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76 65 64  index is removed
1f70: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1f80: 73 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 62  se hash tables b
1f90: 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  ut.** it is not 
1fa0: 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68  unlinked from th
1fb0: 65 20 54 61 62 6c 65 20 74 68 61 74 20 69 74 20  e Table that it 
1fc0: 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69  indexes..** Unli
1fd0: 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 54  nking from the T
1fe0: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64 6f 6e  able must be don
1ff0: 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  e by the calling
2000: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
2010: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
2020: 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69  DeleteIndex(sqli
2030: 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a  te3 *db, Index *
2040: 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6c  p){.  Index *pOl
2050: 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  d;..  assert( db
2060: 21 3d 30 20 26 26 20 70 2d 3e 7a 4e 61 6d 65 21  !=0 && p->zName!
2070: 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73  =0 );.  pOld = s
2080: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
2090: 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62  (&db->aDb[p->iDb
20a0: 5d 2e 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a 4e  ].idxHash, p->zN
20b0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
20d0: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
20e0: 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 4f 6c  1, 0);.  if( pOl
20f0: 64 21 3d 30 20 26 26 20 70 4f 6c 64 21 3d 70 20  d!=0 && pOld!=p 
2100: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61  ){.    sqlite3Ha
2110: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44  shInsert(&db->aD
2120: 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73  b[p->iDb].idxHas
2130: 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c 0a  h, pOld->zName,.
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2150: 20 20 20 20 20 73 74 72 6c 65 6e 28 70 4f 6c 64       strlen(pOld
2160: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c 64  ->zName)+1, pOld
2170: 29 3b 0a 20 20 7d 0a 20 20 66 72 65 65 49 6e 64  );.  }.  freeInd
2180: 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ex(p);.}../*.** 
2190: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
21a0: 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20   index from its 
21b0: 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 6d 6f  table, then remo
21c0: 76 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  ve.** the index 
21d0: 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68  from the index h
21e0: 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72  ash table and fr
21f0: 65 65 20 69 74 73 20 6d 65 6d 6f 72 79 0a 2a 2a  ee its memory.**
2200: 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a   structures..*/.
2210: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
2220: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
2230: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
2240: 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61  t iDb, const cha
2250: 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20  r *zIdxName){.  
2260: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
2270: 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 6c 65 6e   int len;..  len
2280: 20 3d 20 73 74 72 6c 65 6e 28 7a 49 64 78 4e 61   = strlen(zIdxNa
2290: 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  me);.  pIndex = 
22a0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
22b0: 74 28 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t(&db->aDb[iDb].
22c0: 69 64 78 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d  idxHash, zIdxNam
22d0: 65 2c 20 6c 65 6e 2b 31 2c 20 30 29 3b 0a 20 20  e, len+1, 0);.  
22e0: 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
22f0: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54    if( pIndex->pT
2300: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49  able->pIndex==pI
2310: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49  ndex ){.      pI
2320: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
2330: 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70  ndex = pIndex->p
2340: 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
2350: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  .      Index *p;
2360: 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 49 6e  .      for(p=pIn
2370: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
2380: 64 65 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65  dex; p && p->pNe
2390: 78 74 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d  xt!=pIndex; p=p-
23a0: 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 20 20  >pNext){}.      
23b0: 69 66 28 20 70 20 26 26 20 70 2d 3e 70 4e 65 78  if( p && p->pNex
23c0: 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  t==pIndex ){.   
23d0: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
23e0: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
23f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2400: 20 66 72 65 65 49 6e 64 65 78 28 70 49 6e 64 65   freeIndex(pInde
2410: 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c  x);.  }.  db->fl
2420: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
2430: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
2440: 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20  /*.** Erase all 
2450: 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69  schema informati
2460: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d  on from the in-m
2470: 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
2480: 73 20 6f 66 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  s of.** a single
2490: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
24a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
24b0: 65 64 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65  ed to reclaim me
24c0: 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74  mory.** before t
24d0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6c 6f 73  he database clos
24e0: 65 73 2e 20 20 49 74 20 69 73 20 61 6c 73 6f 20  es.  It is also 
24f0: 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 61 20  called during a 
2500: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 74  rollback.** if t
2510: 68 65 72 65 20 77 65 72 65 20 73 63 68 65 6d 61  here were schema
2520: 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20   changes during 
2530: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2540: 6f 72 20 69 66 20 61 0a 2a 2a 20 73 63 68 65 6d  or if a.** schem
2550: 61 2d 63 6f 6f 6b 69 65 20 6d 69 73 6d 61 74 63  a-cookie mismatc
2560: 68 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  h occurs..**.** 
2570: 49 66 20 69 44 62 3c 3d 30 20 74 68 65 6e 20 72  If iDb<=0 then r
2580: 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61  eset the interna
2590: 6c 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73 20  l schema tables 
25a0: 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
25b0: 0a 2a 2a 20 66 69 6c 65 73 2e 20 20 49 66 20 69  .** files.  If i
25c0: 44 62 3e 3d 32 20 74 68 65 6e 20 72 65 73 65 74  Db>=2 then reset
25d0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63   the internal sc
25e0: 68 65 6d 61 20 66 6f 72 20 6f 6e 6c 79 20 74 68  hema for only th
25f0: 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 66 69 6c 65  e.** single file
2600: 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 76   indicated..*/.v
2610: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74  oid sqlite3Reset
2620: 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 73  InternalSchema(s
2630: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
2640: 69 44 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  iDb){.  HashElem
2650: 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20   *pElem;.  Hash 
2660: 74 65 6d 70 31 3b 0a 20 20 48 61 73 68 20 74 65  temp1;.  Hash te
2670: 6d 70 32 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  mp2;.  int i, j;
2680: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ..  assert( iDb>
2690: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
26a0: 62 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  b );.  db->flags
26b0: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 69 74   &= ~SQLITE_Init
26c0: 69 61 6c 69 7a 65 64 3b 0a 20 20 66 6f 72 28 69  ialized;.  for(i
26d0: 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  =iDb; i<db->nDb;
26e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
26f0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
2700: 3b 0a 20 20 20 20 74 65 6d 70 31 20 3d 20 70 44  ;.    temp1 = pD
2710: 62 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 20 20  b->tblHash;.    
2720: 74 65 6d 70 32 20 3d 20 70 44 62 2d 3e 74 72 69  temp2 = pDb->tri
2730: 67 48 61 73 68 3b 0a 20 20 20 20 73 71 6c 69 74  gHash;.    sqlit
2740: 65 33 48 61 73 68 49 6e 69 74 28 26 70 44 62 2d  e3HashInit(&pDb-
2750: 3e 74 72 69 67 48 61 73 68 2c 20 53 51 4c 49 54  >trigHash, SQLIT
2760: 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30  E_HASH_STRING, 0
2770: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61  );.    sqlite3Ha
2780: 73 68 43 6c 65 61 72 28 26 70 44 62 2d 3e 61 46  shClear(&pDb->aF
2790: 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Key);.    sqlite
27a0: 33 48 61 73 68 43 6c 65 61 72 28 26 70 44 62 2d  3HashClear(&pDb-
27b0: 3e 69 64 78 48 61 73 68 29 3b 0a 20 20 20 20 66  >idxHash);.    f
27c0: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
27d0: 61 73 68 46 69 72 73 74 28 26 74 65 6d 70 32 29  ashFirst(&temp2)
27e0: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
27f0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
2800: 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 73 71 6c  lem)){.      sql
2810: 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65  ite3DeleteTrigge
2820: 72 28 28 54 72 69 67 67 65 72 2a 29 73 71 6c 69  r((Trigger*)sqli
2830: 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
2840: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ));.    }.    sq
2850: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
2860: 74 65 6d 70 32 29 3b 0a 20 20 20 20 73 71 6c 69  temp2);.    sqli
2870: 74 65 33 48 61 73 68 49 6e 69 74 28 26 70 44 62  te3HashInit(&pDb
2880: 2d 3e 74 62 6c 48 61 73 68 2c 20 53 51 4c 49 54  ->tblHash, SQLIT
2890: 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30  E_HASH_STRING, 0
28a0: 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d  );.    for(pElem
28b0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
28c0: 28 26 74 65 6d 70 31 29 3b 20 70 45 6c 65 6d 3b  (&temp1); pElem;
28d0: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
28e0: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
28f0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
2900: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
2910: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20  a(pElem);.      
2920: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
2930: 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
2940: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 48    }.    sqlite3H
2950: 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70 31 29  ashClear(&temp1)
2960: 3b 0a 20 20 20 20 70 44 62 2d 3e 70 53 65 71 54  ;.    pDb->pSeqT
2970: 61 62 20 3d 20 30 3b 0a 20 20 20 20 44 62 43 6c  ab = 0;.    DbCl
2980: 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20  earProperty(db, 
2990: 69 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64  i, DB_SchemaLoad
29a0: 65 64 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  ed);.    if( iDb
29b0: 3e 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d  >0 ) return;.  }
29c0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d  .  assert( iDb==
29d0: 30 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  0 );.  db->flags
29e0: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
29f0: 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a  rnChanges;..  /*
2a00: 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   If one or more 
2a10: 6f 66 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  of the auxiliary
2a20: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
2a30: 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c  has been closed,
2a40: 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76  .  ** then remov
2a50: 65 20 74 68 65 6e 20 66 72 6f 6d 20 74 68 65 20  e then from the 
2a60: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
2a70: 73 65 20 6c 69 73 74 2e 20 20 57 65 20 74 61 6b  se list.  We tak
2a80: 65 20 74 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72  e the.  ** oppor
2a90: 74 75 6e 69 74 79 20 74 6f 20 64 6f 20 74 68 69  tunity to do thi
2aa0: 73 20 68 65 72 65 20 73 69 6e 63 65 20 77 65 20  s here since we 
2ab0: 68 61 76 65 20 6a 75 73 74 20 64 65 6c 65 74 65  have just delete
2ac0: 64 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a  d all of the.  *
2ad0: 2a 20 73 63 68 65 6d 61 20 68 61 73 68 20 74 61  * schema hash ta
2ae0: 62 6c 65 73 20 61 6e 64 20 74 68 65 72 65 66 6f  bles and therefo
2af0: 72 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  re do not have t
2b00: 6f 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67  o make any chang
2b10: 65 73 0a 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f  es.  ** to any o
2b20: 66 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a  f those tables..
2b30: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
2b40: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
2b50: 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a  .    struct Db *
2b60: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
2b70: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
2b80: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
2b90: 69 66 28 20 70 44 62 2d 3e 70 41 75 78 20 26 26  if( pDb->pAux &&
2ba0: 20 70 44 62 2d 3e 78 46 72 65 65 41 75 78 20 29   pDb->xFreeAux )
2bb0: 20 70 44 62 2d 3e 78 46 72 65 65 41 75 78 28 70   pDb->xFreeAux(p
2bc0: 44 62 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20  Db->pAux);.     
2bd0: 20 70 44 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a   pDb->pAux = 0;.
2be0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
2bf0: 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62  i=j=2; i<db->nDb
2c00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
2c10: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
2c20: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
2c30: 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b  ( pDb->pBt==0 ){
2c40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
2c50: 65 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  e(pDb->zName);. 
2c60: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20       pDb->zName 
2c70: 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  = 0;.      conti
2c80: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
2c90: 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20  f( j<i ){.      
2ca0: 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d  db->aDb[j] = db-
2cb0: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  >aDb[i];.    }. 
2cc0: 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65     j++;.  }.  me
2cd0: 6d 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d  mset(&db->aDb[j]
2ce0: 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29  , 0, (db->nDb-j)
2cf0: 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b  *sizeof(db->aDb[
2d00: 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20  j]));.  db->nDb 
2d10: 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e  = j;.  if( db->n
2d20: 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62  Db<=2 && db->aDb
2d30: 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20  !=db->aDbStatic 
2d40: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62  ){.    memcpy(db
2d50: 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d  ->aDbStatic, db-
2d60: 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64  >aDb, 2*sizeof(d
2d70: 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20  b->aDb[0]));.   
2d80: 20 73 71 6c 69 74 65 46 72 65 65 28 64 62 2d 3e   sqliteFree(db->
2d90: 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44  aDb);.    db->aD
2da0: 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69  b = db->aDbStati
2db0: 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c;.  }.}../*.** 
2dc0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2dd0: 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20  called whenever 
2de0: 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
2df0: 73 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72  s.  If there wer
2e00: 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 68 61 6e  e.** schema chan
2e10: 67 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74  ges during the t
2e20: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
2e30: 20 77 65 20 68 61 76 65 20 74 6f 20 72 65 73 65   we have to rese
2e40: 74 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61  t the.** interna
2e50: 6c 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  l hash tables an
2e60: 64 20 72 65 6c 6f 61 64 20 74 68 65 6d 20 66 72  d reload them fr
2e70: 6f 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64  om disk..*/.void
2e80: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
2e90: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
2ea0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
2eb0: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
2ec0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
2ed0: 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  nges ){.    sqli
2ee0: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
2ef0: 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20  Schema(db, 0);. 
2f00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
2f10: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2f20: 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74  ed when a commit
2f30: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
2f40: 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
2f50: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
2f60: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62  lite3 *db){.  db
2f70: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
2f80: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
2f90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
2fa0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
2fb0: 73 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 6f  s from a table o
2fc0: 72 20 76 69 65 77 2e 0a 2a 2f 0a 73 74 61 74 69  r view..*/.stati
2fd0: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 52 65 73  c void sqliteRes
2fe0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61  etColumnNames(Ta
2ff0: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
3000: 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20  int i;.  Column 
3010: 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28  *pCol;.  assert(
3020: 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20   pTable!=0 );.  
3030: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(i=0, pCol=pT
3040: 61 62 6c 65 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54  able->aCol; i<pT
3050: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c  able->nCol; i++,
3060: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 71   pCol++){.    sq
3070: 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a  liteFree(pCol->z
3080: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
3090: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 43 6f  e3ExprDelete(pCo
30a0: 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 73  l->pDflt);.    s
30b0: 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e  qliteFree(pCol->
30c0: 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zType);.  }.  sq
30d0: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
30e0: 3e 61 43 6f 6c 29 3b 0a 20 20 70 54 61 62 6c 65  >aCol);.  pTable
30f0: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54  ->aCol = 0;.  pT
3100: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
3110: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
3120: 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20  the memory data 
3130: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
3140: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
3150: 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20  iven.** Table.  
3160: 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
3170: 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74  ade to disk by t
3180: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
3190: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
31a0: 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65  just deletes the
31b0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e   data structure.
31c0: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e    It does not un
31d0: 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c  link.** the tabl
31e0: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
31f0: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
3200: 61 62 6c 65 2e 20 20 4e 6f 72 20 64 6f 65 73 20  able.  Nor does 
3210: 69 74 20 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f 72  it remove.** for
3220: 65 69 67 6e 20 6b 65 79 73 20 66 72 6f 6d 20 74  eign keys from t
3230: 68 65 20 73 71 6c 69 74 65 2e 61 46 4b 65 79 20  he sqlite.aFKey 
3240: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74  hash table.  But
3250: 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79   it does destroy
3260: 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  .** memory struc
3270: 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64  tures of the ind
3280: 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e  ices and foreign
3290: 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64   keys associated
32a0: 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61   with .** the ta
32b0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63  ble..**.** Indic
32c0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
32d0: 74 68 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  th the table are
32e0: 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74   unlinked from t
32f0: 68 65 20 22 64 62 22 0a 2a 2a 20 64 61 74 61 20  he "db".** data 
3300: 73 74 72 75 63 74 75 72 65 20 69 66 20 64 62 21  structure if db!
3310: 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d 3d 4e  =NULL.  If db==N
3320: 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61 74 74  ULL, indices att
3330: 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20  ached to.** the 
3340: 74 61 62 6c 65 20 61 72 65 20 64 65 6c 65 74 65  table are delete
3350: 64 2c 20 62 75 74 20 69 74 20 69 73 20 61 73 73  d, but it is ass
3360: 75 6d 65 64 20 74 68 65 79 20 68 61 76 65 20 61  umed they have a
3370: 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 75  lready been.** u
3380: 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64  nlinked..*/.void
3390: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
33a0: 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ble(sqlite3 *db,
33b0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
33c0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
33d0: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79  , *pNext;.  FKey
33e0: 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46   *pFKey, *pNextF
33f0: 4b 65 79 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  Key;..  if( pTab
3400: 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  le==0 ) return;.
3410: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c  .  /* Delete all
3420: 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
3430: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61  ted with this ta
3440: 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  ble.  */.  for(p
3450: 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e  Index = pTable->
3460: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
3470: 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20  pIndex=pNext){. 
3480: 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65     pNext = pInde
3490: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73  x->pNext;.    as
34a0: 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 69 44  sert( pIndex->iD
34b0: 62 3d 3d 70 54 61 62 6c 65 2d 3e 69 44 62 20 7c  b==pTable->iDb |
34c0: 7c 20 28 70 54 61 62 6c 65 2d 3e 69 44 62 3d 3d  | (pTable->iDb==
34d0: 30 20 26 26 20 70 49 6e 64 65 78 2d 3e 69 44 62  0 && pIndex->iDb
34e0: 3d 3d 31 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ==1) );.    sqli
34f0: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62  teDeleteIndex(db
3500: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a  , pIndex);.  }..
3510: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3520: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
3530: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
3540: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73  foreign keys ass
3550: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
3560: 73 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6b 65  s table.  The ke
3570: 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  ys.  ** should h
3580: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
3590: 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74   unlinked from t
35a0: 68 65 20 64 62 2d 3e 61 46 4b 65 79 20 68 61 73  he db->aFKey has
35b0: 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a 20 20  h table .  */.  
35c0: 66 6f 72 28 70 46 4b 65 79 3d 70 54 61 62 6c 65  for(pFKey=pTable
35d0: 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20  ->pFKey; pFKey; 
35e0: 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79 29  pFKey=pNextFKey)
35f0: 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b 65 79 20  {.    pNextFKey 
3600: 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72  = pFKey->pNextFr
3610: 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  om;.    assert( 
3620: 70 54 61 62 6c 65 2d 3e 69 44 62 3c 64 62 2d 3e  pTable->iDb<db->
3630: 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nDb );.    asser
3640: 74 28 20 73 71 6c 69 74 65 33 48 61 73 68 46 69  t( sqlite3HashFi
3650: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70 54 61 62  nd(&db->aDb[pTab
3660: 6c 65 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 0a  le->iDb].aFKey,.
3670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3680: 20 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79             pFKey
3690: 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46  ->zTo, strlen(pF
36a0: 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46  Key->zTo)+1)!=pF
36b0: 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  Key );.    sqlit
36c0: 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20  eFree(pFKey);.  
36d0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  }.#endif..  /* D
36e0: 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20  elete the Table 
36f0: 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
3700: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 52  ..  */.  sqliteR
3710: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
3720: 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  pTable);.  sqlit
3730: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e  eFree(pTable->zN
3740: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ame);.  sqliteFr
3750: 65 65 28 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41  ee(pTable->zColA
3760: 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ff);.  sqlite3Se
3770: 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61 62 6c  lectDelete(pTabl
3780: 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73  e->pSelect);.  s
3790: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
37a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  );.}../*.** Unli
37b0: 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62  nk the given tab
37c0: 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  le from the hash
37d0: 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20   tables and the 
37e0: 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61  delete the.** ta
37f0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69  ble structure wi
3800: 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63  th all its indic
3810: 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  es and foreign k
3820: 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  eys..*/.void sql
3830: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
3840: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
3850: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
3860: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e  onst char *zTabN
3870: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
3880: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a  ;.  FKey *pF1, *
3890: 70 46 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a  pF2;.  Db *pDb;.
38a0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
38b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44   );.  assert( iD
38c0: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
38d0: 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
38e0: 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 7a 54 61   zTabName && zTa
38f0: 62 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44  bName[0] );.  pD
3900: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
3910: 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ];.  p = sqlite3
3920: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
3930: 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61  >tblHash, zTabNa
3940: 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 54 61 62 4e  me, strlen(zTabN
3950: 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 69 66  ame)+1, 0);.  if
3960: 28 20 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ( p ){.#ifndef S
3970: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
3980: 47 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72 28 70  GN_KEY.    for(p
3990: 46 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31  F1=p->pFKey; pF1
39a0: 3b 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74  ; pF1=pF1->pNext
39b0: 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74  From){.      int
39c0: 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46   nTo = strlen(pF
39d0: 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20  1->zTo) + 1;.   
39e0: 20 20 20 70 46 32 20 3d 20 73 71 6c 69 74 65 33     pF2 = sqlite3
39f0: 48 61 73 68 46 69 6e 64 28 26 70 44 62 2d 3e 61  HashFind(&pDb->a
3a00: 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20  FKey, pF1->zTo, 
3a10: 6e 54 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nTo);.      if( 
3a20: 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20  pF2==pF1 ){.    
3a30: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
3a40: 6e 73 65 72 74 28 26 70 44 62 2d 3e 61 46 4b 65  nsert(&pDb->aFKe
3a50: 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f  y, pF1->zTo, nTo
3a60: 2c 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 29 3b  , pF1->pNextTo);
3a70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3a80: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 32        while( pF2
3a90: 20 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f   && pF2->pNextTo
3aa0: 21 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32  !=pF1 ){ pF2=pF2
3ab0: 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20  ->pNextTo; }.   
3ac0: 20 20 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a       if( pF2 ){.
3ad0: 20 20 20 20 20 20 20 20 20 20 70 46 32 2d 3e 70            pF2->p
3ae0: 4e 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e  NextTo = pF1->pN
3af0: 65 78 74 54 6f 3b 0a 20 20 20 20 20 20 20 20 7d  extTo;.        }
3b00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
3b10: 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
3b20: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
3b30: 20 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66   p);.  }.  db->f
3b40: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
3b50: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
3b60: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74  ./*.** Given a t
3b70: 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73  oken, return a s
3b80: 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69  tring that consi
3b90: 73 74 73 20 6f 66 20 74 68 65 20 74 65 78 74 20  sts of the text 
3ba0: 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e  of that.** token
3bb0: 20 77 69 74 68 20 61 6e 79 20 71 75 6f 74 61 74   with any quotat
3bc0: 69 6f 6e 73 20 72 65 6d 6f 76 65 64 2e 20 20 53  ions removed.  S
3bd0: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
3be0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
3bf0: 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20  .** is obtained 
3c00: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
3c10: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
3c20: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
3c30: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
3c40: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61  ..**.** Tokens a
3c50: 72 65 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 70  re really just p
3c60: 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65  ointers into the
3c70: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65   original SQL te
3c80: 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65  xt and so.** are
3c90: 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e   not \000 termin
3ca0: 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74  ated and are not
3cb0: 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68   persistent.  Th
3cc0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
3cd0: 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72  g.** is \000 ter
3ce0: 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70  minated and is p
3cf0: 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68  ersistent..*/.ch
3d00: 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46  ar *sqlite3NameF
3d10: 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a  romToken(Token *
3d20: 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  pName){.  char *
3d30: 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61  zName;.  if( pNa
3d40: 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
3d50: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
3d60: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
3d70: 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >n);.    sqlite3
3d80: 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a  Dequote(zName);.
3d90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61    }else{.    zNa
3da0: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
3db0: 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f  turn zName;.}../
3dc0: 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71  *.** Open the sq
3dd0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
3de0: 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61  e stored in data
3df0: 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20  base number iDb 
3e00: 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20  for.** writing. 
3e10: 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65  The table is ope
3e20: 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72  ned using cursor
3e30: 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69   0..*/.void sqli
3e40: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
3e50: 6c 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  le(Vdbe *v, int 
3e60: 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  iDb){.  sqlite3V
3e70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
3e80: 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b  nteger, iDb, 0);
3e90: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3ea0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
3eb0: 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52  ite, 0, MASTER_R
3ec0: 4f 4f 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  OOT);.  sqlite3V
3ed0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
3ee0: 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c  etNumColumns, 0,
3ef0: 20 35 29 3b 20 2f 2a 20 73 71 6c 69 74 65 5f 6d   5); /* sqlite_m
3f00: 61 73 74 65 72 20 68 61 73 20 35 20 63 6f 6c 75  aster has 5 colu
3f10: 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mns */.}../*.** 
3f20: 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65  The token *pName
3f30: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61   contains the na
3f40: 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  me of a database
3f50: 20 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20   (either "main" 
3f60: 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20  or.** "temp" or 
3f70: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61  the name of an a
3f80: 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69  ttached db). Thi
3f90: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
3fa0: 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f  s the.** index o
3fb0: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61  f the named data
3fc0: 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b  base in db->aDb[
3fd0: 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20  ], or -1 if the 
3fe0: 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65  named db .** doe
3ff0: 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a  s not exist..*/.
4000: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 44  static int findD
4010: 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  b(sqlite3 *db, T
4020: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
4030: 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 2f  int i = -1;    /
4040: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
4050: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  r */.  int n;   
4060: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4070: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
4080: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 44   the name */.  D
4090: 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 2f 2a  b *pDb;       /*
40a0: 20 41 20 64 61 74 61 62 61 73 65 20 77 68 6f 73   A database whos
40b0: 65 20 6e 61 6d 65 20 73 70 61 63 65 20 69 73 20  e name space is 
40c0: 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 2a  being searched *
40d0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
40e0: 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72     /* Name we ar
40f0: 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  e searching for 
4100: 2a 2f 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71  */..  zName = sq
4110: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
4120: 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  en(pName);.  if(
4130: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 6e 20   zName ){.    n 
4140: 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
4150: 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e  .    for(i=(db->
4160: 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d  nDb-1), pDb=&db-
4170: 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69  >aDb[i]; i>=0; i
4180: 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20  --, pDb--){.    
4190: 20 20 69 66 28 20 6e 3d 3d 73 74 72 6c 65 6e 28    if( n==strlen(
41a0: 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 30  pDb->zName) && 0
41b0: 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
41c0: 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  (pDb->zName, zNa
41d0: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  me) ){.        b
41e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
41f0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
4200: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  ee(zName);.  }. 
4210: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a   return i;.}../*
4220: 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   The table or vi
4230: 65 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61  ew or trigger na
4240: 6d 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  me is passed to 
4250: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61  this routine via
4260: 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65   tokens.** pName
4270: 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66  1 and pName2. If
4280: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
4290: 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  was fully qualif
42a0: 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ied, for example
42b0: 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54  :.**.** CREATE T
42c0: 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e  ABLE xxx.yyy (..
42d0: 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20  .);.** .** Then 
42e0: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
42f0: 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65   "xxx" and pName
4300: 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20  2 "yyy". On the 
4310: 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a  other hand if.**
4320: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
4330: 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61  is not fully qua
4340: 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a  lified, i.e.:.**
4350: 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45  .** CREATE TABLE
4360: 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a   yyy(...);.**.**
4370: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
4380: 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64  set to "yyy" and
4390: 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a   pName2 is ""..*
43a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
43b0: 65 20 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e  e sets the *ppUn
43c0: 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20  qual pointer to 
43d0: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b  point at the tok
43e0: 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a  en (pName1 or.**
43f0: 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74   pName2) that st
4400: 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69  ores the unquali
4410: 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e  fied table name.
4420: 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74    The index of t
4430: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22  he.** database "
4440: 78 78 78 22 20 69 73 20 72 65 74 75 72 6e 65 64  xxx" is returned
4450: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4460: 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50  TwoPartName(.  P
4470: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4480: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
4490: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
44a0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
44b0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
44c0: 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20     /* The "xxx" 
44d0: 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78  in the name "xxx
44e0: 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a  .yyy" or "xxx" *
44f0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
4500: 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  2,      /* The "
4510: 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  yyy" in the name
4520: 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20   "xxx.yyy" */.  
4530: 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20  Token **pUnqual 
4540: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
4550: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a   unqualified obj
4560: 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f  ect name here */
4570: 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  .){.  int iDb;  
4580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4590: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
45a0: 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74  lding the object
45b0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
45c0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
45d0: 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26  .  if( pName2 &&
45e0: 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a   pName2->n>0 ){.
45f0: 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
4600: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
4610: 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61    *pUnqual = pNa
4620: 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 66  me2;.    iDb = f
4630: 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31  indDb(db, pName1
4640: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
4650: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4660: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4670: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62  , "unknown datab
4680: 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29  ase %T", pName1)
4690: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
46a0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65  nErr++;.      re
46b0: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
46c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
46d0: 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  rt( db->init.iDb
46e0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e  ==0 || db->init.
46f0: 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62 20  busy );.    iDb 
4700: 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a  = db->init.iDb;.
4710: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
4720: 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74  Name1;.  }.  ret
4730: 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn iDb;.}../*.*
4740: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4750: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
4760: 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72  if the UTF-8 str
4770: 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c  ing zName is a l
4780: 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66  egal.** unqualif
4790: 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e  ied name for a n
47a0: 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  ew schema object
47b0: 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20   (table, index, 
47c0: 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67  view or.** trigg
47d0: 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61  er). All names a
47e0: 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20  re legal except 
47f0: 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e  those that begin
4800: 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67   with the string
4810: 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69  .** "sqlite_" (i
4820: 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f  n upper, lower o
4830: 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54  r mixed case). T
4840: 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  his portion of t
4850: 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20  he namespace.** 
4860: 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  is reserved for 
4870: 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f  internal use..*/
4880: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
4890: 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73  kObjectName(Pars
48a0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
48b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
48c0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62   if( !pParse->db
48d0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
48e0: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
48f0: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30   .          && 0
4900: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
4910: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
4920: 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71  _", 7) ){.    sq
4930: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
4940: 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61  arse, "object na
4950: 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  me reserved for 
4960: 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73  internal use: %s
4970: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ", zName);.    r
4980: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
4990: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
49a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
49b0: 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74  *.** Begin const
49c0: 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ructing a new ta
49d0: 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
49e0: 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54  on in memory.  T
49f0: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
4a00: 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61  rst of several a
4a10: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74  ction routines t
4a20: 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69  hat get called i
4a30: 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f  n response.** to
4a40: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
4a50: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70  statement.  In p
4a60: 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20  articular, this 
4a70: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
4a80: 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e  d.** after seein
4a90: 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45  g tokens "CREATE
4aa0: 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e  " and "TABLE" an
4ab0: 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  d the table name
4ac0: 2e 20 20 54 68 65 0a 2a 2a 20 70 53 74 61 72 74  .  The.** pStart
4ad0: 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 43 52   token is the CR
4ae0: 45 41 54 45 20 61 6e 64 20 70 4e 61 6d 65 20 69  EATE and pName i
4af0: 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  s the table name
4b00: 2e 20 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a  .  The isTemp.**
4b10: 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66   flag is true if
4b20: 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c   the table shoul
4b30: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
4b40: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
4b50: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e  abase.** file in
4b60: 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20  stead of in the 
4b70: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
4b80: 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  le.  This is nor
4b90: 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a  mally the case.*
4ba0: 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50  * when the "TEMP
4bb0: 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22  " or "TEMPORARY"
4bc0: 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20   keyword occurs 
4bd0: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52  in between.** CR
4be0: 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a  EATE and TABLE..
4bf0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61  **.** The new ta
4c00: 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e  ble record is in
4c10: 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75  itialized and pu
4c20: 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65  t in pParse->pNe
4c30: 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f  wTable..** As mo
4c40: 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  re of the CREATE
4c50: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
4c60: 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69   is parsed, addi
4c70: 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a  tional action.**
4c80: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62   routines will b
4c90: 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20  e called to add 
4ca0: 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
4cb0: 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e   to this record.
4cc0: 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
4cd0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
4ce0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  LE statement, th
4cf0: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
4d00: 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  e() routine.** i
4d10: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70  s called to comp
4d20: 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75  lete the constru
4d30: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77  ction of the new
4d40: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a   table record..*
4d50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74  /.void sqlite3St
4d60: 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73  artTable(.  Pars
4d70: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
4d80: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
4d90: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72  /.  Token *pStar
4da0: 74 2c 20 20 20 2f 2a 20 54 68 65 20 22 43 52 45  t,   /* The "CRE
4db0: 41 54 45 22 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  ATE" token */.  
4dc0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
4dd0: 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
4de0: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
4df0: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
4e00: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
4e10: 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  e2,   /* Second 
4e20: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65  part of the name
4e30: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
4e40: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
4e50: 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54  sTemp,      /* T
4e60: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
4e70: 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20   TEMP table */. 
4e80: 20 69 6e 74 20 69 73 56 69 65 77 20 20 20 20 20   int isView     
4e90: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
4ea0: 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 29  s is a VIEW */.)
4eb0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  {.  Table *pTabl
4ec0: 65 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  e;.  Index *pIdx
4ed0: 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  ;.  char *zName 
4ee0: 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65  = 0; /* The name
4ef0: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
4f00: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
4f10: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
4f20: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
4f30: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f  t iDb;         /
4f40: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
4f50: 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20  r to create the 
4f60: 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f  table in */.  To
4f70: 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f  ken *pName;    /
4f80: 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61  * Unqualified na
4f90: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
4fa0: 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20  to create */..  
4fb0: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20  /* The table or 
4fc0: 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65  view name to cre
4fd0: 61 74 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  ate is passed to
4fe0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69   this routine vi
4ff0: 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e  a tokens.  ** pN
5000: 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e  ame1 and pName2.
5010: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61   If the table na
5020: 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61  me was fully qua
5030: 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d  lified, for exam
5040: 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  ple:.  **.  ** C
5050: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
5060: 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20  yyy (...);.  ** 
5070: 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  .  ** Then pName
5080: 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78  1 is set to "xxx
5090: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79  " and pName2 "yy
50a0: 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  y". On the other
50b0: 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68   hand if.  ** th
50c0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20  e table name is 
50d0: 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  not fully qualif
50e0: 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a  ied, i.e.:.  **.
50f0: 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
5100: 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a  E yyy(...);.  **
5110: 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  .  ** Then pName
5120: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
5130: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
5140: 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ""..  **.  ** Th
5150: 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74  e call below set
5160: 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e  s the pName poin
5170: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
5180: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
5190: 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32  1 or.  ** pName2
51a0: 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  ) that stores th
51b0: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61  e unqualified ta
51c0: 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61  ble name. The va
51d0: 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20  riable iDb is.  
51e0: 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  ** set to the in
51f0: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
5200: 61 73 65 20 74 68 61 74 20 74 68 65 20 74 61 62  ase that the tab
5210: 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f  le or view is to
5220: 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64   be.  ** created
5230: 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20   in..  */.  iDb 
5240: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
5250: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
5260: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
5270: 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  ame);.  if( iDb<
5280: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
5290: 28 20 69 73 54 65 6d 70 20 26 26 20 69 44 62 3e  ( isTemp && iDb>
52a0: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63  1 ){.    /* If c
52b0: 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74  reating a temp t
52c0: 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d  able, the name m
52d0: 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66  ay not be qualif
52e0: 69 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ied */.    sqlit
52f0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5300: 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61  e, "temporary ta
5310: 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  ble name must be
5320: 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a   unqualified");.
5330: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
5340: 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 20 69    if( isTemp ) i
5350: 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73  Db = 1;..  pPars
5360: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20  e->sNameToken = 
5370: 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20  *pName;.  zName 
5380: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
5390: 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
53a0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
53b0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51  return;.  if( SQ
53c0: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
53d0: 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
53e0: 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29  pParse, zName) )
53f0: 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  {.    goto begin
5400: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
5410: 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  }.  if( db->init
5420: 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70  .iDb==1 ) isTemp
5430: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
5440: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
5450: 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74  IZATION.  assert
5460: 28 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d  ( (isTemp & 1)==
5470: 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20  isTemp );.  {.  
5480: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
5490: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
54a0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
54b0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
54c0: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
54d0: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
54e0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54  SCHEMA_TABLE(isT
54f0: 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  emp), 0, zDb) ){
5500: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
5510: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
5520: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56     }.    if( isV
5530: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  iew ){.      if(
5540: 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20   isTemp ){.     
5550: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
5560: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45  _CREATE_TEMP_VIE
5570: 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  W;.      }else{.
5580: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
5590: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45  QLITE_CREATE_VIE
55a0: 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  W;.      }.    }
55b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
55c0: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
55d0: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
55e0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
55f0: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
5600: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
5610: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
5620: 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LE;.      }.    
5630: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
5640: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
5650: 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20  e, code, zName, 
5660: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
5670: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
5680: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
5690: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
56a0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
56b0: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
56c0: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
56d0: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
56e0: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
56f0: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
5700: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
5710: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
5720: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
5730: 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   does..  */.  if
5740: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
5750: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
5760: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f  Parse) ){.    go
5770: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
5780: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rror;.  }.  pTab
5790: 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  le = sqlite3Find
57a0: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
57b0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
57c0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ame);.  if( pTab
57d0: 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  le ){.    sqlite
57e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
57f0: 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65  , "table %T alre
5800: 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61  ady exists", pNa
5810: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65  me);.    goto be
5820: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
5830: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 49 64 78  .  }.  if( (pIdx
5840: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
5850: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  dex(db, zName, 0
5860: 29 29 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20  ))!=0 && .      
5870: 28 20 69 44 62 3d 3d 30 20 7c 7c 20 21 64 62 2d  ( iDb==0 || !db-
5880: 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20  >init.busy) ){. 
5890: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
58a0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
58b0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
58c0: 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c  index named %s",
58d0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74   zName);.    got
58e0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
58f0: 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  ror;.  }.  pTabl
5900: 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  e = sqliteMalloc
5910: 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  ( sizeof(Table) 
5920: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
5930: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  =0 ){.    pParse
5940: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
5950: 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  MEM;.    pParse-
5960: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
5970: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
5980: 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  ror;.  }.  pTabl
5990: 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  e->zName = zName
59a0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ;.  pTable->nCol
59b0: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
59c0: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  aCol = 0;.  pTab
59d0: 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  le->iPKey = -1;.
59e0: 20 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78    pTable->pIndex
59f0: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
5a00: 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 69 66 28  iDb = iDb;.  if(
5a10: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
5a20: 6c 65 20 29 20 73 71 6c 69 74 65 33 44 65 6c 65  le ) sqlite3Dele
5a30: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 50 61 72  teTable(db, pPar
5a40: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a  se->pNewTable);.
5a50: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
5a60: 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20  ble = pTable;.. 
5a70: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
5a80: 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f  he magic sqlite_
5a90: 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75  sequence table u
5aa0: 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65  sed by autoincre
5ab0: 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  ment,.  ** then 
5ac0: 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72  record a pointer
5ad0: 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69   to this table i
5ae0: 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
5af0: 61 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  ase structure.  
5b00: 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52  ** so that INSER
5b10: 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74  T can find the t
5b20: 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a  able easily..  *
5b30: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
5b40: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
5b50: 45 4e 54 0a 20 20 69 66 28 20 73 74 72 63 6d 70  ENT.  if( strcmp
5b60: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
5b70: 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b  sequence")==0 ){
5b80: 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62  .    db->aDb[iDb
5b90: 5d 2e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62  ].pSeqTab = pTab
5ba0: 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  le;.  }.#endif..
5bb0: 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
5bc0: 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74  ating the code t
5bd0: 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20  hat will insert 
5be0: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
5bf0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53   into.  ** the S
5c00: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
5c10: 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72  le.  Note in par
5c20: 74 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20  ticular that we 
5c30: 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20  must go ahead.  
5c40: 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  ** and allocate 
5c50: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
5c60: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
5c70: 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f  entry now.  Befo
5c80: 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d  re any.  ** PRIM
5c90: 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
5ca0: 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70  E keywords are p
5cb0: 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65  arsed.  Those ke
5cc0: 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73  ywords will caus
5cd0: 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74  e.  ** indices t
5ce0: 6f 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64  o be created and
5cf0: 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72   the table recor
5d00: 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f  d must come befo
5d10: 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64  re the .  ** ind
5d20: 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68  ices.  Hence, th
5d30: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
5d40: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75  for the table mu
5d50: 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a  st be allocated.
5d60: 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20    ** now..  */. 
5d70: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
5d80: 75 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69  usy && (v = sqli
5d90: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
5da0: 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  e))!=0 ){.    sq
5db0: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
5dc0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
5dd0: 20 30 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f   0, iDb);..    /
5de0: 2a 20 45 76 65 72 79 20 74 69 6d 65 20 61 20 6e  * Every time a n
5df0: 65 77 20 74 61 62 6c 65 20 69 73 20 63 72 65 61  ew table is crea
5e00: 74 65 64 20 74 68 65 20 66 69 6c 65 2d 66 6f 72  ted the file-for
5e10: 6d 61 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65  mat.    ** and e
5e20: 6e 63 6f 64 69 6e 67 20 6d 65 74 61 2d 76 61 6c  ncoding meta-val
5e30: 75 65 73 20 61 72 65 20 73 65 74 20 69 6e 20 74  ues are set in t
5e40: 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 6e 0a  he database, in.
5e50: 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73      ** case this
5e60: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 61   is the first ta
5e70: 62 6c 65 20 63 72 65 61 74 65 64 2e 0a 20 20 20  ble created..   
5e80: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
5e90: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
5ea0: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 66 69 6c 65  nteger, db->file
5eb0: 5f 66 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20  _format, 0);.   
5ec0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5ed0: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
5ee0: 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20  e, iDb, 1);.    
5ef0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5f00: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
5f10: 64 62 2d 3e 65 6e 63 2c 20 30 29 3b 0a 20 20 20  db->enc, 0);.   
5f20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5f30: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
5f40: 65 2c 20 69 44 62 2c 20 34 29 3b 0a 0a 20 20 20  e, iDb, 4);..   
5f50: 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72   /* This just cr
5f60: 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f  eates a place-ho
5f70: 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74  lder record in t
5f80: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
5f90: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54   table..    ** T
5fa0: 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65  he record create
5fb0: 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  d does not conta
5fc0: 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e  in anything yet.
5fd0: 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70    It will be rep
5fe0: 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  laced.    ** by 
5ff0: 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69  the real entry i
6000: 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  n code generated
6010: 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61   at sqlite3EndTa
6020: 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ble()..    **.  
6030: 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66    ** The rowid f
6040: 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  or the new entry
6050: 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20   is left on the 
6060: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
6070: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77  ..    ** The row
6080: 69 64 20 76 61 6c 75 65 20 69 73 20 6e 65 65 64  id value is need
6090: 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 74  ed by the code t
60a0: 68 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61  hat sqlite3EndTa
60b0: 62 6c 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ble will.    ** 
60c0: 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f  generate..    */
60d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
60e0: 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 69 66  OMIT_VIEW.    if
60f0: 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20  ( isView ){.    
6100: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6110: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
6120: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  , 0, 0);.    }el
6130: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
6140: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6150: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65  eAddOp(v, OP_Cre
6160: 61 74 65 54 61 62 6c 65 2c 20 69 44 62 2c 20 30  ateTable, iDb, 0
6170: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
6180: 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61  ite3OpenMasterTa
6190: 62 6c 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20  ble(v, iDb);.   
61a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
61b0: 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f  p(v, OP_NewRecno
61c0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
61d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
61e0: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
61f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6200: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
6210: 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  g8, 0, 0);.    s
6220: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6230: 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c  v, OP_PutIntKey,
6240: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
6250: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6260: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
6270: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6280: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
6290: 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 1, 0);.  }..  
62a0: 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65  /* Normal (non-e
62b0: 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f  rror) return. */
62c0: 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a  .  return;..  /*
62d0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
62e0: 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72  urs, we jump her
62f0: 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65  e */.begin_table
6300: 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65  _error:.  sqlite
6310: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72  Free(zName);.  r
6320: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
6330: 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73  This macro is us
6340: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77  ed to compare tw
6350: 6f 20 73 74 72 69 6e 67 73 20 69 6e 20 61 20 63  o strings in a c
6360: 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20  ase-insensitive 
6370: 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73  manner..** It is
6380: 20 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72   slightly faster
6390: 20 74 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71   than calling sq
63a0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 29 20 64  lite3StrICmp() d
63b0: 69 72 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20  irectly, but.** 
63c0: 70 72 6f 64 75 63 65 73 20 6c 61 72 67 65 72 20  produces larger 
63d0: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e  code..**.** WARN
63e0: 49 4e 47 3a 20 54 68 69 73 20 6d 61 63 72 6f 20  ING: This macro 
63f0: 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c  is not compatibl
6400: 65 20 77 69 74 68 20 74 68 65 20 73 74 72 63 6d  e with the strcm
6410: 70 28 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a  p() family. It.*
6420: 2a 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69  * returns true i
6430: 66 20 74 68 65 20 74 77 6f 20 73 74 72 69 6e 67  f the two string
6440: 73 20 61 72 65 20 65 71 75 61 6c 2c 20 6f 74 68  s are equal, oth
6450: 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f  erwise false..*/
6460: 0a 23 64 65 66 69 6e 65 20 53 54 52 49 43 4d 50  .#define STRICMP
6470: 28 78 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74 65  (x, y) (\.sqlite
6480: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28  3UpperToLower[*(
6490: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
64a0: 28 78 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74  (x)]==   \.sqlit
64b0: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  e3UpperToLower[*
64c0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
64d0: 29 28 79 29 5d 20 20 20 20 20 5c 0a 26 26 20 73  )(y)]     \.&& s
64e0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 28 78  qlite3StrICmp((x
64f0: 29 2b 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a  )+1,(y)+1)==0 ).
6500: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
6510: 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74   column to the t
6520: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62  able currently b
6530: 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
6540: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  ..**.** The pars
6550: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
6560: 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65  utine once for e
6570: 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61  ach column decla
6580: 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43  ration.** in a C
6590: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
65a0: 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53  ement.  sqlite3S
65b0: 74 61 72 74 54 61 62 6c 65 28 29 20 67 65 74 73  tartTable() gets
65c0: 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74   called.** first
65d0: 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67   to get things g
65e0: 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73  oing.  Then this
65f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
6600: 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63  ed for each.** c
6610: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  olumn..*/.void s
6620: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28  qlite3AddColumn(
6630: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
6640: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
6650: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
6660: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
6670: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
6680: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
6690: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
66a0: 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73   return;.  z = s
66b0: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
66c0: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66  ken(pName);.  if
66d0: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
66e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
66f0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
6700: 20 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20   if( STRICMP(z, 
6710: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
6720: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
6730: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6740: 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f  e, "duplicate co
6750: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20  lumn name: %s", 
6760: 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
6770: 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72  Free(z);.      r
6780: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
6790: 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20  .  if( (p->nCol 
67a0: 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20  & 0x7)==0 ){.   
67b0: 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20   Column *aNew;. 
67c0: 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65     aNew = sqlite
67d0: 52 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c  Realloc( p->aCol
67e0: 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69  , (p->nCol+8)*si
67f0: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
6800: 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d  );.    if( aNew=
6810: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
6820: 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b   p->aCol = aNew;
6830: 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70  .  }.  pCol = &p
6840: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b  ->aCol[p->nCol];
6850: 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20  .  memset(pCol, 
6860: 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  0, sizeof(p->aCo
6870: 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e  l[0]));.  pCol->
6880: 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f  zName = z;. .  /
6890: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
68a0: 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c   type specified,
68b0: 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68   columns have th
68c0: 65 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69  e default affini
68d0: 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20  ty.  ** 'NONE'. 
68e0: 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74 79  If there is a ty
68f0: 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 74 68  pe specified, th
6900: 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  en sqlite3AddCol
6910: 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20  umnType() will. 
6920: 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65   ** be called ne
6930: 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e  xt to set pCol->
6940: 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74  affinity correct
6950: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d  ly..  */.  pCol-
6960: 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49  >affinity = SQLI
6970: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70  TE_AFF_NONE;.  p
6980: 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50 61  Col->pColl = pPa
6990: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
69a0: 6c 6c 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b  ll;.  p->nCol++;
69b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
69c0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
69d0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
69e0: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
69f0: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
6a00: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
6a10: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e  statement.  A "N
6a20: 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
6a30: 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  int has.** been 
6a40: 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  seen on a column
6a50: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
6a60: 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c  sets the notNull
6a70: 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20   flag on.** the 
6a80: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
6a90: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
6aa0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
6ab0: 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50  ite3AddNotNull(P
6ac0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
6ad0: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61  t onError){.  Ta
6ae0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
6af0: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
6b00: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
6b10: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
6b20: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69  = p->nCol-1;.  i
6b30: 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f  f( i>=0 ) p->aCo
6b40: 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f  l[i].notNull = o
6b50: 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nError;.}../*.**
6b60: 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e   Scan the column
6b70: 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65   type name zType
6b80: 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20   (length nType) 
6b90: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a  and return the.*
6ba0: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66  * associated aff
6bb0: 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a  inity type..**.*
6bc0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
6bd0: 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65 70  oes a case-indep
6be0: 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f 66  endent search of
6bf0: 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 0a   zType for the .
6c00: 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e  ** substrings in
6c10: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
6c20: 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20  able. If one of 
6c30: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69  the substrings i
6c40: 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20  s.** found, the 
6c50: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 66  corresponding af
6c60: 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72 6e  finity is return
6c70: 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f 6e  ed. If zType con
6c80: 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68  tains.** more th
6c90: 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  an one of the su
6ca0: 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69 65  bstrings, entrie
6cb0: 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f 70  s toward the top
6cc0: 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c   of .** the tabl
6cd0: 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79 2e  e take priority.
6ce0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
6cf0: 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42 49   zType is 'BLOBI
6d00: 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  NT', .** SQLITE_
6d10: 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20 72  AFF_INTEGER is r
6d20: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  eturned..**.** S
6d30: 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20 41  ubstring     | A
6d40: 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d  ffinity.** -----
6d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27  -----------.** '
6d70: 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20 53  INT'         | S
6d80: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
6d90: 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20 20  R.** 'CHAR'     
6da0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
6db0: 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20  TEXT.** 'CLOB'  
6dc0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
6dd0: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58 54  FF_TEXT.** 'TEXT
6de0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
6df0: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42  E_AFF_TEXT.** 'B
6e00: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
6e10: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a  LITE_AFF_NONE.**
6e20: 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74  .** If none of t
6e30: 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e  he substrings in
6e40: 20 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65   the above table
6e50: 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53   are found,.** S
6e60: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
6e70: 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  C is returned..*
6e80: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 73 71  /.static char sq
6e90: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
6ea0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  e(const char *zT
6eb0: 79 70 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b  ype, int nType){
6ec0: 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20  .  u32 h = 0;.  
6ed0: 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54  char aff = SQLIT
6ee0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
6ef0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
6f00: 63 68 61 72 20 2a 7a 49 6e 20 3d 20 7a 54 79 70  char *zIn = zTyp
6f10: 65 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  e;.  const unsig
6f20: 6e 65 64 20 63 68 61 72 20 2a 7a 45 6e 64 20 3d  ned char *zEnd =
6f30: 20 28 7a 49 6e 2b 6e 54 79 70 65 29 3b 0a 0a 20   (zIn+nType);.. 
6f40: 20 77 68 69 6c 65 28 20 7a 49 6e 21 3d 7a 45 6e   while( zIn!=zEn
6f50: 64 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c  d ){.    h = (h<
6f60: 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70  <8) + sqlite3Upp
6f70: 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 49 6e 5d 3b  erToLower[*zIn];
6f80: 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20  .    zIn++;.    
6f90: 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34  if( h==(('c'<<24
6fa0: 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27  )+('h'<<16)+('a'
6fb0: 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20  <<8)+'r') ){    
6fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52           /* CHAR
6fd0: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
6fe0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
6ff0: 20 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20   .    }else if( 
7000: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
7010: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
7020: 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'b') ){       /
7030: 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * CLOB */.      
7040: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
7050: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
7060: 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32   if( h==(('t'<<2
7070: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78  4)+('e'<<16)+('x
7080: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
7090: 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20      /* TEXT */. 
70a0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
70b0: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
70c0: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
70d0: 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  b'<<24)+('l'<<16
70e0: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20  )+('o'<<8)+'b') 
70f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42           /* BLOB
7100: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
7110: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
7120: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
7130: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
7140: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 65 6c 73 65  _NONE;.    }else
7150: 20 69 66 28 20 28 68 26 30 78 30 30 46 46 46 46   if( (h&0x00FFFF
7160: 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b  FF)==(('i'<<16)+
7170: 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('n'<<8)+'t') ){
7180: 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20      /* INT */.  
7190: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
71a0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 20 0a 20  _AFF_INTEGER; . 
71b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
71c0: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
71d0: 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  aff;.}../*.** Th
71e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
71f0: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
7200: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
7210: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
7220: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
7230: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
7240: 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e  The pFirst token
7250: 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   is the first.**
7260: 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65   token in the se
7270: 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73  quence of tokens
7280: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74   that describe t
7290: 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a  he type of the.*
72a0: 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  * column current
72b0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
72c0: 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69  ction.   pLast i
72d0: 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e  s the last token
72e0: 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65  .** in the seque
72f0: 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69  nce.  Use this i
7300: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f  nformation to co
7310: 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67  nstruct a string
7320: 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  .** that contain
7330: 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f  s the typename o
7340: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64  f the column and
7350: 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69   store that stri
7360: 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a  ng.** in zType..
7370: 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */ .void sqlite3
7380: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61  AddColumnType(Pa
7390: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
73a0: 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65  en *pFirst, Toke
73b0: 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20 54 61 62  n *pLast){.  Tab
73c0: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 2c 20  le *p;.  int i, 
73d0: 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68  j;.  int n;.  ch
73e0: 61 72 20 2a 7a 3b 0a 20 20 63 6f 6e 73 74 20 75  ar *z;.  const u
73f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
7400: 6e 3b 0a 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  n;..  Column *pC
7410: 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  ol;.  if( (p = p
7420: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
7430: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
7440: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
7450: 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75    if( i<0 ) retu
7460: 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d  rn;.  pCol = &p-
7470: 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 7a 49 6e 20  >aCol[i];.  zIn 
7480: 3d 20 70 46 69 72 73 74 2d 3e 7a 3b 0a 20 20 6e  = pFirst->z;.  n
7490: 20 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b 20 28 70   = pLast->n + (p
74a0: 4c 61 73 74 2d 3e 7a 20 2d 20 7a 49 6e 29 3b 0a  Last->z - zIn);.
74b0: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
74c0: 7a 54 79 70 65 3d 3d 30 20 29 3b 0a 20 20 7a 20  zType==0 );.  z 
74d0: 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20  = pCol->zType = 
74e0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
74f0: 6e 2b 31 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  n+1);.  if( z==0
7500: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
7510: 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  (i=j=0; i<n; i++
7520: 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 7a  ){.    int c = z
7530: 49 6e 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 69  In[i];.    if( i
7540: 73 73 70 61 63 65 28 63 29 20 29 20 63 6f 6e 74  sspace(c) ) cont
7550: 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d  inue;.    z[j++]
7560: 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d   = c;.  }.  z[j]
7570: 20 3d 20 30 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66   = 0;.  pCol->af
7580: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
7590: 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a 2c 20  AffinityType(z, 
75a0: 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  n);.}../*.** The
75b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
75c0: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
75d0: 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
75e0: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
75f0: 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61  umn.** of the ta
7600: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
7610: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
7620: 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20  ..**.** Default 
7630: 76 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e  value expression
7640: 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61  s must be consta
7650: 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78  nt.  Raise an ex
7660: 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a  ception if this.
7670: 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  ** is not the ca
7680: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
7690: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
76a0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
76b0: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
76c0: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
76d0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
76e0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
76f0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66  id sqlite3AddDef
7700: 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20  aultValue(Parse 
7710: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
7720: 45 78 70 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Expr){.  Table *
7730: 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  p;.  Column *pCo
7740: 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  l;.  if( (p = pP
7750: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
7760: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7770: 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c  pCol = &(p->aCol
7780: 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20  [p->nCol-1]);.  
7790: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
77a0: 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72  IsConstant(pExpr
77b0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
77c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
77d0: 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20   "default value 
77e0: 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69  of column [%s] i
77f0: 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c  s not constant",
7800: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a  .        pCol->z
7810: 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Name);.  }else{.
7820: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
7830: 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66 6c  elete(pCol->pDfl
7840: 74 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 70 44  t);.    pCol->pD
7850: 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  flt = sqlite3Exp
7860: 72 44 75 70 28 70 45 78 70 72 29 3b 0a 20 20 7d  rDup(pExpr);.  }
7870: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
7880: 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 7d 0a 0a  lete(pExpr);.}..
7890: 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20  /*.** Designate 
78a0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
78b0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20  for the table.  
78c0: 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
78d0: 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  of names .** of 
78e0: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72  columns that for
78f0: 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  m the primary ke
7900: 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20  y.  If pList is 
7910: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a  NULL, then the.*
7920: 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  * most recently 
7930: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20  added column of 
7940: 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65  the table is the
7950: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a   primary key..**
7960: 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20  .** A table can 
7970: 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65  have at most one
7980: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
7990: 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
79a0: 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69  ady has.** a pri
79b0: 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68  mary key (and th
79c0: 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
79d0: 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68   primary key) th
79e0: 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20  en create an.** 
79f0: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
7a00: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
7a10: 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63  is on a single c
7a20: 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61  olumn whose data
7a30: 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c  type is INTEGER,
7a40: 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  .** then we will
7a50: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74   try to use that
7a60: 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72   column as the r
7a70: 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65 20 54  owid.  Set the T
7a80: 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69  able.iPKey.** fi
7a90: 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65  eld of the table
7aa0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
7ab0: 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e  ion to be the in
7ac0: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e  dex of the.** IN
7ad0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
7ae0: 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65  Y column.  Table
7af0: 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f  .iPKey is set to
7b00: 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a   -1 if there is.
7b10: 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52  ** no INTEGER PR
7b20: 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a  IMARY KEY..**.**
7b30: 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e   If the key is n
7b40: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
7b50: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
7b60: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a  create a unique.
7b70: 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65  ** index for the
7b80: 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20   key.  No index 
7b90: 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49  is created for I
7ba0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
7bb0: 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  EYs..*/.void sql
7bc0: 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65  ite3AddPrimaryKe
7bd0: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
7be0: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
7bf0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
7c00: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
7c10: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c   /* List of fiel
7c20: 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e  d names to be in
7c30: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
7c40: 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
7c50: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
7c60: 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e  a uniqueness con
7c70: 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61  flict */.  int a
7c80: 75 74 6f 49 6e 63 20 20 20 20 20 20 20 2f 2a 20  utoInc       /* 
7c90: 54 72 75 65 20 69 66 20 74 68 65 20 41 55 54 4f  True if the AUTO
7ca0: 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72  INCREMENT keywor
7cb0: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
7cc0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
7cd0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
7ce0: 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54  able;.  char *zT
7cf0: 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ype = 0;.  int i
7d00: 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69  Col = -1, i;.  i
7d10: 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74  f( pTab==0 ) got
7d20: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
7d30: 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  it;.  if( pTab->
7d40: 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20  hasPrimKey ){.  
7d50: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7d60: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
7d70: 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68   "table \"%s\" h
7d80: 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
7d90: 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70   primary key", p
7da0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
7db0: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
7dc0: 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54  y_exit;.  }.  pT
7dd0: 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d  ab->hasPrimKey =
7de0: 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   1;.  if( pList=
7df0: 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  =0 ){.    iCol =
7e00: 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b   pTab->nCol - 1;
7e10: 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  .    pTab->aCol[
7e20: 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20  iCol].isPrimKey 
7e30: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
7e40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
7e50: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
7e60: 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d  .      for(iCol=
7e70: 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  0; iCol<pTab->nC
7e80: 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
7e90: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
7ea0: 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61  StrICmp(pList->a
7eb0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  [i].zName, pTab-
7ec0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
7ed0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
7ee0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7ef0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
7f00: 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d    if( iCol<pTab-
7f10: 3e 6e 43 6f 6c 20 29 20 70 54 61 62 2d 3e 61 43  >nCol ) pTab->aC
7f20: 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b  ol[iCol].isPrimK
7f30: 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ey = 1;.    }.  
7f40: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78    if( pList->nEx
7f50: 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31  pr>1 ) iCol = -1
7f60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  ;.  }.  if( iCol
7f70: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
7f80: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54  ->nCol ){.    zT
7f90: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
7fa0: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
7fb0: 7d 0a 20 20 69 66 28 20 7a 54 79 70 65 20 26 26  }.  if( zType &&
7fc0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
7fd0: 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22  zType, "INTEGER"
7fe0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 62  )==0 ){.    pTab
7ff0: 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a  ->iPKey = iCol;.
8000: 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e      pTab->keyCon
8010: 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 20  f = onError;.   
8020: 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63 20 3d   pTab->autoInc =
8030: 20 61 75 74 6f 49 6e 63 3b 0a 20 20 7d 65 6c 73   autoInc;.  }els
8040: 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b  e if( autoInc ){
8050: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8060: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
8070: 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  NT.    sqlite3Er
8080: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8090: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73  AUTOINCREMENT is
80a0: 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e   only allowed on
80b0: 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e   an ".       "IN
80c0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
80d0: 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  Y");.#endif.  }e
80e0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
80f0: 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72  CreateIndex(pPar
8100: 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69  se, 0, 0, 0, pLi
8110: 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20  st, onError, 0, 
8120: 30 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  0);.    pList = 
8130: 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f  0;.  }..primary_
8140: 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  key_exit:.  sqli
8150: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
8160: 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  e(pList);.  retu
8170: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rn;.}../*.** Set
8180: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
8190: 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  unction of the m
81a0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72  ost recently par
81b0: 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  sed table column
81c0: 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53  .** to the CollS
81d0: 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69  eq given..*/.voi
81e0: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c  d sqlite3AddColl
81f0: 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70  ateType(Parse *p
8200: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
8210: 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54  r *zType, int nT
8220: 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ype){.  Table *p
8230: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
8240: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
8250: 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  l;.  int i;..  i
8260: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
8270: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
8280: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
8290: 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20 20 70 43 6f 6c  >nCol-1;..  pCol
82a0: 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  l = sqlite3Locat
82b0: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
82c0: 20 7a 54 79 70 65 2c 20 6e 54 79 70 65 29 3b 0a   zType, nType);.
82d0: 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 43 6f    p->aCol[i].pCo
82e0: 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 0a 20 20 2f  ll = pColl;..  /
82f0: 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
8300: 69 73 20 64 65 63 6c 61 72 65 64 20 61 73 20 22  is declared as "
8310: 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b  <name> PRIMARY K
8320: 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65  EY COLLATE <type
8330: 3e 22 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 61 6e  >",.  ** then an
8340: 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20   index may have 
8350: 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20  been created on 
8360: 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f  this column befo
8370: 72 65 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 6c  re the.  ** coll
8380: 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61  ation type was a
8390: 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68  dded. Correct th
83a0: 69 73 20 69 66 20 69 74 20 69 73 20 74 68 65 20  is if it is the 
83b0: 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  case..  */.  for
83c0: 28 70 49 64 78 20 3d 20 70 2d 3e 70 49 6e 64 65  (pIdx = p->pInde
83d0: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
83e0: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
83f0: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
8400: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
8410: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
8420: 6d 6e 5b 30 5d 3d 3d 69 20 29 20 70 49 64 78 2d  mn[0]==i ) pIdx-
8430: 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30  >keyInfo.aColl[0
8440: 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 7d  ] = pColl;.  }.}
8450: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 61  ../*.** Locate a
8460: 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 6e 74  nd return an ent
8470: 72 79 20 66 72 6f 6d 20 74 68 65 20 64 62 2e 61  ry from the db.a
8480: 43 6f 6c 6c 53 65 71 20 68 61 73 68 20 74 61 62  CollSeq hash tab
8490: 6c 65 2e 20 49 66 20 74 68 65 20 65 6e 74 72 79  le. If the entry
84a0: 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
84b0: 20 7a 4e 61 6d 65 20 61 6e 64 20 6e 4e 61 6d 65   zName and nName
84c0: 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e   is not found an
84d0: 64 20 70 61 72 61 6d 65 74 65 72 20 27 63 72 65  d parameter 'cre
84e0: 61 74 65 27 20 69 73 0a 2a 2a 20 74 72 75 65 2c  ate' is.** true,
84f0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
8500: 65 77 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77  ew entry. Otherw
8510: 69 73 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  ise return NULL.
8520: 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 70 6f 69 6e  .**.** Each poin
8530: 74 65 72 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ter stored in th
8540: 65 20 73 71 6c 69 74 65 33 2e 61 43 6f 6c 6c 53  e sqlite3.aCollS
8550: 65 71 20 68 61 73 68 20 74 61 62 6c 65 20 63 6f  eq hash table co
8560: 6e 74 61 69 6e 73 20 61 6e 0a 2a 2a 20 61 72 72  ntains an.** arr
8570: 61 79 20 6f 66 20 74 68 72 65 65 20 43 6f 6c 6c  ay of three Coll
8580: 53 65 71 20 73 74 72 75 63 74 75 72 65 73 2e 20  Seq structures. 
8590: 54 68 65 20 66 69 72 73 74 20 69 73 20 74 68 65  The first is the
85a0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
85b0: 6e 63 65 0a 2a 2a 20 70 72 65 66 66 65 72 72 65  nce.** prefferre
85c0: 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 74 68 65  d for UTF-8, the
85d0: 20 73 65 63 6f 6e 64 20 55 54 46 2d 31 36 6c 65   second UTF-16le
85e0: 2c 20 61 6e 64 20 74 68 65 20 74 68 69 72 64 20  , and the third 
85f0: 55 54 46 2d 31 36 62 65 2e 0a 2a 2a 0a 2a 2a 20  UTF-16be..**.** 
8600: 53 74 6f 72 65 64 20 69 6d 6d 65 64 69 61 74 65  Stored immediate
8610: 6c 79 20 61 66 74 65 72 20 74 68 65 20 74 68 72  ly after the thr
8620: 65 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ee collation seq
8630: 75 65 6e 63 65 73 20 69 73 20 61 20 63 6f 70 79  uences is a copy
8640: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61   of.** the colla
8650: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
8660: 6d 65 2e 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  me. A pointer to
8670: 20 74 68 69 73 20 73 74 72 69 6e 67 20 69 73 20   this string is 
8680: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 65 61 63  stored in.** eac
8690: 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  h collation sequ
86a0: 65 6e 63 65 20 73 74 72 75 63 74 75 72 65 2e 0a  ence structure..
86b0: 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65  */.static CollSe
86c0: 71 20 2a 20 66 69 6e 64 43 6f 6c 6c 53 65 71 45  q * findCollSeqE
86d0: 6e 74 72 79 28 0a 20 20 73 71 6c 69 74 65 33 20  ntry(.  sqlite3 
86e0: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
86f0: 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  r *zName,.  int 
8700: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 63 72 65  nName,.  int cre
8710: 61 74 65 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ate.){.  CollSeq
8720: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 66 28 20 6e   *pColl;.  if( n
8730: 4e 61 6d 65 3c 30 20 29 20 6e 4e 61 6d 65 20 3d  Name<0 ) nName =
8740: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a   strlen(zName);.
8750: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
8760: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
8770: 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20  CollSeq, zName, 
8780: 6e 4e 61 6d 65 29 3b 0a 0a 20 20 69 66 28 20 30  nName);..  if( 0
8790: 3d 3d 70 43 6f 6c 6c 20 26 26 20 63 72 65 61 74  ==pColl && creat
87a0: 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  e ){.    pColl =
87b0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 33   sqliteMalloc( 3
87c0: 2a 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 29 20  *sizeof(*pColl) 
87d0: 2b 20 6e 4e 61 6d 65 20 2b 20 31 20 29 3b 0a 20  + nName + 1 );. 
87e0: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
87f0: 20 20 20 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a        pColl[0].z
8800: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
8810: 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70  Coll[3];.      p
8820: 43 6f 6c 6c 5b 30 5d 2e 65 6e 63 20 3d 20 53 51  Coll[0].enc = SQ
8830: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
8840: 20 70 43 6f 6c 6c 5b 31 5d 2e 7a 4e 61 6d 65 20   pColl[1].zName 
8850: 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 5b  = (char*)&pColl[
8860: 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b  3];.      pColl[
8870: 31 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  1].enc = SQLITE_
8880: 55 54 46 31 36 4c 45 3b 0a 20 20 20 20 20 20 70  UTF16LE;.      p
8890: 43 6f 6c 6c 5b 32 5d 2e 7a 4e 61 6d 65 20 3d 20  Coll[2].zName = 
88a0: 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d  (char*)&pColl[3]
88b0: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 32 5d  ;.      pColl[2]
88c0: 2e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  .enc = SQLITE_UT
88d0: 46 31 36 42 45 3b 0a 20 20 20 20 20 20 6d 65 6d  F16BE;.      mem
88e0: 63 70 79 28 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61  cpy(pColl[0].zNa
88f0: 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  me, zName, nName
8900: 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 30  );.      pColl[0
8910: 5d 2e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d  ].zName[nName] =
8920: 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
8930: 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  3HashInsert(&db-
8940: 3e 61 43 6f 6c 6c 53 65 71 2c 20 70 43 6f 6c 6c  >aCollSeq, pColl
8950: 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  [0].zName, nName
8960: 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  , pColl);.    }.
8970: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f    }.  return pCo
8980: 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  ll;.}../*.** Par
8990: 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69  ameter zName poi
89a0: 6e 74 73 20 74 6f 20 61 20 55 54 46 2d 38 20 65  nts to a UTF-8 e
89b0: 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 20 6e 4e  ncoded string nN
89c0: 61 6d 65 20 62 79 74 65 73 20 6c 6f 6e 67 2e 0a  ame bytes long..
89d0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 43 6f  ** Return the Co
89e0: 6c 6c 53 65 71 2a 20 70 6f 69 6e 74 65 72 20 66  llSeq* pointer f
89f0: 6f 72 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  or the collation
8a00: 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 64 20   sequence named 
8a10: 7a 4e 61 6d 65 0a 2a 2a 20 66 6f 72 20 74 68 65  zName.** for the
8a20: 20 65 6e 63 6f 64 69 6e 67 20 27 65 6e 63 27 20   encoding 'enc' 
8a30: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
8a40: 65 20 27 64 62 27 2e 0a 2a 2a 0a 2a 2a 20 49 66  e 'db'..**.** If
8a50: 20 74 68 65 20 65 6e 74 72 79 20 73 70 65 63 69   the entry speci
8a60: 66 69 65 64 20 69 73 20 6e 6f 74 20 66 6f 75 6e  fied is not foun
8a70: 64 20 61 6e 64 20 27 63 72 65 61 74 65 27 20 69  d and 'create' i
8a80: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 63 72 65  s true, then cre
8a90: 61 74 65 20 61 0a 2a 2a 20 6e 65 77 20 65 6e 74  ate a.** new ent
8aa0: 72 79 2e 20 20 4f 74 68 65 72 77 69 73 65 20 72  ry.  Otherwise r
8ab0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 43  eturn NULL..*/.C
8ac0: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 46  ollSeq *sqlite3F
8ad0: 69 6e 64 43 6f 6c 6c 53 65 71 28 0a 20 20 73 71  indCollSeq(.  sq
8ae0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 75 38 20  lite3 *db,.  u8 
8af0: 65 6e 63 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  enc,.  const cha
8b00: 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  r *zName,.  int 
8b10: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 63 72 65  nName,.  int cre
8b20: 61 74 65 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ate.){.  CollSeq
8b30: 20 2a 70 43 6f 6c 6c 20 3d 20 66 69 6e 64 43 6f   *pColl = findCo
8b40: 6c 6c 53 65 71 45 6e 74 72 79 28 64 62 2c 20 7a  llSeqEntry(db, z
8b50: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 63 72 65  Name, nName, cre
8b60: 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ate);.  assert( 
8b70: 53 51 4c 49 54 45 5f 55 54 46 38 3d 3d 31 20 26  SQLITE_UTF8==1 &
8b80: 26 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  & SQLITE_UTF16LE
8b90: 3d 3d 32 20 26 26 20 53 51 4c 49 54 45 5f 55 54  ==2 && SQLITE_UT
8ba0: 46 31 36 42 45 3d 3d 33 20 29 3b 0a 20 20 61 73  F16BE==3 );.  as
8bb0: 73 65 72 74 28 20 65 6e 63 3e 3d 53 51 4c 49 54  sert( enc>=SQLIT
8bc0: 45 5f 55 54 46 38 20 26 26 20 65 6e 63 3c 3d 53  E_UTF8 && enc<=S
8bd0: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b  QLITE_UTF16BE );
8be0: 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 20 70  .  if( pColl ) p
8bf0: 43 6f 6c 6c 20 2b 3d 20 65 6e 63 2d 31 3b 0a 20  Coll += enc-1;. 
8c00: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
8c10: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
8c20: 68 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65  he 'collation ne
8c30: 65 64 65 64 27 20 63 61 6c 6c 62 61 63 6b 20 74  eded' callback t
8c40: 6f 20 72 65 71 75 65 73 74 20 61 20 63 6f 6c 6c  o request a coll
8c50: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ation sequence.*
8c60: 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
8c70: 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  e text encoding 
8c80: 6f 66 20 6e 61 6d 65 20 7a 4e 61 6d 65 2c 20 6c  of name zName, l
8c90: 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 20  ength nName..** 
8ca0: 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  If the collation
8cb0: 20 73 65 71 75 65 6e 63 65 0a 2a 2f 0a 73 74 61   sequence.*/.sta
8cc0: 74 69 63 20 76 6f 69 64 20 63 61 6c 6c 43 6f 6c  tic void callCol
8cd0: 6c 4e 65 65 64 65 64 28 73 71 6c 69 74 65 33 20  lNeeded(sqlite3 
8ce0: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
8cf0: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d  *zName, int nNam
8d00: 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 64  e){.  assert( !d
8d10: 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 7c  b->xCollNeeded |
8d20: 7c 20 21 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  | !db->xCollNeed
8d30: 65 64 31 36 20 29 3b 0a 20 20 69 66 28 20 6e 4e  ed16 );.  if( nN
8d40: 61 6d 65 3c 30 20 29 20 6e 4e 61 6d 65 20 3d 20  ame<0 ) nName = 
8d50: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20  strlen(zName);. 
8d60: 20 69 66 28 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65   if( db->xCollNe
8d70: 65 64 65 64 20 29 7b 0a 20 20 20 20 63 68 61 72  eded ){.    char
8d80: 20 2a 7a 45 78 74 65 72 6e 61 6c 20 3d 20 73 71   *zExternal = sq
8d90: 6c 69 74 65 53 74 72 4e 44 75 70 28 7a 4e 61 6d  liteStrNDup(zNam
8da0: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69  e, nName);.    i
8db0: 66 28 20 21 7a 45 78 74 65 72 6e 61 6c 20 29 20  f( !zExternal ) 
8dc0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 64 62 2d 3e  return;.    db->
8dd0: 78 43 6f 6c 6c 4e 65 65 64 65 64 28 64 62 2d 3e  xCollNeeded(db->
8de0: 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20  pCollNeededArg, 
8df0: 64 62 2c 20 28 69 6e 74 29 64 62 2d 3e 65 6e 63  db, (int)db->enc
8e00: 2c 20 7a 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20  , zExternal);.  
8e10: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 45 78    sqliteFree(zEx
8e20: 74 65 72 6e 61 6c 29 3b 0a 20 20 7d 0a 23 69 66  ternal);.  }.#if
8e30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8e40: 5f 55 54 46 31 36 0a 20 20 69 66 28 20 64 62 2d  _UTF16.  if( db-
8e50: 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 29  >xCollNeeded16 )
8e60: 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  {.    char const
8e70: 20 2a 7a 45 78 74 65 72 6e 61 6c 3b 0a 20 20 20   *zExternal;.   
8e80: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
8e90: 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 47 65  pTmp = sqlite3Ge
8ea0: 74 54 72 61 6e 73 69 65 6e 74 56 61 6c 75 65 28  tTransientValue(
8eb0: 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  db);.    sqlite3
8ec0: 56 61 6c 75 65 53 65 74 53 74 72 28 70 54 6d 70  ValueSetStr(pTmp
8ed0: 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c  , -1, zName, SQL
8ee0: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
8ef0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7a 45  _STATIC);.    zE
8f00: 78 74 65 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  xternal = sqlite
8f10: 33 56 61 6c 75 65 54 65 78 74 28 70 54 6d 70 2c  3ValueText(pTmp,
8f20: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
8f30: 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  IVE);.    if( !z
8f40: 45 78 74 65 72 6e 61 6c 20 29 20 72 65 74 75 72  External ) retur
8f50: 6e 3b 0a 20 20 20 20 64 62 2d 3e 78 43 6f 6c 6c  n;.    db->xColl
8f60: 4e 65 65 64 65 64 31 36 28 64 62 2d 3e 70 43 6f  Needed16(db->pCo
8f70: 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 64 62 2c  llNeededArg, db,
8f80: 20 28 69 6e 74 29 64 62 2d 3e 65 6e 63 2c 20 7a   (int)db->enc, z
8f90: 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20 7d 0a 23  External);.  }.#
8fa0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
8fb0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
8fc0: 61 6c 6c 65 64 20 69 66 20 74 68 65 20 63 6f 6c  alled if the col
8fd0: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 66  lation factory f
8fe0: 61 69 6c 73 20 74 6f 20 64 65 6c 69 76 65 72 20  ails to deliver 
8ff0: 61 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 66  a.** collation f
9000: 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 62  unction in the b
9010: 65 73 74 20 65 6e 63 6f 64 69 6e 67 20 62 75 74  est encoding but
9020: 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 6f 74   there may be ot
9030: 68 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20  her versions.** 
9040: 6f 66 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f  of this collatio
9050: 6e 20 66 75 6e 63 74 69 6f 6e 20 28 66 6f 72 20  n function (for 
9060: 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64  other text encod
9070: 69 6e 67 73 29 20 61 76 61 69 6c 61 62 6c 65 2e  ings) available.
9080: 20 55 73 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74   Use one.** of t
9090: 68 65 73 65 20 69 6e 73 74 65 61 64 20 69 66 20  hese instead if 
90a0: 74 68 65 79 20 65 78 69 73 74 2e 20 41 76 6f 69  they exist. Avoi
90b0: 64 20 61 20 55 54 46 2d 38 20 3c 2d 3e 20 55 54  d a UTF-8 <-> UT
90c0: 46 2d 31 36 20 63 6f 6e 76 65 72 73 69 6f 6e 20  F-16 conversion 
90d0: 69 66 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 0a  if.** possible..
90e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
90f0: 6e 74 68 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  nthCollSeq(Parse
9100: 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c 53 65   *pParse, CollSe
9110: 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 43 6f 6c  q *pColl){.  Col
9120: 6c 53 65 71 20 2a 70 43 6f 6c 6c 32 3b 0a 20 20  lSeq *pColl2;.  
9130: 63 68 61 72 20 2a 7a 20 3d 20 70 43 6f 6c 6c 2d  char *z = pColl-
9140: 3e 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 20  >zName;.  int n 
9150: 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 73  = strlen(z);.  s
9160: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
9170: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
9180: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
9190: 20 75 38 20 61 45 6e 63 5b 5d 20 3d 20 7b 20 53   u8 aEnc[] = { S
91a0: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 53  QLITE_UTF16BE, S
91b0: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 53  QLITE_UTF16LE, S
91c0: 51 4c 49 54 45 5f 55 54 46 38 20 7d 3b 0a 20 20  QLITE_UTF8 };.  
91d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 33 3b 20 69 2b  for(i=0; i<3; i+
91e0: 2b 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 32 20 3d  +){.    pColl2 =
91f0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
9200: 53 65 71 28 64 62 2c 20 61 45 6e 63 5b 69 5d 2c  Seq(db, aEnc[i],
9210: 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 20 20 69   z, n, 0);.    i
9220: 66 28 20 70 43 6f 6c 6c 32 2d 3e 78 43 6d 70 21  f( pColl2->xCmp!
9230: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =0 ){.      memc
9240: 70 79 28 70 43 6f 6c 6c 2c 20 70 43 6f 6c 6c 32  py(pColl, pColl2
9250: 2c 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  , sizeof(CollSeq
9260: 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
9270: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
9280: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  }.  }.  if( pPar
9290: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
92a0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
92b0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
92c0: 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  uch collation se
92d0: 71 75 65 6e 63 65 3a 20 25 2e 2a 73 22 2c 20 6e  quence: %.*s", n
92e0: 2c 20 7a 29 3b 0a 20 20 7d 0a 20 20 70 50 61 72  , z);.  }.  pPar
92f0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 72 65  se->nErr++;.  re
9300: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
9310: 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  R;.}../*.** This
9320: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
9330: 65 64 20 6f 6e 20 61 20 63 6f 6c 6c 61 74 69 6f  ed on a collatio
9340: 6e 20 73 65 71 75 65 6e 63 65 20 62 65 66 6f 72  n sequence befor
9350: 65 20 69 74 20 69 73 20 75 73 65 64 20 74 6f 0a  e it is used to.
9360: 2a 2a 20 63 68 65 63 6b 20 74 68 61 74 20 69 74  ** check that it
9370: 20 69 73 20 64 65 66 69 6e 65 64 2e 20 41 6e 20   is defined. An 
9380: 75 6e 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74  undefined collat
9390: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 65 78 69  ion sequence exi
93a0: 73 74 73 20 77 68 65 6e 0a 2a 2a 20 61 20 64 61  sts when.** a da
93b0: 74 61 62 61 73 65 20 69 73 20 6c 6f 61 64 65 64  tabase is loaded
93c0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 72   that contains r
93d0: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
93e0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
93f0: 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 6e 6f  .** that have no
9400: 74 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20 62  t been defined b
9410: 79 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  y sqlite3_create
9420: 5f 63 6f 6c 6c 61 74 69 6f 6e 28 29 20 65 74 63  _collation() etc
9430: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 71 75 69  ..**.** If requi
9440: 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  red, this routin
9450: 65 20 63 61 6c 6c 73 20 74 68 65 20 27 63 6f 6c  e calls the 'col
9460: 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 27 20 63  lation needed' c
9470: 61 6c 6c 62 61 63 6b 20 74 6f 0a 2a 2a 20 72 65  allback to.** re
9480: 71 75 65 73 74 20 61 20 64 65 66 69 6e 69 74 69  quest a definiti
9490: 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74  on of the collat
94a0: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 49 66  ing sequence. If
94b0: 20 74 68 69 73 20 64 6f 65 73 6e 27 74 20 77 6f   this doesn't wo
94c0: 72 6b 2c 20 0a 2a 2a 20 61 6e 20 65 71 75 69 76  rk, .** an equiv
94d0: 61 6c 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20  alent collating 
94e0: 73 65 71 75 65 6e 63 65 20 74 68 61 74 20 75 73  sequence that us
94f0: 65 73 20 61 20 74 65 78 74 20 65 6e 63 6f 64 69  es a text encodi
9500: 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ng different.** 
9510: 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 64 61  from the main da
9520: 74 61 62 61 73 65 20 69 73 20 73 75 62 73 74 69  tabase is substi
9530: 74 75 74 65 64 2c 20 69 66 20 6f 6e 65 20 69 73  tuted, if one is
9540: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69   available..*/.i
9550: 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43  nt sqlite3CheckC
9560: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
9570: 61 72 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a 70  arse, CollSeq *p
9580: 43 6f 6c 6c 29 7b 0a 20 20 69 66 28 20 70 43 6f  Coll){.  if( pCo
9590: 6c 6c 20 26 26 20 21 70 43 6f 6c 6c 2d 3e 78 43  ll && !pColl->xC
95a0: 6d 70 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  mp ){.    /* No 
95b0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
95c0: 63 65 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ce of this type 
95d0: 66 6f 72 20 74 68 69 73 20 65 6e 63 6f 64 69 6e  for this encodin
95e0: 67 20 69 73 20 72 65 67 69 73 74 65 72 65 64 2e  g is registered.
95f0: 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 20 74 68 65  .    ** Call the
9600: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f   collation facto
9610: 72 79 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ry to see if it 
9620: 63 61 6e 20 73 75 70 70 6c 79 20 75 73 20 77 69  can supply us wi
9630: 74 68 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  th one..    */. 
9640: 20 20 20 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65     callCollNeede
9650: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43  d(pParse->db, pC
9660: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  oll->zName, strl
9670: 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  en(pColl->zName)
9680: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c  );.    if( !pCol
9690: 6c 2d 3e 78 43 6d 70 20 26 26 20 73 79 6e 74 68  l->xCmp && synth
96a0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
96b0: 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  pColl) ){.      
96c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
96d0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ROR;.    }.  }. 
96e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
96f0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  K;.}../*.** Call
9700: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c   sqlite3CheckCol
9710: 6c 53 65 71 28 29 20 66 6f 72 20 61 6c 6c 20 63  lSeq() for all c
9720: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
9730: 65 73 20 69 6e 20 61 6e 20 69 6e 64 65 78 2c 0a  es in an index,.
9740: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 76  ** in order to v
9750: 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 74  erify that all t
9760: 68 65 20 6e 65 63 65 73 73 61 72 79 20 63 6f 6c  he necessary col
9770: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
9780: 20 61 72 65 0a 2a 2a 20 6c 6f 61 64 65 64 2e 0a   are.** loaded..
9790: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68  */.int sqlite3Ch
97a0: 65 63 6b 49 6e 64 65 78 43 6f 6c 6c 53 65 71 28  eckIndexCollSeq(
97b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
97c0: 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69  ndex *pIdx){.  i
97d0: 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 69  f( pIdx ){.    i
97e0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
97f0: 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; i<pIdx->nColu
9800: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
9810: 69 66 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b  if( sqlite3Check
9820: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
9830: 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  pIdx->keyInfo.aC
9840: 6f 6c 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  oll[i]) ){.     
9850: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9860: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
9870: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
9880: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
9890: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
98a0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
98b0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
98c0: 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73 65  nce for database
98d0: 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20   native text.** 
98e0: 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66  encoding identif
98f0: 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69 6e  ied by the strin
9900: 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  g zName, length 
9910: 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nName..**.** If 
9920: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
9930: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
9940: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
9950: 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61  e, or not availa
9960: 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61  ble.** in the da
9970: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e  tabase native en
9980: 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c  coding, the coll
9990: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73  ation factory is
99a0: 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72   invoked to.** r
99b0: 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74 68  equest it. If th
99c0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
99d0: 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ory does not sup
99e0: 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75 65  ply such a seque
99f0: 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  nce,.** and the 
9a00: 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61 69  sequence is avai
9a10: 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  lable in another
9a20: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20   text encoding, 
9a30: 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20  then that is.** 
9a40: 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
9a50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65  ..**.** If no ve
9a60: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65  rsions of the re
9a70: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
9a80: 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65 20  ns sequence are 
9a90: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a  available, or.**
9aa0: 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f   another error o
9ab0: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
9ac0: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
9ad0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69  rror message wri
9ae0: 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61  tten into.** pPa
9af0: 72 73 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  rse..*/.CollSeq 
9b00: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  *sqlite3LocateCo
9b10: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
9b20: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
9b30: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d  *zName, int nNam
9b40: 65 29 7b 0a 20 20 75 38 20 65 6e 63 20 3d 20 70  e){.  u8 enc = p
9b50: 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a  Parse->db->enc;.
9b60: 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20    u8 initbusy = 
9b70: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74  pParse->db->init
9b80: 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71  .busy;.  CollSeq
9b90: 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
9ba0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61  3FindCollSeq(pPa
9bb0: 72 73 65 2d 3e 64 62 2c 20 65 6e 63 2c 20 7a 4e  rse->db, enc, zN
9bc0: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 69 6e 69 74  ame, nName, init
9bd0: 62 75 73 79 29 3b 0a 20 20 69 66 28 20 6e 4e 61  busy);.  if( nNa
9be0: 6d 65 3c 30 20 29 20 6e 4e 61 6d 65 20 3d 20 73  me<0 ) nName = s
9bf0: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20  trlen(zName);.  
9c00: 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26 26  if( !initbusy &&
9c10: 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f   (!pColl || !pCo
9c20: 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20  ll->xCmp) ){.   
9c30: 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e   /* No collation
9c40: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 69   sequence of thi
9c50: 73 20 74 79 70 65 20 66 6f 72 20 74 68 69 73 20  s type for this 
9c60: 65 6e 63 6f 64 69 6e 67 20 69 73 20 72 65 67 69  encoding is regi
9c70: 73 74 65 72 65 64 2e 0a 20 20 20 20 2a 2a 20 43  stered..    ** C
9c80: 61 6c 6c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  all the collatio
9c90: 6e 20 66 61 63 74 6f 72 79 20 74 6f 20 73 65 65  n factory to see
9ca0: 20 69 66 20 69 74 20 63 61 6e 20 73 75 70 70 6c   if it can suppl
9cb0: 79 20 75 73 20 77 69 74 68 20 6f 6e 65 2e 0a 20  y us with one.. 
9cc0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 6c 6c 43 6f     */.    callCo
9cd0: 6c 6c 4e 65 65 64 65 64 28 70 50 61 72 73 65 2d  llNeeded(pParse-
9ce0: 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  >db, zName, nNam
9cf0: 65 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  e);.    pColl = 
9d00: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
9d10: 65 71 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 65  eq(pParse->db, e
9d20: 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  nc, zName, nName
9d30: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , 0);.    if( pC
9d40: 6f 6c 6c 20 26 26 20 21 70 43 6f 6c 6c 2d 3e 78  oll && !pColl->x
9d50: 43 6d 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Cmp ){.      /* 
9d60: 54 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 76  There may be a v
9d70: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f  ersion of the co
9d80: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
9d90: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 0a 20   that requires. 
9da0: 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 6c 61 74       ** translat
9db0: 69 6f 6e 20 62 65 74 77 65 65 6e 20 65 6e 63 6f  ion between enco
9dc0: 64 69 6e 67 73 2e 20 53 65 61 72 63 68 20 66 6f  dings. Search fo
9dd0: 72 20 69 74 20 77 69 74 68 20 73 79 6e 74 68 43  r it with synthC
9de0: 6f 6c 6c 53 65 71 28 29 2e 0a 20 20 20 20 20 20  ollSeq()..      
9df0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 79 6e  */.      if( syn
9e00: 74 68 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  thCollSeq(pParse
9e10: 2c 20 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , pColl) ){.    
9e20: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
9e30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9e40: 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 68 69 6e 67  .  /* If nothing
9e50: 20 68 61 73 20 62 65 65 6e 20 66 6f 75 6e 64 2c   has been found,
9e60: 20 77 72 69 74 65 20 74 68 65 20 65 72 72 6f 72   write the error
9e70: 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 70 50   message into pP
9e80: 61 72 73 65 20 2a 2f 0a 20 20 69 66 28 20 21 69  arse */.  if( !i
9e90: 6e 69 74 62 75 73 79 20 26 26 20 28 21 70 43 6f  nitbusy && (!pCo
9ea0: 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43  ll || !pColl->xC
9eb0: 6d 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  mp) ){.    if( p
9ec0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
9ed0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
9ee0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
9ef0: 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69  "no such collati
9f00: 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 2e 2a  on sequence: %.*
9f10: 73 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65  s", nName, zName
9f20: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f  );.    }.    pCo
9f30: 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ll = 0;.  }.  re
9f40: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a  turn pColl;.}...
9f50: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
9f60: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
9f70: 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65  crement the sche
9f80: 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a  ma cookie..**.**
9f90: 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   The schema cook
9fa0: 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ie is used to de
9fb0: 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65  termine when the
9fc0: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a   schema for the.
9fd0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  ** database chan
9fe0: 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68  ges.  After each
9ff0: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20   schema change, 
a000: 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  the cookie value
a010: 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68  .** changes.  Wh
a020: 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72  en a process fir
a030: 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68  st reads the sch
a040: 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74  ema it records t
a050: 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54  he.** cookie.  T
a060: 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65  hereafter, whene
a070: 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61  ver it goes to a
a080: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
a090: 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73  se,.** it checks
a0a0: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d   the cookie to m
a0b0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68  ake sure the sch
a0c0: 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e  ema has not chan
a0d0: 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20  ged.** since it 
a0e0: 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a  was last read..*
a0f0: 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69  *.** This plan i
a100: 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  s not completely
a110: 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20   bullet-proof.  
a120: 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  It is possible f
a130: 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  or.** the schema
a140: 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69   to change multi
a150: 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f  ple times and fo
a160: 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  r the cookie to 
a170: 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74  be.** set back t
a180: 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20  o prior value.  
a190: 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67  But schema chang
a1a0: 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e  es are infrequen
a1b0: 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f  t.** and the pro
a1c0: 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74  bability of hitt
a1d0: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f  ing the same coo
a1e0: 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c  kie value is onl
a1f0: 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e  y.** 1 chance in
a200: 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65   2^32.  So we're
a210: 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f   safe enough..*/
a220: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61  .void sqlite3Cha
a230: 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65  ngeCookie(sqlite
a240: 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 76 2c 20  3 *db, Vdbe *v, 
a250: 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69  int iDb){.  sqli
a260: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a270: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e  OP_Integer, db->
a280: 61 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61 5f  aDb[iDb].schema_
a290: 63 6f 6f 6b 69 65 2b 31 2c 20 30 29 3b 0a 20 20  cookie+1, 0);.  
a2a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a2b0: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
a2c0: 2c 20 69 44 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  , iDb, 0);.}../*
a2d0: 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20  .** Measure the 
a2e0: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
a2f0: 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f  ters needed to o
a300: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a  utput the given.
a310: 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20  ** identifier.  
a320: 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72  The number retur
a330: 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79  ned includes any
a340: 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20   quotes used.** 
a350: 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63  but does not inc
a360: 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65  lude the null te
a370: 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  rminator..**.** 
a380: 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 73 20  The estimate is 
a390: 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49  conservative.  I
a3a0: 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  t might be large
a3b0: 72 20 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a  r that what is.*
a3c0: 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e  * really needed.
a3d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
a3e0: 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74  dentLength(const
a3f0: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
a400: 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a   n;.  for(n=0; *
a410: 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20  z; n++, z++){.  
a420: 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b    if( *z=='"' ){
a430: 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65   n++; }.  }.  re
a440: 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f  turn n + 2;.}../
a450: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 69 64  *.** Write an id
a460: 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20 74 68  entifier onto th
a470: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 67 69 76  e end of the giv
a480: 65 6e 20 73 74 72 69 6e 67 2e 20 20 41 64 64 0a  en string.  Add.
a490: 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61 63 74  ** quote charact
a4a0: 65 72 73 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a  ers as needed..*
a4b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64  /.static void id
a4c0: 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20  entPut(char *z, 
a4d0: 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20  int *pIdx, char 
a4e0: 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a  *zSignedIdent){.
a4f0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
a500: 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67  *zIdent = (unsig
a510: 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65  ned char*)zSigne
a520: 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c  dIdent;.  int i,
a530: 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20   j, needQuote;. 
a540: 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f   i = *pIdx;.  fo
a550: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
a560: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; j++){.    if( 
a570: 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b  !isalnum(zIdent[
a580: 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d  j]) && zIdent[j]
a590: 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20  !='_' ) break;. 
a5a0: 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d   }.  needQuote =
a5b0: 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c    zIdent[j]!=0 |
a5c0: 7c 20 69 73 64 69 67 69 74 28 7a 49 64 65 6e 74  | isdigit(zIdent
a5d0: 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  [0]).           
a5e0: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
a5f0: 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64  3KeywordCode(zId
a600: 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a  ent, j)!=TK_ID;.
a610: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
a620: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
a630: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
a640: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
a650: 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b  z[i++] = zIdent[
a660: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65  j];.    if( zIde
a670: 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69  nt[j]=='"' ) z[i
a680: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20  ++] = '"';.  }. 
a690: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
a6a0: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
a6b0: 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49   z[i] = 0;.  *pI
a6c0: 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx = i;.}../*.**
a6d0: 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41   Generate a CREA
a6e0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
a6f0: 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  nt appropriate f
a700: 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
a710: 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74  table.  Memory t
a720: 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20  o hold the text 
a730: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
a740: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
a750: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
a760: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
a770: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
a780: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
a790: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
a7a0: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 54  reateTableStmt(T
a7b0: 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  able *p){.  int 
a7c0: 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20  i, k, n;.  char 
a7d0: 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a  *zStmt;.  char *
a7e0: 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a  zSep, *zSep2, *z
a7f0: 45 6e 64 2c 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d  End, *z;.  Colum
a800: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30  n *pCol;.  n = 0
a810: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70  ;.  for(pCol = p
a820: 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70  ->aCol, i=0; i<p
a830: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
a840: 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69  l++){.    n += i
a850: 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d  dentLength(pCol-
a860: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d  >zName);.    z =
a870: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20   pCol->zType;.  
a880: 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20    if( z ){.     
a890: 20 6e 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 29   n += (strlen(z)
a8a0: 20 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   + 1);.    }.  }
a8b0: 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e  .  n += identLen
a8c0: 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  gth(p->zName);. 
a8d0: 20 69 66 28 20 6e 3c 35 30 20 29 7b 0a 20 20 20   if( n<50 ){.   
a8e0: 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20   zSep = "";.    
a8f0: 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20  zSep2 = ",";.   
a900: 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d   zEnd = ")";.  }
a910: 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d  else{.    zSep =
a920: 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65   "\n  ";.    zSe
a930: 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20  p2 = ",\n  ";.  
a940: 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a    zEnd = "\n)";.
a950: 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20    }.  n += 35 + 
a960: 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74  6*p->nCol;.  zSt
a970: 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  mt = sqliteMallo
a980: 63 52 61 77 28 20 6e 20 29 3b 0a 20 20 69 66 28  cRaw( n );.  if(
a990: 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75   zStmt==0 ) retu
a9a0: 72 6e 20 30 3b 0a 20 20 73 74 72 63 70 79 28 7a  rn 0;.  strcpy(z
a9b0: 53 74 6d 74 2c 20 70 2d 3e 69 44 62 3d 3d 31 20  Stmt, p->iDb==1 
a9c0: 3f 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54  ? "CREATE TEMP T
a9d0: 41 42 4c 45 20 22 20 3a 20 22 43 52 45 41 54 45  ABLE " : "CREATE
a9e0: 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d   TABLE ");.  k =
a9f0: 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a   strlen(zStmt);.
aa00: 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74    identPut(zStmt
aa10: 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b  , &k, p->zName);
aa20: 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20  .  zStmt[k++] = 
aa30: 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d  '(';.  for(pCol=
aa40: 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c  p->aCol, i=0; i<
aa50: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  p->nCol; i++, pC
aa60: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63 70  ol++){.    strcp
aa70: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65  y(&zStmt[k], zSe
aa80: 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72  p);.    k += str
aa90: 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a  len(&zStmt[k]);.
aaa0: 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32      zSep = zSep2
aab0: 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a  ;.    identPut(z
aac0: 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e  Stmt, &k, pCol->
aad0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  zName);.    if( 
aae0: 28 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  (z = pCol->zType
aaf0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53  )!=0 ){.      zS
ab00: 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a  tmt[k++] = ' ';.
ab10: 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 53        strcpy(&zS
ab20: 74 6d 74 5b 6b 5d 2c 20 7a 29 3b 0a 20 20 20 20  tmt[k], z);.    
ab30: 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 29    k += strlen(z)
ab40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74  ;.    }.  }.  st
ab50: 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20  rcpy(&zStmt[k], 
ab60: 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  zEnd);.  return 
ab70: 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zStmt;.}../*.** 
ab80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
ab90: 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74  called to report
aba0: 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74   the final ")" t
abb0: 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a  hat terminates.*
abc0: 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  * a CREATE TABLE
abd0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
abe0: 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75  * The table stru
abf0: 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72  cture that other
ac00: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
ac10: 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64   have been build
ac20: 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ing.** is added 
ac30: 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  to the internal 
ac40: 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73  hash tables, ass
ac50: 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20  uming no errors 
ac60: 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64  have.** occurred
ac70: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79  ..**.** An entry
ac80: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69   for the table i
ac90: 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61  s made in the ma
aca0: 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69  ster table on di
acb0: 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68  sk, unless.** th
acc0: 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
acd0: 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69  y table or db->i
ace0: 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68  nit.busy==1.  Wh
acf0: 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  en db->init.busy
ad00: 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20  ==1.** it means 
ad10: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
ad20: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
ad30: 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77   table because w
ad40: 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63  e just.** connec
ad50: 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ted to the datab
ad60: 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74  ase or because t
ad70: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
ad80: 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65   table has.** re
ad90: 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 2c 20  cently changes, 
ada0: 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  so the entry for
adb0: 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65   this table alre
adc0: 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a  ady exists in.**
add0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
ade0: 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f  er table.  We do
adf0: 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65   not want to cre
ae00: 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a  ate it again..**
ae10: 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65  .** If the pSele
ae20: 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ct argument is n
ae30: 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e  ot NULL, it mean
ae40: 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  s that this rout
ae50: 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65  ine.** was calle
ae60: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61  d to create a ta
ae70: 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72  ble generated fr
ae80: 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45  om a .** "CREATE
ae90: 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45   TABLE ... AS SE
aea0: 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d  LECT ..." statem
aeb0: 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ent.  The column
aec0: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
aed0: 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20   new table will 
aee0: 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74  match the result
aef0: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
af00: 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
af10: 74 65 33 45 6e 64 54 61 62 6c 65 28 50 61 72 73  te3EndTable(Pars
af20: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
af30: 20 2a 70 45 6e 64 2c 20 53 65 6c 65 63 74 20 2a   *pEnd, Select *
af40: 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
af50: 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *p;.  sqlite3 
af60: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
af70: 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d 3d  ;..  if( (pEnd==
af80: 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 29  0 && pSelect==0)
af90: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
afa0: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
afb0: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
afc0: 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  rn;.  p = pParse
afd0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
afe0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
aff0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  ;..  assert( !db
b000: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21  ->init.busy || !
b010: 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 2f 2a  pSelect );..  /*
b020: 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74   If the db->init
b030: 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d 65  .busy is 1 it me
b040: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
b050: 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74  ng the SQL off t
b060: 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f  he.  ** "sqlite_
b070: 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69  master" or "sqli
b080: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20  te_temp_master" 
b090: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73  table on the dis
b0a0: 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f  k..  ** So do no
b0b0: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  t write to the d
b0c0: 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72  isk again.  Extr
b0d0: 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67  act the root pag
b0e0: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f  e number.  ** fo
b0f0: 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  r the table from
b100: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65   the db->init.ne
b110: 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54  wTnum field.  (T
b120: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  he page number. 
b130: 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20   ** should have 
b140: 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20 62  been put there b
b150: 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e  y the sqliteOpen
b160: 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a  Cb routine.).  *
b170: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
b180: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e  .busy ){.    p->
b190: 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
b1a0: 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20  newTnum;.  }..  
b1b0: 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61  /* If not initia
b1c0: 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65  lizing, then cre
b1d0: 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72  ate a record for
b1e0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20   the new table. 
b1f0: 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54   ** in the SQLIT
b200: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f  E_MASTER table o
b210: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
b220: 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   The record numb
b230: 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  er.  ** for the 
b240: 6e 65 77 20 74 61 62 6c 65 20 65 6e 74 72 79 20  new table entry 
b250: 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
b260: 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a  e on the stack..
b270: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
b280: 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59  s is a TEMPORARY
b290: 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68   table, write th
b2a0: 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  e entry into the
b2b0: 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
b2c0: 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
b2d0: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
b2e0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
b2f0: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
b300: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e  t.busy ){.    in
b310: 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  t n;.    Vdbe *v
b320: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  ;.    char *zTyp
b330: 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20  e;    /* "view" 
b340: 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20  or "table" */.  
b350: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20    char *zType2; 
b360: 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22    /* "VIEW" or "
b370: 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68  TABLE" */.    ch
b380: 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a  ar *zStmt;    /*
b390: 20 54 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   Text of the CRE
b3a0: 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45  ATE TABLE or CRE
b3b0: 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
b3c0: 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73  nt */..    v = s
b3d0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
b3e0: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
b3f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
b400: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b410: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
b420: 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20   0, 0);..    /* 
b430: 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70  Create the rootp
b440: 61 67 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  age for the new 
b450: 74 61 62 6c 65 20 61 6e 64 20 70 75 73 68 20 69  table and push i
b460: 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  t onto the stack
b470: 2e 0a 20 20 20 20 2a 2a 20 41 20 76 69 65 77 20  ..    ** A view 
b480: 68 61 73 20 6e 6f 20 72 6f 6f 74 70 61 67 65 2c  has no rootpage,
b490: 20 73 6f 20 6a 75 73 74 20 70 75 73 68 20 61 20   so just push a 
b4a0: 7a 65 72 6f 20 6f 6e 74 6f 20 74 68 65 20 73 74  zero onto the st
b4b0: 61 63 6b 20 66 6f 72 0a 20 20 20 20 2a 2a 20 76  ack for.    ** v
b4c0: 69 65 77 73 2e 20 20 49 6e 69 74 69 61 6c 69 7a  iews.  Initializ
b4d0: 65 20 7a 54 79 70 65 20 61 74 20 74 68 65 20 73  e zType at the s
b4e0: 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 2a 2f  ame time..    */
b4f0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c  .    if( p->pSel
b500: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect==0 ){.      
b510: 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62  /* A regular tab
b520: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 73  le */.      /* s
b530: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b540: 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  v, OP_CreateTabl
b550: 65 2c 20 70 2d 3e 69 44 62 2c 20 30 29 3b 20 2a  e, p->iDb, 0); *
b560: 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  /.      zType = 
b570: 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a  "table";.      z
b580: 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b  Type2 = "TABLE";
b590: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b5a0: 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65  OMIT_VIEW.    }e
b5b0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
b5c0: 76 69 65 77 20 2a 2f 0a 20 20 20 20 2f 2a 20 20  view */.    /*  
b5d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b5e0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
b5f0: 30 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20  0, 0); */.      
b600: 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a  zType = "view";.
b610: 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
b620: 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20  VIEW";.#endif.  
b630: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
b640: 68 69 73 20 69 73 20 61 20 43 52 45 41 54 45 20  his is a CREATE 
b650: 54 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45  TABLE xx AS SELE
b660: 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20  CT ..., execute 
b670: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a  the SELECT.    *
b680: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70  * statement to p
b690: 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20  opulate the new 
b6a0: 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d  table. The root-
b6b0: 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
b6c0: 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74  the.    ** new t
b6d0: 61 62 6c 65 20 69 73 20 6f 6e 20 74 68 65 20 74  able is on the t
b6e0: 6f 70 20 6f 66 20 74 68 65 20 76 64 62 65 20 73  op of the vdbe s
b6f0: 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  tack..    **.   
b700: 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c   ** Once the SEL
b710: 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64  ECT has been cod
b720: 65 64 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c  ed by sqlite3Sel
b730: 65 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20  ect(), it is in 
b740: 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c  a.    ** suitabl
b750: 65 20 73 74 61 74 65 20 74 6f 20 71 75 65 72 79  e state to query
b760: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
b770: 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20  names and types 
b780: 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a  to be used.    *
b790: 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74 61 62  * by the new tab
b7a0: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
b7b0: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
b7c0: 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54      Table *pSelT
b7d0: 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ab;.      sqlite
b7e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b7f0: 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
b800: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b810: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
b820: 72 2c 20 70 2d 3e 69 44 62 2c 20 30 29 3b 0a 20  r, p->iDb, 0);. 
b830: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b840: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
b850: 57 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20  Write, 1, 0);.  
b860: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
b870: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 2;.      sqli
b880: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
b890: 2c 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54  , pSelect, SRT_T
b8a0: 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30  able, 1, 0, 0, 0
b8b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
b8c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b8d0: 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b  OP_Close, 1, 0);
b8e0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
b8f0: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
b900: 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20        pSelTab = 
b910: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
b920: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
b930: 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20   0, pSelect);.  
b940: 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61        if( pSelTa
b950: 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  b==0 ) return;. 
b960: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b970: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
b980: 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70       p->nCol = p
b990: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
b9a0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20        p->aCol = 
b9b0: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
b9c0: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e         pSelTab->
b9d0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
b9e0: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
b9f0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
ba00: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
ba10: 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20  0, pSelTab);.   
ba20: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
ba30: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
ba40: 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
ba50: 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65  the CREATE state
ba60: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20  ment */.    if( 
ba70: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
ba80: 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54   zStmt = createT
ba90: 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20 20 20  ableStmt(p);.   
baa0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20   }else{.      n 
bab0: 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20  = Addr(pEnd->z) 
bac0: 2d 20 41 64 64 72 28 70 50 61 72 73 65 2d 3e 73  - Addr(pParse->s
bad0: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31  NameToken.z) + 1
bae0: 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  ;.      zStmt = 
baf0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
bb00: 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c  CREATE %s %.*s",
bb10: 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72   zType2, n, pPar
bb20: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
bb30: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
bb40: 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20   A slot for the 
bb50: 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61  record has alrea
bb60: 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
bb70: 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a  d in the .    **
bb80: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
bb90: 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e  able.  We just n
bba0: 65 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68  eed to update th
bbb0: 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c  at slot with all
bbc0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f  .    ** the info
bbd0: 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f  rmation we've co
bbe0: 6c 6c 65 63 74 65 64 2e 20 20 54 68 65 20 72 6f  llected.  The ro
bbf0: 77 69 64 20 66 6f 72 20 74 68 65 20 70 72 65 61  wid for the prea
bc00: 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20  llocated.    ** 
bc10: 73 6c 6f 74 20 69 73 20 74 68 65 20 32 6e 64 20  slot is the 2nd 
bc20: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
bc30: 6b 2e 20 20 54 68 65 20 74 6f 70 20 6f 66 20 74  k.  The top of t
bc40: 68 65 20 73 74 61 63 6b 20 69 73 20 74 68 65 0a  he stack is the.
bc50: 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65      ** root page
bc60: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
bc70: 6c 65 20 28 6f 72 20 61 20 30 20 69 66 20 74 68  le (or a 0 if th
bc80: 69 73 20 69 73 20 61 20 76 69 65 77 29 2e 0a 20  is is a view).. 
bc90: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
bca0: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
bcb0: 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41  rse,.      "UPDA
bcc0: 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20  TE %Q.%s ".     
bcd0: 20 20 20 20 22 53 45 54 20 74 79 70 65 3d 27 25      "SET type='%
bce0: 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c  s', name=%Q, tbl
bcf0: 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61  _name=%Q, rootpa
bd00: 67 65 3d 23 30 2c 20 73 71 6c 3d 25 51 20 22 0a  ge=#0, sql=%Q ".
bd10: 20 20 20 20 20 20 20 22 57 48 45 52 45 20 72 6f         "WHERE ro
bd20: 77 69 64 3d 23 31 22 2c 0a 20 20 20 20 20 20 64  wid=#1",.      d
bd30: 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 7a  b->aDb[p->iDb].z
bd40: 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
bd50: 4c 45 28 70 2d 3e 69 44 62 29 2c 0a 20 20 20 20  LE(p->iDb),.    
bd60: 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70    zType,.      p
bd70: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70  ->zName,.      p
bd80: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 7a  ->zName,.      z
bd90: 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Stmt.    );.    
bda0: 73 71 6c 69 74 65 46 72 65 65 28 7a 53 74 6d 74  sqliteFree(zStmt
bdb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
bdc0: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
bdd0: 2c 20 70 2d 3e 69 44 62 29 3b 0a 0a 23 69 66 6e  , p->iDb);..#ifn
bde0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bdf0: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
be00: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
be10: 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
be20: 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65  create an sqlite
be30: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
be40: 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69  for.    ** keepi
be50: 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f  ng track of auto
be60: 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a  increment keys..
be70: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
be80: 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20 20 20  ->autoInc ){.   
be90: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
bea0: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 3b 0a 20  ->aDb[p->iDb];. 
beb0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53       if( pDb->pS
bec0: 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  eqTab==0 ){.    
bed0: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
bee0: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
bef0: 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
bf00: 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65   TABLE %Q.sqlite
bf10: 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73  _sequence(name,s
bf20: 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  eq)",.          
bf30: 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  pDb->zName.     
bf40: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
bf50: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
bf60: 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79  /* Reparse every
bf70: 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20  thing to update 
bf80: 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74  our internal dat
bf90: 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a  a structures */.
bfa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
bfb0: 70 33 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63  p3(v, OP_ParseSc
bfc0: 68 65 6d 61 2c 20 70 2d 3e 69 44 62 2c 20 30 2c  hema, p->iDb, 0,
bfd0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bfe0: 4d 50 72 69 6e 74 66 28 22 74 62 6c 5f 6e 61 6d  MPrintf("tbl_nam
bff0: 65 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65  e='%q'",p->zName
c000: 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a  ), P3_DYNAMIC);.
c010: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74    }...  /* Add t
c020: 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  he table to the 
c030: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
c040: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
c050: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
c060: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
c070: 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45  sy && pParse->nE
c080: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62  rr==0 ){.    Tab
c090: 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b  le *pOld;.    FK
c0a0: 65 79 20 2a 70 46 4b 65 79 3b 20 0a 20 20 20 20  ey *pFKey; .    
c0b0: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
c0c0: 44 62 5b 70 2d 3e 69 44 62 5d 3b 0a 20 20 20 20  Db[p->iDb];.    
c0d0: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
c0e0: 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 74  shInsert(&pDb->t
c0f0: 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65  blHash, p->zName
c100: 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d  , strlen(p->zNam
c110: 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20 69 66  e)+1, p);.    if
c120: 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  ( pOld ){.      
c130: 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20  assert( p==pOld 
c140: 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
c150: 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69  st have failed i
c160: 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74  nside HashInsert
c170: 28 29 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  () */.      retu
c180: 72 6e 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  rn;.    }.#ifnde
c190: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
c1a0: 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 66 6f  REIGN_KEY.    fo
c1b0: 72 28 70 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79  r(pFKey=p->pFKey
c1c0: 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70  ; pFKey; pFKey=p
c1d0: 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29  FKey->pNextFrom)
c1e0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20  {.      int nTo 
c1f0: 3d 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e  = strlen(pFKey->
c200: 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  zTo) + 1;.      
c210: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d  pFKey->pNextTo =
c220: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
c230: 28 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46  (&pDb->aFKey, pF
c240: 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a  Key->zTo, nTo);.
c250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73        sqlite3Has
c260: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 61 46  hInsert(&pDb->aF
c270: 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c  Key, pFKey->zTo,
c280: 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20   nTo, pFKey);.  
c290: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
c2a0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
c2b0: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54   = 0;.    db->nT
c2c0: 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e  able++;.    db->
c2d0: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
c2e0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
c2f0: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
c300: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
c310: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20  *.** The parser 
c320: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
c330: 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ne in order to c
c340: 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57  reate a new VIEW
c350: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c360: 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61  CreateView(.  Pa
c370: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
c380: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
c390: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
c3a0: 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20  en *pBegin,     
c3b0: 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
c3c0: 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
c3d0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
c3e0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
c3f0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b  ,     /* The tok
c400: 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  en that holds th
c410: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  e name of the vi
c420: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
c430: 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68  Name2,     /* Th
c440: 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c  e token that hol
c450: 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ds the name of t
c460: 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c  he view */.  Sel
c470: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
c480: 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74  /* A SELECT stat
c490: 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20  ement that will 
c4a0: 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76  become the new v
c4b0: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  iew */.  int isT
c4c0: 65 6d 70 20 20 20 20 20 20 20 20 20 2f 2a 20 54  emp         /* T
c4d0: 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52  RUE for a TEMPOR
c4e0: 41 52 59 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20  ARY view */.){. 
c4f0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
c500: 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   n;.  const unsi
c510: 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20  gned char *z;.  
c520: 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62  Token sEnd;.  Db
c530: 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f  Fixer sFix;.  To
c540: 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 0a 20 20 73  ken *pName;..  s
c550: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
c560: 28 70 50 61 72 73 65 2c 20 70 42 65 67 69 6e 2c  (pParse, pBegin,
c570: 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
c580: 20 69 73 54 65 6d 70 2c 20 31 29 3b 0a 20 20 70   isTemp, 1);.  p
c590: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
c5a0: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
c5b0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
c5c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
c5d0: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c  electDelete(pSel
c5e0: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
c5f0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54  ;.  }.  sqlite3T
c600: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
c610: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
c620: 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66  2, &pName);.  if
c630: 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74  ( sqlite3FixInit
c640: 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
c650: 70 2d 3e 69 44 62 2c 20 22 76 69 65 77 22 2c 20  p->iDb, "view", 
c660: 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20 73 71  pName).    && sq
c670: 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 26  lite3FixSelect(&
c680: 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 0a 20  sFix, pSelect). 
c690: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
c6a0: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c  electDelete(pSel
c6b0: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
c6c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
c6d0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
c6e0: 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74 61  ntire SELECT sta
c6f0: 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
c700: 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
c710: 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72  ** This will for
c720: 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e  ce all the Expr.
c730: 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74  token.z values t
c740: 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
c750: 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  .  ** allocated 
c760: 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e  rather than poin
c770: 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73  t to the input s
c780: 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65  tring - which me
c790: 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ans that.  ** th
c7a0: 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20  ey will persist 
c7b0: 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e  after the curren
c7c0: 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  t sqlite3_exec()
c7d0: 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20   call returns.. 
c7e0: 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74   */.  p->pSelect
c7f0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
c800: 44 75 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  Dup(pSelect);.  
c810: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
c820: 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  ete(pSelect);.  
c830: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d  if( !pParse->db-
c840: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
c850: 20 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74    sqlite3ViewGet
c860: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
c870: 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  se, p);.  }..  /
c880: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64  * Locate the end
c890: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56   of the CREATE V
c8a0: 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  IEW statement.  
c8b0: 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20  Make sEnd point 
c8c0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e  to.  ** the end.
c8d0: 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70  .  */.  sEnd = p
c8e0: 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
c8f0: 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b  n;.  if( sEnd.z[
c900: 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b  0]!=0 && sEnd.z[
c910: 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73  0]!=';' ){.    s
c920: 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b  End.z += sEnd.n;
c930: 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  .  }.  sEnd.n = 
c940: 30 3b 0a 20 20 6e 20 3d 20 73 45 6e 64 2e 7a 20  0;.  n = sEnd.z 
c950: 2d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a  - pBegin->z;.  z
c960: 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
c970: 65 64 20 63 68 61 72 2a 29 70 42 65 67 69 6e 2d  ed char*)pBegin-
c980: 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30  >z;.  while( n>0
c990: 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27   && (z[n-1]==';'
c9a0: 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d   || isspace(z[n-
c9b0: 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  1])) ){ n--; }. 
c9c0: 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31   sEnd.z = &z[n-1
c9d0: 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b  ];.  sEnd.n = 1;
c9e0: 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74  ..  /* Use sqlit
c9f0: 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20  e3EndTable() to 
ca00: 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20  add the view to 
ca10: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
ca20: 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  R table */.  sql
ca30: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61  ite3EndTable(pPa
ca40: 72 73 65 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a  rse, &sEnd, 0);.
ca50: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
ca60: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
ca70: 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 6e 64  T_VIEW */..#ifnd
ca80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
ca90: 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61  IEW./*.** The Ta
caa0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54  ble structure pT
cab0: 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  able is really a
cac0: 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20   VIEW.  Fill in 
cad0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  the names of.** 
cae0: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
caf0: 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70  he view in the p
cb00: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e  Table structure.
cb10: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
cb20: 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73  ber.** of errors
cb30: 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  .  If an error i
cb40: 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20  s seen leave an 
cb50: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
cb60: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
cb70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
cb80: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
cb90: 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
cba0: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
cbb0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54  {.  Table *pSelT
cbc0: 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20  ab;   /* A fake 
cbd0: 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68  table from which
cbe0: 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75   we get the resu
cbf0: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65  lt set */.  Sele
cc00: 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a  ct *pSel;     /*
cc10: 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   Copy of the SEL
cc20: 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ECT that impleme
cc30: 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a  nts the view */.
cc40: 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20    int nErr = 0; 
cc50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
cc60: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
cc70: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  red */.  int n; 
cc80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
cc90: 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20  mporarily holds 
cca0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75  the number of cu
ccb0: 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a  rsors assigned *
ccc0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  /..  assert( pTa
ccd0: 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70  ble );..  /* A p
cce0: 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61  ositive nCol mea
ccf0: 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e  ns the columns n
cd00: 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69  ames for this vi
cd10: 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65  ew are.  ** alre
cd20: 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a  ady known..  */.
cd30: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
cd40: 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ol>0 ) return 0;
cd50: 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76  ..  /* A negativ
cd60: 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63  e nCol is a spec
cd70: 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69  ial marker meani
cd80: 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63  ng that we are c
cd90: 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72  urrently.  ** tr
cda0: 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20  ying to compute 
cdb0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
cdc0: 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74  .  If we enter t
cdd0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
cde0: 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65  .  ** a negative
cdf0: 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20   nCol, it means 
ce00: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77  two or more view
ce10: 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c  s form a loop, l
ce20: 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ike this:.  **. 
ce30: 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
ce40: 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43  IEW one AS SELEC
ce50: 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20  T * FROM two;.  
ce60: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
ce70: 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54  EW two AS SELECT
ce80: 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a   * FROM one;.  *
ce90: 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  *.  ** Actually,
cea0: 20 74 68 69 73 20 65 72 72 6f 72 20 69 73 20 63   this error is c
ceb0: 61 75 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79  aught previously
cec0: 20 61 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c   and so the foll
ced0: 6f 77 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20  owing test.  ** 
cee0: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61  should always fa
cef0: 69 6c 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c  il.  But we will
cf00: 20 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61   leave it in pla
cf10: 63 65 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61  ce just to be sa
cf20: 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  fe..  */.  if( p
cf30: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b  Table->nCol<0 ){
cf40: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
cf50: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
cf60: 65 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61  ew %s is circula
cf70: 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54  rly defined", pT
cf80: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
cf90: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
cfa0: 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20  .  /* If we get 
cfb0: 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
cfc0: 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f  ns we need to co
cfd0: 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20  mpute the table 
cfe0: 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65  names..  ** Note
cff0: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74   that the call t
d000: 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  o sqlite3ResultS
d010: 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c  etOfSelect() wil
d020: 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a  l expand any.  *
d030: 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69  * "*" elements i
d040: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65  n the results se
d050: 74 20 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e  t of the view an
d060: 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75  d will assign cu
d070: 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68  rsors.  ** to th
d080: 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  e elements of th
d090: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
d0a0: 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61  But we do not wa
d0b0: 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67 65 73  nt these changes
d0c0: 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d  .  ** to be perm
d0d0: 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63  anent.  So the c
d0e0: 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f  omputation is do
d0f0: 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20  ne on a copy of 
d100: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20  the SELECT.  ** 
d110: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
d120: 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
d130: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
d140: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20  pTable->pSelect 
d150: 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69  );.  pSel = sqli
d160: 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 54 61  te3SelectDup(pTa
d170: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  ble->pSelect);. 
d180: 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61   n = pParse->nTa
d190: 62 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  b;.  sqlite3SrcL
d1a0: 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
d1b0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
d1c0: 53 72 63 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Src);.  pTable->
d1d0: 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 70 53 65  nCol = -1;.  pSe
d1e0: 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
d1f0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
d200: 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29  pParse, 0, pSel)
d210: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  ;.  pParse->nTab
d220: 20 3d 20 6e 3b 0a 20 20 69 66 28 20 70 53 65 6c   = n;.  if( pSel
d230: 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
d240: 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d  t( pTable->aCol=
d250: 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65  =0 );.    pTable
d260: 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
d270: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62  ->nCol;.    pTab
d280: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54  le->aCol = pSelT
d290: 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53  ab->aCol;.    pS
d2a0: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
d2b0: 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43  .    pSelTab->aC
d2c0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ol = 0;.    sqli
d2d0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30  te3DeleteTable(0
d2e0: 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
d2f0: 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 70 50  DbSetProperty(pP
d300: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 6c 65  arse->db, pTable
d310: 2d 3e 69 44 62 2c 20 44 42 5f 55 6e 72 65 73 65  ->iDb, DB_Unrese
d320: 74 56 69 65 77 73 29 3b 0a 20 20 7d 65 6c 73 65  tViews);.  }else
d330: 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43  {.    pTable->nC
d340: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 6e 45 72 72  ol = 0;.    nErr
d350: 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ++;.  }.  sqlite
d360: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
d370: 65 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45  el);.  return nE
d380: 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f  rr;  .}.#endif /
d390: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
d3a0: 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  EW */..#ifndef S
d3b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
d3c0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
d3d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
d3e0: 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20  m every VIEW in 
d3f0: 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f  database idx..*/
d400: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
d410: 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
d420: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
d430: 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65   idx){.  HashEle
d440: 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21 44 62 48  m *i;.  if( !DbH
d450: 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  asProperty(db, i
d460: 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
d470: 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ews) ) return;. 
d480: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
d490: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b  hFirst(&db->aDb[
d4a0: 69 64 78 5d 2e 74 62 6c 48 61 73 68 29 3b 20 69  idx].tblHash); i
d4b0: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
d4c0: 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c  xt(i)){.    Tabl
d4d0: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
d4e0: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
d4f0: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
d500: 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
d510: 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d  teResetColumnNam
d520: 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  es(pTab);.    }.
d530: 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f    }.  DbClearPro
d540: 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
d550: 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b  B_UnresetViews);
d560: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
d570: 65 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  e sqliteViewRese
d580: 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66  tAll(A,B).#endif
d590: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
d5a0: 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  VIEW */../*.** T
d5b0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d5c0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44  called by the VD
d5d0: 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  BE to adjust the
d5e0: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
d5f0: 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69  .** used by SQLi
d600: 74 65 20 77 68 65 6e 20 74 68 65 20 62 74 72 65  te when the btre
d610: 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20  e layer moves a 
d620: 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e  table root page.
d630: 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67   The.** root-pag
d640: 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  e of a table or 
d650: 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61 73  index in databas
d660: 65 20 69 44 62 20 68 61 73 20 63 68 61 6e 67 65  e iDb has change
d670: 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20  d from iFrom.** 
d680: 74 6f 20 69 54 6f 2e 0a 2a 2f 0a 23 69 66 6e 64  to iTo..*/.#ifnd
d690: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
d6a0: 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73  UTOVACUUM.void s
d6b0: 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f  qlite3RootPageMo
d6c0: 76 65 64 28 44 62 20 2a 70 44 62 2c 20 69 6e 74  ved(Db *pDb, int
d6d0: 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29   iFrom, int iTo)
d6e0: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45  {.  HashElem *pE
d6f0: 6c 65 6d 3b 0a 20 20 0a 20 20 66 6f 72 28 70 45  lem;.  .  for(pE
d700: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
d710: 72 73 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73  rst(&pDb->tblHas
d720: 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
d730: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
d740: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62  pElem)){.    Tab
d750: 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
d760: 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
d770: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
d780: 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  tnum==iFrom ){. 
d790: 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20       pTab->tnum 
d7a0: 3d 20 69 54 6f 3b 0a 20 20 20 20 20 20 72 65 74  = iTo;.      ret
d7b0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  urn;.    }.  }. 
d7c0: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
d7d0: 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d  eHashFirst(&pDb-
d7e0: 3e 69 64 78 48 61 73 68 29 3b 20 70 45 6c 65 6d  >idxHash); pElem
d7f0: 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
d800: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
d810: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
d820: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
d830: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
d840: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pIdx->tnum==iFr
d850: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  om ){.      pIdx
d860: 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
d870: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
d880: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 30  }.  }.  assert(0
d890: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
d8a0: 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f  ** Write code to
d8b0: 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65   erase the table
d8c0: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
d8d0: 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61  iTable from data
d8e0: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73  base iDb..** Als
d8f0: 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20  o write code to 
d900: 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74  modify the sqlit
d910: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e_master table a
d920: 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
d930: 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d  ma.** if a root-
d940: 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  page of another 
d950: 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
d960: 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65  y the btree-laye
d970: 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73  r whilst.** eras
d980: 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73  ing iTable (this
d990: 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
d9a0: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
d9b0: 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73  database)..*/ .s
d9c0: 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
d9d0: 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65  oyRootPage(Parse
d9e0: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
d9f0: 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  able, int iDb){.
da00: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
da10: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
da20: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
da30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73  eAddOp(v, OP_Des
da40: 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 69 44  troy, iTable, iD
da50: 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  b);.#ifndef SQLI
da60: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
da70: 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72  UM.  /* OP_Destr
da80: 6f 79 20 70 75 73 68 65 73 20 61 6e 20 69 6e 74  oy pushes an int
da90: 65 67 65 72 20 6f 6e 74 6f 20 74 68 65 20 73 74  eger onto the st
daa0: 61 63 6b 2e 20 49 66 20 74 68 69 73 20 69 6e 74  ack. If this int
dab0: 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e  eger.  ** is non
dac0: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69  -zero, then it i
dad0: 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
dae0: 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c  number of a tabl
daf0: 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20  e moved to.  ** 
db00: 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e  location iTable.
db10: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
db20: 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65  ode modifies the
db30: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
db40: 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66  able to.  ** ref
db50: 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a  lect this..  **.
db60: 20 20 2a 2a 20 54 68 65 20 22 23 30 22 20 69 6e    ** The "#0" in
db70: 20 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70   the SQL is a sp
db80: 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74  ecial constant t
db90: 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76  hat means whatev
dba0: 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73  er value.  ** is
dbb0: 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74   on the top of t
dbc0: 68 65 20 73 74 61 63 6b 2e 20 20 53 65 65 20 73  he stack.  See s
dbd0: 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 45 78  qlite3RegisterEx
dbe0: 70 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  pr()..  */.  sql
dbf0: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
dc00: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55  pParse, .     "U
dc10: 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54 20  PDATE %Q.%s SET 
dc20: 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52  rootpage=%d WHER
dc30: 45 20 23 30 20 41 4e 44 20 72 6f 6f 74 70 61 67  E #0 AND rootpag
dc40: 65 3d 23 30 22 2c 0a 20 20 20 20 20 70 50 61 72  e=#0",.     pPar
dc50: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
dc60: 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
dc70: 41 42 4c 45 28 69 44 62 29 2c 20 69 54 61 62 6c  ABLE(iDb), iTabl
dc80: 65 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  e);.#endif.}../*
dc90: 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63  .** Write VDBE c
dca0: 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62  ode to erase tab
dcb0: 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20  le pTab and all 
dcc0: 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63  associated indic
dcd0: 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43  es on disk..** C
dce0: 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  ode to update th
dcf0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
dd00: 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72  tables and inter
dd10: 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e  nal schema defin
dd20: 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73  itions.** in cas
dd30: 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65  e a root-page be
dd40: 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68  longing to anoth
dd50: 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
dd60: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c  d by the btree l
dd70: 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20  ayer.** is also 
dd80: 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20  added (this can 
dd90: 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
dda0: 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
ddb0: 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
ddc0: 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c  void destroyTabl
ddd0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
dde0: 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23   Table *pTab){.#
ddf0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
de00: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49  T_AUTOVACUUM.  I
de10: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 64 65  ndex *pIdx;.  de
de20: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
de30: 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  arse, pTab->tnum
de40: 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20  , pTab->iDb);.  
de50: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
de60: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
de70: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
de80: 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
de90: 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 64 78  age(pParse, pIdx
dea0: 2d 3e 74 6e 75 6d 2c 20 70 49 64 78 2d 3e 69 44  ->tnum, pIdx->iD
deb0: 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  b);.  }.#else.  
dec0: 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
ded0: 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76  se may be auto-v
dee0: 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69  acuum capable (i
def0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
df00: 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73  TOVACUUM.  ** is
df10: 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74   not defined), t
df20: 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74  hen it is import
df30: 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44  ant to call OP_D
df40: 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20  estroy on the.  
df50: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64  ** table and ind
df60: 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e  ex root-pages in
df70: 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67   order, starting
df80: 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69   with the numeri
df90: 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67  cally .  ** larg
dfa0: 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  est root-page nu
dfb0: 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72 61  mber. This guara
dfc0: 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20  ntees that none 
dfd0: 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  of the root-page
dfe0: 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73  s.  ** to be des
dff0: 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61  troyed is reloca
e000: 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ted by an earlie
e010: 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e  r OP_Destroy. i.
e020: 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66  e. if the.  ** f
e030: 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f  ollowing were co
e040: 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  ded:.  **.  ** O
e050: 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20  P_Destroy 4 0.  
e060: 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44  ** ....  ** OP_D
e070: 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a  estroy 5 0.  **.
e080: 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61    ** and root pa
e090: 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f  ge 5 happened to
e0a0: 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74 20   be the largest 
e0b0: 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
e0c0: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
e0d0: 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74  abase, then root
e0e0: 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65   page 5 would be
e0f0: 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34   moved to page 4
e100: 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f   by the .  ** "O
e110: 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f  P_Destroy 4 0" o
e120: 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65  pcode. The subse
e130: 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f  quent "OP_Destro
e140: 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74  y 5 0" would hit
e150: 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73  .  ** a free-lis
e160: 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  t page..  */.  i
e170: 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e  nt iTab = pTab->
e180: 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73  tnum;.  int iDes
e190: 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77  troyed = 0;..  w
e1a0: 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49  hile( 1 ){.    I
e1b0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
e1c0: 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30  int iLargest = 0
e1d0: 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73 74  ;..    if( iDest
e1e0: 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62  royed==0 || iTab
e1f0: 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20  <iDestroyed ){. 
e200: 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20       iLargest = 
e210: 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iTab;.    }.    
e220: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
e230: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
e240: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
e250: 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d        int iIdx =
e260: 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20   pIdx->tnum;.   
e270: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
e280: 3e 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20  >iDb==pTab->iDb 
e290: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 44  );.      if( (iD
e2a0: 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28  estroyed==0 || (
e2b0: 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29  iIdx<iDestroyed)
e2c0: 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65  ) && iIdx>iLarge
e2d0: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c  st ){.        iL
e2e0: 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20  argest = iIdx;. 
e2f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e300: 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30   if( iLargest==0
e310: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 64   ) return;.    d
e320: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
e330: 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c  Parse, iLargest,
e340: 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20   pTab->iDb);.   
e350: 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c   iDestroyed = iL
e360: 61 72 67 65 73 74 3b 0a 20 20 7d 0a 23 65 6e 64  argest;.  }.#end
e370: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  if.}../*.** This
e380: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
e390: 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  ed to do the wor
e3a0: 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c  k of a DROP TABL
e3b0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  E statement..** 
e3c0: 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  pName is the nam
e3d0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
e3e0: 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f  o be dropped..*/
e3f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
e400: 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
e410: 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
e420: 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77  Name, int isView
e430: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
e440: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
e450: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
e460: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
e470: 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Db;..  if( pPars
e480: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
e490: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
e4a0: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f   ) goto exit_dro
e4b0: 70 5f 74 61 62 6c 65 3b 0a 20 20 61 73 73 65 72  p_table;.  asser
e4c0: 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
e4d0: 31 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  1 );.  pTab = sq
e4e0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
e4f0: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e  (pParse, pName->
e500: 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d  a[0].zName, pNam
e510: 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
e520: 65 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  e);..  if( pTab=
e530: 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64  =0 ) goto exit_d
e540: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69 44 62  rop_table;.  iDb
e550: 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20   = pTab->iDb;.  
e560: 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
e570: 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
e580: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e590: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
e5a0: 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
e5b0: 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ode;.    const c
e5c0: 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
e5d0: 4d 41 5f 54 41 42 4c 45 28 70 54 61 62 2d 3e 69  MA_TABLE(pTab->i
e5e0: 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  Db);.    const c
e5f0: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
e600: 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e  Db[pTab->iDb].zN
e610: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ame;.    if( sql
e620: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
e630: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
e640: 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
e650: 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  b)){.      goto 
e660: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
e670: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
e680: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
e690: 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  f( iDb==1 ){.   
e6a0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
e6b0: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45  TE_DROP_TEMP_VIE
e6c0: 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  W;.      }else{.
e6d0: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
e6e0: 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b  QLITE_DROP_VIEW;
e6f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
e700: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44  se{.      if( iD
e710: 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
e720: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
e730: 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20  OP_TEMP_TABLE;. 
e740: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e750: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
e760: 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20  E_DROP_TABLE;.  
e770: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e780: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
e790: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
e7a0: 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
e7b0: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
e7c0: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
e7d0: 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
e7e0: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
e7f0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
e800: 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61  LITE_DELETE, pTa
e810: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  b->zName, 0, zDb
e820: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
e830: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
e840: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
e850: 66 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65  f.  if( pTab->re
e860: 61 64 4f 6e 6c 79 20 7c 7c 20 70 54 61 62 3d 3d  adOnly || pTab==
e870: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 65  db->aDb[iDb].pSe
e880: 71 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  qTab ){.    sqli
e890: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
e8a0: 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
e8b0: 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  y not be dropped
e8c0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
e8d0: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
e8e0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a  rop_table;.  }..
e8f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e900: 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e  MIT_VIEW.  /* En
e910: 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20  sure DROP TABLE 
e920: 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61  is not used on a
e930: 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20   view, and DROP 
e940: 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64  VIEW is not used
e950: 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65  .  ** on a table
e960: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56  ..  */.  if( isV
e970: 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
e980: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  lect==0 ){.    s
e990: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
e9a0: 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
e9b0: 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65   TABLE to delete
e9c0: 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62   table %s", pTab
e9d0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
e9e0: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
e9f0: 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69  le;.  }.  if( !i
ea00: 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
ea10: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
ea20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ea30: 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
ea40: 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76  VIEW to delete v
ea50: 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  iew %s", pTab->z
ea60: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
ea70: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
ea80: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
ea90: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
eaa0: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61  to remove the ta
eab0: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  ble from the mas
eac0: 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ter table.  ** o
ead0: 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76  n disk..  */.  v
eae0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
eaf0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
eb00: 20 76 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65   v ){.    Trigge
eb10: 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20  r *pTrigger;.   
eb20: 20 69 6e 74 20 69 44 62 20 3d 20 70 54 61 62 2d   int iDb = pTab-
eb30: 3e 69 44 62 3b 0a 20 20 20 20 44 62 20 2a 70 44  >iDb;.    Db *pD
eb40: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
eb50: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ];.    sqlite3Be
eb60: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
eb70: 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
eb80: 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20  );..    /* Drop 
eb90: 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73 73  all triggers ass
eba0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
ebb0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
ebc0: 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a  pped. Code.    *
ebd0: 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  * is generated t
ebe0: 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73  o remove entries
ebf0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73   from sqlite_mas
ec00: 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a  ter and/or.    *
ec10: 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  * sqlite_temp_ma
ec20: 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65 64  ster if required
ec30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 72  ..    */.    pTr
ec40: 69 67 67 65 72 20 3d 20 70 54 61 62 2d 3e 70 54  igger = pTab->pT
ec50: 72 69 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c  rigger;.    whil
ec60: 65 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20  e( pTrigger ){. 
ec70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
ec80: 69 67 67 65 72 2d 3e 69 44 62 3d 3d 69 44 62 20  igger->iDb==iDb 
ec90: 7c 7c 20 70 54 72 69 67 67 65 72 2d 3e 69 44 62  || pTrigger->iDb
eca0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
ecb0: 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50  ite3DropTriggerP
ecc0: 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67  tr(pParse, pTrig
ecd0: 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 70  ger, 1);.      p
ece0: 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67  Trigger = pTrigg
ecf0: 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  er->pNext;.    }
ed00: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
ed10: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
ed20: 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  ENT.    /* Remov
ed30: 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66  e any entries of
ed40: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75   the sqlite_sequ
ed50: 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63  ence table assoc
ed60: 69 61 74 65 64 20 77 69 74 68 0a 20 20 20 20 2a  iated with.    *
ed70: 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * the table bein
ed80: 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20  g dropped. This 
ed90: 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74  is done before t
eda0: 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70  he table is drop
edb0: 70 65 64 0a 20 20 20 20 2a 2a 20 61 74 20 74 68  ped.    ** at th
edc0: 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69  e btree level, i
edd0: 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74  n case the sqlit
ede0: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
edf0: 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a   needs to.    **
ee00: 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c   move as a resul
ee10: 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63  t of the drop (c
ee20: 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74  an happen in aut
ee30: 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a  o-vacuum mode)..
ee40: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
ee50: 54 61 62 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a  Tab->autoInc ){.
ee60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
ee70: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
ee80: 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
ee90: 20 46 52 4f 4d 20 25 73 2e 73 71 6c 69 74 65 5f   FROM %s.sqlite_
eea0: 73 65 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e  sequence WHERE n
eeb0: 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20  ame=%Q",.       
eec0: 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61   pDb->zName, pTa
eed0: 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29  b->zName.      )
eee0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
eef0: 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20      /* Drop all 
ef00: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
ef10: 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e  ble and index en
ef20: 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72  tries that refer
ef30: 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 74   to the.    ** t
ef40: 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61  able. The progra
ef50: 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72  m name loops thr
ef60: 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20  ough the master 
ef70: 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65  table and delete
ef80: 73 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72  s.    ** every r
ef90: 6f 77 20 74 68 61 74 20 72 65 66 65 72 73 20 74  ow that refers t
efa0: 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65  o a table of the
efb0: 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
efc0: 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 20 20  e one being.    
efd0: 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67  ** dropped. Trig
efe0: 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64  gers are handled
eff0: 20 73 65 70 65 72 61 74 65 6c 79 20 62 65 63 61   seperately beca
f000: 75 73 65 20 61 20 74 72 69 67 67 65 72 20 63 61  use a trigger ca
f010: 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63 72 65 61  n be.    ** crea
f020: 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20  ted in the temp 
f030: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 72 65  database that re
f040: 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20  fers to a table 
f050: 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a  in another.    *
f060: 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  * database..    
f070: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
f080: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
f090: 2c 20 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  , .        "DELE
f0a0: 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
f0b0: 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20  ERE tbl_name=%Q 
f0c0: 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67 67  and type!='trigg
f0d0: 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20 70 44  er'",.        pD
f0e0: 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b->zName, SCHEMA
f0f0: 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61  _TABLE(iDb), pTa
f100: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b->zName);.    i
f110: 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20  f( !isView ){.  
f120: 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65      destroyTable
f130: 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
f140: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
f150: 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 65  move the table e
f160: 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65  ntry from SQLite
f170: 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  's internal sche
f180: 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20  ma and modify.  
f190: 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20    ** the schema 
f1a0: 63 6f 6f 6b 69 65 2e 0a 20 20 20 20 2a 2f 0a 20  cookie..    */. 
f1b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
f1c0: 33 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c  3(v, OP_DropTabl
f1d0: 65 2c 20 69 44 62 2c 20 30 2c 20 70 54 61 62 2d  e, iDb, 0, pTab-
f1e0: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
f1f0: 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
f200: 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b  kie(db, v, iDb);
f210: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65  .  }.  sqliteVie
f220: 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44  wResetAll(db, iD
f230: 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74  b);..exit_drop_t
f240: 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53  able:.  sqlite3S
f250: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61  rcListDelete(pNa
f260: 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  me);.}../*.** Th
f270: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
f280: 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
f290: 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79   new foreign key
f2a0: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a   on the table.**
f2b0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
f2c0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
f2d0: 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69  pFromCol determi
f2e0: 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e  nes which column
f2f0: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72  s.** in the curr
f300: 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20  ent table point 
f310: 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  to the foreign k
f320: 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c  ey.  If pFromCol
f330: 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e  ==0 then.** conn
f340: 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74  ect the key to t
f350: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69  he last column i
f360: 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73  nserted.  pTo is
f370: 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20   the name of.** 
f380: 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72  the table referr
f390: 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69  ed to.  pToCol i
f3a0: 73 20 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c  s a list of tabl
f3b0: 65 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 0a  es in the other.
f3c0: 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20 74 68 61  ** pTo table tha
f3d0: 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  t the foreign ke
f3e0: 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c  y points to.  fl
f3f0: 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ags contains all
f400: 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
f410: 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69  about the confli
f420: 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
f430: 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69  gorithms specifi
f440: 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20  ed.** in the ON 
f450: 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54  DELETE, ON UPDAT
f460: 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20  E and ON INSERT 
f470: 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  clauses..**.** A
f480: 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65  n FKey structure
f490: 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
f4a0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
f4b0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  le currently.** 
f4c0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
f4d0: 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  on in the pParse
f4e0: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c  ->pNewTable fiel
f4f0: 64 2e 20 20 54 68 65 20 6e 65 77 20 46 4b 65 79  d.  The new FKey
f500: 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e 6b 65  .** is not linke
f510: 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b 65 79  d into db->aFKey
f520: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 2d   at this point -
f530: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 68   that does not h
f540: 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73  appen.** until s
f550: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
f560: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65  ..**.** The fore
f570: 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66  ign key is set f
f580: 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f  or IMMEDIATE pro
f590: 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73  cessing.  A subs
f5a0: 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74  equent call.** t
f5b0: 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f  o sqlite3DeferFo
f5c0: 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74  reignKey() might
f5d0: 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20   change this to 
f5e0: 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69  DEFERRED..*/.voi
f5f0: 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  d sqlite3CreateF
f600: 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72  oreignKey(.  Par
f610: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
f620: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
f630: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
f640: 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f  st *pFromCol,  /
f650: 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69  * Columns in thi
f660: 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69  s table that poi
f670: 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c  nt to other tabl
f680: 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  e */.  Token *pT
f690: 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  o,          /* N
f6a0: 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72  ame of the other
f6b0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
f6c0: 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20  List *pToCol,   
f6d0: 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
f6e0: 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
f6f0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
f700: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
f710: 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
f720: 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29  algorithms. */.)
f730: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
f740: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
f750: 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20  Y.  FKey *pFKey 
f760: 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20  = 0;.  Table *p 
f770: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
f780: 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  ble;.  int nByte
f790: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
f7a0: 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a   nCol;.  char *z
f7b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  ;..  assert( pTo
f7c0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
f7d0: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
f7e0: 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  r ) goto fk_end;
f7f0: 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
f800: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  =0 ){.    int iC
f810: 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  ol = p->nCol-1;.
f820: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
f830: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
f840: 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20    if( pToCol && 
f850: 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31  pToCol->nExpr!=1
f860: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f870: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
f880: 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  , "foreign key o
f890: 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22  n %s".         "
f8a0: 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63   should referenc
f8b0: 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d  e only one colum
f8c0: 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a  n of table %T",.
f8d0: 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c           p->aCol
f8e0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54  [iCol].zName, pT
f8f0: 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  o);.      goto f
f900: 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  k_end;.    }.   
f910: 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c   nCol = 1;.  }el
f920: 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26  se if( pToCol &&
f930: 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d   pToCol->nExpr!=
f940: 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20  pFromCol->nExpr 
f950: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
f960: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
f970: 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f         "number o
f980: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72  f columns in for
f990: 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f  eign key does no
f9a0: 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62  t match the numb
f9b0: 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20  er of ".        
f9c0: 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20  "columns in the 
f9d0: 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
f9e0: 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ");.    goto fk_
f9f0: 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  end;.  }else{.  
fa00: 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f    nCol = pFromCo
fa10: 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20  l->nExpr;.  }.  
fa20: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
fa30: 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69  pFKey) + nCol*si
fa40: 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
fa50: 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
fa60: 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
fa70: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
fa80: 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b  i<pToCol->nExpr;
fa90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79   i++){.      nBy
faa0: 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f  te += strlen(pTo
fab0: 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
fac0: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
fad0: 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65    pFKey = sqlite
fae0: 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b  Malloc( nByte );
faf0: 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20  .  if( pFKey==0 
fb00: 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20  ) goto fk_end;. 
fb10: 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20   pFKey->pFrom = 
fb20: 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  p;.  pFKey->pNex
fb30: 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79  tFrom = p->pFKey
fb40: 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26  ;.  z = (char*)&
fb50: 70 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65  pFKey[1];.  pFKe
fb60: 79 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75 63  y->aCol = (struc
fb70: 74 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20  t sColMap*)z;.  
fb80: 7a 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72 75  z += sizeof(stru
fb90: 63 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c  ct sColMap)*nCol
fba0: 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d  ;.  pFKey->zTo =
fbb0: 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20   z;.  memcpy(z, 
fbc0: 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b  pTo->z, pTo->n);
fbd0: 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30  .  z[pTo->n] = 0
fbe0: 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b  ;.  z += pTo->n+
fbf0: 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  1;.  pFKey->pNex
fc00: 74 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79  tTo = 0;.  pFKey
fc10: 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  ->nCol = nCol;. 
fc20: 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30   if( pFromCol==0
fc30: 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61   ){.    pFKey->a
fc40: 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70  Col[0].iFrom = p
fc50: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73  ->nCol-1;.  }els
fc60: 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e{.    for(i=0; 
fc70: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
fc80: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
fc90: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
fca0: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
fcb0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
fcc0: 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d  rICmp(p->aCol[j]
fcd0: 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c  .zName, pFromCol
fce0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
fcf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
fd00: 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72  Key->aCol[i].iFr
fd10: 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  om = j;.        
fd20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
fd30: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
fd40: 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20   if( j>=p->nCol 
fd50: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
fd60: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
fd70: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75  e, .          "u
fd80: 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22  nknown column \"
fd90: 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20  %s\" in foreign 
fda0: 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c  key definition",
fdb0: 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f   .          pFro
fdc0: 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
fdd0: 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
fde0: 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  fk_end;.      }.
fdf0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
fe00: 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
fe10: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
fe20: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ++){.      int n
fe30: 20 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c   = strlen(pToCol
fe40: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
fe50: 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c       pFKey->aCol
fe60: 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20  [i].zCol = z;.  
fe70: 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54      memcpy(z, pT
fe80: 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
fe90: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d  , n);.      z[n]
fea0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d   = 0;.      z +=
feb0: 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n+1;.    }.  }.
fec0: 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
fed0: 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79  red = 0;.  pFKey
fee0: 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20 66  ->deleteConf = f
fef0: 6c 61 67 73 20 26 20 30 78 66 66 3b 0a 20 20 70  lags & 0xff;.  p
ff00: 46 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66  FKey->updateConf
ff10: 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 38 20 29   = (flags >> 8 )
ff20: 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79   & 0xff;.  pFKey
ff30: 2d 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28  ->insertConf = (
ff40: 66 6c 61 67 73 20 3e 3e 20 31 36 20 29 20 26 20  flags >> 16 ) & 
ff50: 30 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b  0xff;..  /* Link
ff60: 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
ff70: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73   to the table as
ff80: 20 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a   the last step..
ff90: 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20    */.  p->pFKey 
ffa0: 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79  = pFKey;.  pFKey
ffb0: 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20   = 0;..fk_end:. 
ffc0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65   sqliteFree(pFKe
ffd0: 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  y);.#endif /* !d
ffe0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
fff0: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20  IT_FOREIGN_KEY) 
10000 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
10010 4c 69 73 74 44 65 6c 65 74 65 28 70 46 72 6f 6d  ListDelete(pFrom
10020 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Col);.  sqlite3E
10030 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 54  xprListDelete(pT
10040 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  oCol);.}../*.** 
10050 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10060 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49  called when an I
10070 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
10080 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  TE or INITIALLY 
10090 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75  DEFERRED.** clau
100a0 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61  se is seen as pa
100b0 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20  rt of a foreign 
100c0 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20  key definition. 
100d0 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a   The isDeferred.
100e0 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
100f0 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  1 for INITIALLY 
10100 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66  DEFERRED and 0 f
10110 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  or INITIALLY IMM
10120 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62  EDIATE..** The b
10130 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d  ehavior of the m
10140 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65  ost recently cre
10150 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  ated foreign key
10160 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20   is adjusted.** 
10170 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a  accordingly..*/.
10180 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 65  void sqlite3Defe
10190 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73  rForeignKey(Pars
101a0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
101b0 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e  sDeferred){.#ifn
101c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
101d0 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61  FOREIGN_KEY.  Ta
101e0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65  ble *pTab;.  FKe
101f0 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20  y *pFKey;.  if( 
10200 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  (pTab = pParse->
10210 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c  pNewTable)==0 ||
10220 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e   (pFKey = pTab->
10230 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75  pFKey)==0 ) retu
10240 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44  rn;.  pFKey->isD
10250 65 66 65 72 72 65 64 20 3d 20 69 73 44 65 66 65  eferred = isDefe
10260 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rred;.#endif.}..
10270 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
10280 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72  ode that will er
10290 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69  ase and refill i
102a0 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69  ndex *pIdx.  Thi
102b0 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  s is.** used to 
102c0 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
102d0 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 65 78  ly created index
102e0 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65   or to recompute
102f0 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
10300 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72  of an index in r
10310 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49  esponse to a REI
10320 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
10330 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61  .** if memRootPa
10340 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69  ge is not negati
10350 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ve, it means tha
10360 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e  t the index is n
10370 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e  ewly.** created.
10380 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c    The memory cel
10390 6c 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d  l specified by m
103a0 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61  emRootPage conta
103b0 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20  ins the.** root 
103c0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
103d0 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65  he index.  If me
103e0 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67  mRootPage is neg
103f0 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  ative, then.** t
10400 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  he index already
10410 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74   exists and must
10420 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f   be cleared befo
10430 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65  re being refille
10440 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f  d and.** the roo
10450 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
10460 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61   the index is ta
10470 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d  ken from pIndex-
10480 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  >tnum..*/.static
10490 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66   void sqlite3Ref
104a0 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a  illIndex(Parse *
104b0 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
104c0 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f  Index, int memRo
104d0 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65  otPage){.  Table
104e0 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
104f0 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65  >pTable;  /* The
10500 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69   table that is i
10510 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
10520 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iTab = pParse->n
10530 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 42 74  Tab;       /* Bt
10540 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  ree cursor used 
10550 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e  for pTab */.  in
10560 74 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d  t iIdx = pParse-
10570 3e 6e 54 61 62 2b 31 3b 20 20 20 20 20 2f 2a 20  >nTab+1;     /* 
10580 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65  Btree cursor use
10590 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a  d for pIndex */.
105a0 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
105b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105c0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
105d0 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20  op of loop */.  
105e0 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20  int tnum;       
105f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10600 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  * Root page of i
10610 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ndex */.  Vdbe *
10620 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
10630 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
10640 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
10650 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
10660 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 55  ine */.  int isU
10670 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20 20 20  nique;          
10680 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
10690 66 6f 72 20 61 20 75 6e 69 71 75 65 20 69 6e 64  for a unique ind
106a0 65 78 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ex */..#ifndef S
106b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
106c0 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73  RIZATION.  if( s
106d0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
106e0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52  pParse, SQLITE_R
106f0 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e  EINDEX, pIndex->
10700 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20  zName, 0,.      
10710 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
10720 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61  pIndex->iDb].zNa
10730 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75  me ) ){.    retu
10740 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
10750 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 6c 6c 20    /* Ensure all 
10760 74 68 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c  the required col
10770 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
10780 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20   are available. 
10790 54 68 69 73 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  This.  ** routin
107a0 65 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68  e will invoke th
107b0 65 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 65 65 64  e collation-need
107c0 65 64 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 6e  ed callback if n
107d0 65 63 65 73 73 61 72 79 20 28 61 6e 64 0a 20 20  ecessary (and.  
107e0 2a 2a 20 69 66 20 6f 6e 65 20 68 61 73 20 62 65  ** if one has be
107f0 65 6e 20 72 65 67 69 73 74 65 72 65 64 29 2e 0a  en registered)..
10800 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
10810 65 33 43 68 65 63 6b 49 6e 64 65 78 43 6f 6c 6c  e3CheckIndexColl
10820 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 6e 64  Seq(pParse, pInd
10830 65 78 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ex) ){.    retur
10840 6e 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71  n;.  }..  v = sq
10850 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
10860 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
10870 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
10880 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20   memRootPage>=0 
10890 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
108a0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
108b0 6d 4c 6f 61 64 2c 20 6d 65 6d 52 6f 6f 74 50 61  mLoad, memRootPa
108c0 67 65 2c 20 30 29 3b 0a 20 20 20 20 74 6e 75 6d  ge, 0);.    tnum
108d0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
108e0 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78     tnum = pIndex
108f0 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 73 71 6c 69  ->tnum;.    sqli
10900 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10910 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20  OP_Clear, tnum, 
10920 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20  pIndex->iDb);.  
10930 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
10940 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
10950 65 72 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 2c  er, pIndex->iDb,
10960 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
10970 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  beOp3(v, OP_Open
10980 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75  Write, iIdx, tnu
10990 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
109a0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 70         (char*)&p
109b0 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20  Index->keyInfo, 
109c0 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73  P3_KEYINFO);.  s
109d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
109e0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
109f0 54 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20  Tab->iDb, 0);.  
10a00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10a10 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
10a20 20 69 54 61 62 2c 20 70 54 61 62 2d 3e 74 6e 75   iTab, pTab->tnu
10a30 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  m);.  sqlite3Vdb
10a40 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
10a50 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 54 61 62  NumColumns, iTab
10a60 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20  , pTab->nCol);. 
10a70 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
10a80 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10a90 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29  Rewind, iTab, 0)
10aa0 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72  ;.  sqlite3Gener
10ab0 61 74 65 49 6e 64 65 78 4b 65 79 28 76 2c 20 70  ateIndexKey(v, p
10ac0 49 6e 64 65 78 2c 20 69 54 61 62 29 3b 0a 20 20  Index, iTab);.  
10ad0 69 73 55 6e 69 71 75 65 20 3d 20 70 49 6e 64 65  isUnique = pInde
10ae0 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
10af0 6f 6e 65 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  one;.  sqlite3Vd
10b00 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
10b10 78 50 75 74 2c 20 69 49 64 78 2c 20 69 73 55 6e  xPut, iIdx, isUn
10b20 69 71 75 65 29 3b 0a 20 20 69 66 28 20 69 73 55  ique);.  if( isU
10b30 6e 69 71 75 65 20 29 7b 0a 20 20 20 20 73 71 6c  nique ){.    sql
10b40 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
10b50 28 76 2c 20 2d 31 2c 20 22 69 6e 64 65 78 65 64  (v, -1, "indexed
10b60 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74   columns are not
10b70 20 75 6e 69 71 75 65 22 2c 20 50 33 5f 53 54 41   unique", P3_STA
10b80 54 49 43 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  TIC);.  }.  sqli
10b90 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10ba0 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  OP_Next, iTab, a
10bb0 64 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74  ddr1+1);.  sqlit
10bc0 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
10bd0 2c 20 61 64 64 72 31 2c 20 73 71 6c 69 74 65 33  , addr1, sqlite3
10be0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
10bf0 76 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  v));.  sqlite3Vd
10c00 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
10c10 6f 73 65 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20  ose, iTab, 0);. 
10c20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10c30 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  p(v, OP_Close, i
10c40 49 64 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Idx, 0);.}../*.*
10c50 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69  * Create a new i
10c60 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20  ndex for an SQL 
10c70 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70  table.  pName1.p
10c80 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d  Name2 is the nam
10c90 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a  e of the index .
10ca0 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20  ** and pTblList 
10cb0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
10cc0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
10cd0 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
10ce0 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62   Both will .** b
10cf0 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69  e NULL for a pri
10d00 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69  mary key or an i
10d10 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65  ndex that is cre
10d20 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  ated to satisfy 
10d30 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73  a.** UNIQUE cons
10d40 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62  traint.  If pTab
10d50 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72  le and pIndex ar
10d60 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72  e NULL, use pPar
10d70 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a  se->pNewTable.**
10d80 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f   as the table to
10d90 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50   be indexed.  pP
10da0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
10db0 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  is a table that 
10dc0 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  is.** currently 
10dd0 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
10de0 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41  d by a CREATE TA
10df0 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
10e00 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20  *.** pList is a 
10e10 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
10e20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
10e30 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55  pList will be NU
10e40 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73  LL if this.** is
10e50 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
10e60 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61  r unique-constra
10e70 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20  int on the most 
10e80 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64  recent column ad
10e90 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61  ded.** to the ta
10ea0 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
10eb0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
10ec0 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .  .*/.void sqli
10ed0 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a  te3CreateIndex(.
10ee0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
10ef0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f       /* All info
10f00 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
10f10 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f  is parse */.  To
10f20 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
10f30 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
10f40 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
10f50 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  y be NULL */.  T
10f60 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
10f70 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
10f80 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20   of index name. 
10f90 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
10fa0 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61   SrcList *pTblNa
10fb0 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20  me, /* Table to 
10fc0 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73  index. Use pPars
10fd0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20  e->pNewTable if 
10fe0 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  0 */.  ExprList 
10ff0 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c  *pList,   /* A l
11000 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
11010 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
11020 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
11030 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74       /* OE_Abort
11040 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f  , OE_Ignore, OE_
11050 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e  Replace, or OE_N
11060 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  one */.  Token *
11070 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54  pStart,     /* T
11080 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20  he CREATE token 
11090 74 68 61 74 20 62 65 67 69 6e 73 20 61 20 43 52  that begins a CR
110a0 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
110b0 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
110c0 2a 70 45 6e 64 20 20 20 20 20 20 20 20 2f 2a 20  *pEnd        /* 
110d0 54 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f  The ")" that clo
110e0 73 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49  ses the CREATE I
110f0 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
11100 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
11110 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 54 61 62  ab = 0;   /* Tab
11120 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
11130 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
11140 64 65 78 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20  dex = 0; /* The 
11150 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61  index to be crea
11160 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ted */.  char *z
11170 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Name = 0;.  int 
11180 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75  i, j;.  Token nu
11190 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b 65  llId;    /* Fake
111a0 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d   token for an em
111b0 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20  pty ID list */. 
111c0 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20   DbFixer sFix;  
111d0 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69    /* For assigni
111e0 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ng database name
111f0 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20  s to pTable */. 
11200 20 69 6e 74 20 69 73 54 65 6d 70 3b 20 20 20 20   int isTemp;    
11210 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
11220 74 65 6d 70 6f 72 61 72 79 20 69 6e 64 65 78 20  temporary index 
11230 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
11240 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
11250 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
11260 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
11270 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
11280 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  t is being writt
11290 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  en */.  Token *p
112a0 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 55 6e 71  Name = 0; /* Unq
112b0 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66  ualified name of
112c0 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72   the index to cr
112d0 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70  eate */..  if( p
112e0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
112f0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
11300 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74  iled ) goto exit
11310 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
11320 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
11330 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
11340 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
11350 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66   Return early if
11360 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
11370 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21  .  if( pTblName!
11380 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73  =0 ){..    /* Us
11390 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69  e the two-part i
113a0 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74  ndex name to det
113b0 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62  ermine the datab
113c0 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73  ase .    ** to s
113d0 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61  earch for the ta
113e0 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74  ble. 'Fix' the t
113f0 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69  able name to thi
11400 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f  s db.    ** befo
11410 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68  re looking up th
11420 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
11430 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
11440 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a  e1 && pName2 );.
11450 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
11460 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
11470 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
11480 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
11490 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f    if( iDb<0 ) go
114a0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
114b0 6e 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ndex;..    /* If
114c0 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20   the index name 
114d0 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c  was unqualified,
114e0 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 68   check if the th
114f0 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  e table.    ** i
11500 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20  s a temp table. 
11510 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64  If so, set the d
11520 61 74 61 62 61 73 65 20 74 6f 20 31 2e 0a 20 20  atabase to 1..  
11530 20 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20    */.    pTab = 
11540 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f  sqlite3SrcListLo
11550 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 62  okup(pParse, pTb
11560 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  lName);.    if( 
11570 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32  pName2 && pName2
11580 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26  ->n==0 && pTab &
11590 26 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31 20 29  & pTab->iDb==1 )
115a0 7b 0a 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b  {.      iDb = 1;
115b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
115c0 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
115d0 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
115e0 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d  b, "index", pNam
115f0 65 29 20 26 26 0a 20 20 20 20 20 20 20 20 73 71  e) &&.        sq
11600 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28  lite3FixSrcList(
11610 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29  &sFix, pTblName)
11620 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
11630 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
11640 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
11650 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
11660 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
11670 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d  , pTblName->a[0]
11680 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  .zName, .       
11690 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e   pTblName->a[0].
116a0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
116b0 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f  if( !pTab ) goto
116c0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
116d0 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
116e0 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29  iDb==pTab->iDb )
116f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
11700 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20  ssert( pName==0 
11710 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70  );.    pTab =  p
11720 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
11730 3b 0a 20 20 20 20 69 44 62 20 3d 20 70 54 61 62  ;.    iDb = pTab
11740 2d 3e 69 44 62 3b 0a 20 20 7d 0a 0a 20 20 69 66  ->iDb;.  }..  if
11750 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61  ( pTab==0 || pPa
11760 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
11770 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
11780 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  ex;.  if( pTab->
11790 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
117a0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
117b0 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
117c0 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
117d0 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  exed", pTab->zNa
117e0 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
117f0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
11800 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
11810 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
11820 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
11830 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
11840 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11850 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20   "views may not 
11860 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
11870 20 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 23 65  te_index;.  }.#e
11890 6e 64 69 66 0a 20 20 69 73 54 65 6d 70 20 3d 20  ndif.  isTemp = 
118a0 70 54 61 62 2d 3e 69 44 62 3d 3d 31 3b 0a 0a 20  pTab->iDb==1;.. 
118b0 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
118c0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
118d0 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  dex.  Make sure 
118e0 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72  there is not alr
118f0 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a  eady another.  *
11900 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
11910 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
11920 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ame.  .  **.  **
11930 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20   Exception:  If 
11940 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
11950 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d  he names of perm
11960 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72  anent indices fr
11970 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  om the.  ** sqli
11980 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
11990 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74  (because some ot
119a0 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e  her process chan
119b0 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20  ged the schema) 
119c0 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20  and.  ** one of 
119d0 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  the index names 
119e0 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68  collides with th
119f0 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70  e name of a temp
11a00 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20  orary table or. 
11a10 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20   ** index, then 
11a20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
11a30 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73   to process this
11a40 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a   index..  **.  *
11a50 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74  * If pName==0 it
11a60 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61   means that we a
11a70 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20  re.  ** dealing 
11a80 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b  with a primary k
11a90 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ey or UNIQUE con
11aa0 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76  straint.  We hav
11ab0 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a  e to invent our.
11ac0 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20    ** own name.. 
11ad0 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20   */.  if( pName 
11ae0 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
11af0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
11b00 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20  ken(pName);.    
11b10 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
11b20 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
11b30 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20  (pParse) ) goto 
11b40 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
11b50 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  x;.    if( zName
11b60 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
11b70 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11b80 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
11b90 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
11ba0 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
11bb0 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
11bc0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
11bd0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
11be0 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
11bf0 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 49 6e  busy ){.      In
11c00 64 65 78 20 2a 70 49 53 61 6d 65 4e 61 6d 65 3b  dex *pISameName;
11c10 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 69      /* Another i
11c20 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 73 61  ndex with the sa
11c30 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  me name */.     
11c40 20 54 61 62 6c 65 20 2a 70 54 53 61 6d 65 4e 61   Table *pTSameNa
11c50 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74 61 62 6c  me;    /* A tabl
11c60 65 20 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65  e with same name
11c70 20 61 73 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   as the index */
11c80 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
11c90 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
11ca0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
11cb0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
11cc0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
11cd0 69 66 28 20 28 70 49 53 61 6d 65 4e 61 6d 65 20  if( (pISameName 
11ce0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
11cf0 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62  ex(db, zName, db
11d00 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
11d10 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
11d20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11d30 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
11d40 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %s already exist
11d50 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
11d60 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
11d70 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
11d80 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70    }.      if( (p
11d90 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69  TSameName = sqli
11da0 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
11db0 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 29   zName, 0))!=0 )
11dc0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
11dd0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
11de0 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
11df0 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65  ady a table name
11e00 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  d %s", zName);. 
11e10 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
11e20 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
11e30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11e40 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a  else{.    char z
11e50 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74  Buf[30];.    int
11e60 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   n;.    Index *p
11e70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c  Loop;.    for(pL
11e80 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  oop=pTab->pIndex
11e90 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c  , n=1; pLoop; pL
11ea0 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74  oop=pLoop->pNext
11eb0 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72  , n++){}.    spr
11ec0 69 6e 74 66 28 7a 42 75 66 2c 22 5f 25 64 22 2c  intf(zBuf,"_%d",
11ed0 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  n);.    zName = 
11ee0 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  0;.    sqlite3Se
11ef0 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20  tString(&zName, 
11f00 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65  "sqlite_autoinde
11f10 78 5f 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  x_", pTab->zName
11f20 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30  , zBuf, (char*)0
11f30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
11f40 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
11f50 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11f60 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
11f70 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  r authorization 
11f80 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  to create an ind
11f90 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ex..  */.#ifndef
11fa0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
11fb0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
11fc0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11fd0 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61  Db = db->aDb[pTa
11fe0 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  b->iDb].zName;. 
11ff0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
12000 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
12010 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
12020 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65  CHEMA_TABLE(isTe
12030 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  mp), 0, zDb) ){.
12040 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
12050 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
12060 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49    }.    i = SQLI
12070 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b  TE_CREATE_INDEX;
12080 0a 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20  .    if( isTemp 
12090 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ) i = SQLITE_CRE
120a0 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ATE_TEMP_INDEX;.
120b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
120c0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
120d0 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d   i, zName, pTab-
120e0 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
120f0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
12100 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
12110 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
12120 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30    /* If pList==0
12130 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  , it means this 
12140 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
12150 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69  ed to make a pri
12160 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75  mary.  ** key ou
12170 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f  t of the last co
12180 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68  lumn added to th
12190 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
121a0 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a  nstruction..  **
121b0 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b   So create a fak
121c0 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61  e list to simula
121d0 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20  te this..  */.  
121e0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
121f0 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70      nullId.z = p
12200 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e  Tab->aCol[pTab->
12210 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20  nCol-1].zName;. 
12220 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74     nullId.n = st
12230 72 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a  rlen(nullId.z);.
12240 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
12250 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
12260 64 28 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29  d(0, 0, &nullId)
12270 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
12280 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
12290 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
122a0 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c  ..  /* .  ** All
122b0 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
122c0 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f  structure. .  */
122d0 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
122e0 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
122f0 28 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e  (Index) + strlen
12300 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20 20  (zName) + 1 +.  
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12320 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 69 6e        (sizeof(in
12330 74 29 20 2b 20 73 69 7a 65 6f 66 28 43 6f 6c 6c  t) + sizeof(Coll
12340 53 65 71 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e 45  Seq*))*pList->nE
12350 78 70 72 20 29 3b 0a 20 20 69 66 28 20 70 49 6e  xpr );.  if( pIn
12360 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  dex==0 ) goto ex
12370 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
12380 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  .  pIndex->aiCol
12390 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e  umn = (int*)&pIn
123a0 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  dex->keyInfo.aCo
123b0 6c 6c 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d  ll[pList->nExpr]
123c0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ;.  pIndex->zNam
123d0 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64  e = (char*)&pInd
123e0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69  ex->aiColumn[pLi
123f0 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 73 74  st->nExpr];.  st
12400 72 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61  rcpy(pIndex->zNa
12410 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49  me, zName);.  pI
12420 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70  ndex->pTable = p
12430 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e  Tab;.  pIndex->n
12440 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e  Column = pList->
12450 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d  nExpr;.  pIndex-
12460 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72  >onError = onErr
12470 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75  or;.  pIndex->au
12480 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d  toIndex = pName=
12490 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44  =0;.  pIndex->iD
124a0 62 20 3d 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 53  b = iDb;..  /* S
124b0 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  can the names of
124c0 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
124d0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
124e0 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a  indexed and.  **
124f0 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e   load the column
12500 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68   indices into th
12510 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  e Index structur
12520 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72  e.  Report an er
12530 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  ror.  ** if any 
12540 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f  column is not fo
12550 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  und..  */.  for(
12560 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
12570 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66  xpr; i++){.    f
12580 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
12590 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
125a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
125b0 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
125c0 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43  .zName, pTab->aC
125d0 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ol[j].zName)==0 
125e0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
125f0 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e     if( j>=pTab->
12600 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  nCol ){.      sq
12610 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
12620 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
12630 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61  has no column na
12640 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20  med %s",.       
12650 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c   pTab->zName, pL
12660 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
12670 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
12680 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12690 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
126a0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
126b0 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  j;.    if( pList
126c0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 29 7b 0a  ->a[i].pExpr ){.
126d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
126e0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d  ist->a[i].pExpr-
126f0 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20  >pColl );.      
12700 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e  pIndex->keyInfo.
12710 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 4c 69 73 74  aColl[i] = pList
12720 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43  ->a[i].pExpr->pC
12730 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  oll;.    }else{.
12740 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65        pIndex->ke
12750 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d  yInfo.aColl[i] =
12760 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70   pTab->aCol[j].p
12770 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Coll;.    }.    
12780 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e  assert( pIndex->
12790 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d  keyInfo.aColl[i]
127a0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d   );.    if( !db-
127b0 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 0a 20  >init.busy && . 
127c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68         sqlite3Ch
127d0 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
127e0 65 2c 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  e, pIndex->keyIn
127f0 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 0a 20 20  fo.aColl[i]) .  
12800 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
12810 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12820 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  x;.    }.  }.  p
12830 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e  Index->keyInfo.n
12840 46 69 65 6c 64 20 3d 20 70 4c 69 73 74 2d 3e 6e  Field = pList->n
12850 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 54 61  Expr;..  if( pTa
12860 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  b==pParse->pNewT
12870 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  able ){.    /* T
12880 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
12890 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63  been called to c
128a0 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74  reate an automat
128b0 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20  ic index as a.  
128c0 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61    ** result of a
128d0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
128e0 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e  UNIQUE clause on
128f0 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69   a column defini
12900 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  tion, or.    ** 
12910 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
12920 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66   UNIQUE clause f
12930 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c  ollowing the col
12940 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e  umn definitions.
12950 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65  .    ** i.e. one
12960 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
12970 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
12980 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  t(x PRIMARY KEY,
12990 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41   y);.    ** CREA
129a0 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c  TE TABLE t(x, y,
129b0 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a   UNIQUE(x, y));.
129c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69      **.    ** Ei
129d0 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20  ther way, check 
129e0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61  to see if the ta
129f0 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20  ble already has 
12a00 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49  such an index. I
12a10 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e  f.    ** so, don
12a20 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69  't bother creati
12a30 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69  ng this one. Thi
12a40 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74  s only applies t
12a50 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74  o.    ** automat
12a60 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69  ically created i
12a70 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61  ndices. Users ca
12a80 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73  n do as they wis
12a90 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78  h with.    ** ex
12aa0 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a  plicit indices..
12ab0 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78      */.    Index
12ac0 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
12ad0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
12ae0 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
12af0 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
12b00 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61    int k;.      a
12b10 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45  ssert( pIdx->onE
12b20 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b  rror!=OE_None );
12b30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
12b40 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29  Idx->autoIndex )
12b50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12b60 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
12b70 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20  =OE_None );..   
12b80 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f     if( pIdx->nCo
12b90 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43  lumn!=pIndex->nC
12ba0 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65  olumn ) continue
12bb0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b  ;.      for(k=0;
12bc0 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   k<pIdx->nColumn
12bd0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
12be0 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
12bf0 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61  mn[k]!=pIndex->a
12c00 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65  iColumn[k] ) bre
12c10 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ak;.        if( 
12c20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  pIdx->keyInfo.aC
12c30 6f 6c 6c 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e  oll[k]!=pIndex->
12c40 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d  keyInfo.aColl[k]
12c50 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
12c60 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70  }.      if( k==p
12c70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  Idx->nColumn ){.
12c80 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
12c90 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65  ->onError!=pInde
12ca0 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20  x->onError ){.  
12cb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
12cc0 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74  constraint creat
12cd0 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65  es the same inde
12ce0 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a  x as a previous.
12cf0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
12d00 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65  straint specifie
12d10 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74  d somewhere in t
12d20 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
12d30 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
12d40 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20       ** However 
12d50 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  the ON CONFLICT 
12d60 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66  clauses are diff
12d70 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74  erent. If both t
12d80 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  his .          *
12d90 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  * constraint and
12da0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71   the previous eq
12db0 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61  uivalent constra
12dc0 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69  int have explici
12dd0 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f  t.          ** O
12de0 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
12df0 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72  es this is an er
12e00 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ror. Otherwise, 
12e10 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  use the.        
12e20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20    ** explicitly 
12e30 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69  specified behavi
12e40 6f 75 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65  our for the inde
12e50 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  x..          */.
12e60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28            if( !(
12e70 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
12e80 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e  E_Default || pIn
12e90 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
12ea0 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20  _Default) ){.   
12eb0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12ec0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
12ed0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
12ee0 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f    "conflicting O
12ef0 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
12f00 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30  es specified", 0
12f10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
12f20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
12f30 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
12f40 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
12f50 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72        pIdx->onEr
12f60 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e  ror = pIndex->on
12f70 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Error;.         
12f80 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
12f90 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
12fa0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
12fb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
12fc0 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65    /* Link the ne
12fd0 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  w Index structur
12fe0 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61  e to its table a
12ff0 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a  nd to the other.
13000 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    ** in-memory d
13010 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
13020 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  es. .  */.  if( 
13030 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
13040 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20  .    Index *p;. 
13050 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
13060 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44  shInsert(&db->aD
13070 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 69  b[pIndex->iDb].i
13080 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20  dxHash, .       
13090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130a0 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c    pIndex->zName,
130b0 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e   strlen(pIndex->
130c0 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78  zName)+1, pIndex
130d0 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
130e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
130f0 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d  =pIndex );  /* M
13100 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
13110 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
13120 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
13130 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
13140 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
13150 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
13160 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62  ges;.    if( pTb
13170 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  lName!=0 ){.    
13180 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
13190 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
131a0 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  m;.    }.  }..  
131b0 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
131c0 69 74 2e 62 75 73 79 20 69 73 20 30 20 74 68 65  it.busy is 0 the
131d0 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64  n create the ind
131e0 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69  ex on disk.  Thi
131f0 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20  s.  ** involves 
13200 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65  writing the inde
13210 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65  x into the maste
13220 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c  r table and fill
13230 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ing in the.  ** 
13240 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63  index with the c
13250 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e  urrent table con
13260 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tents..  **.  **
13270 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   The db->init.bu
13280 73 79 20 69 73 20 30 20 77 68 65 6e 20 74 68 65  sy is 0 when the
13290 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65   user first ente
132a0 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45  rs a CREATE INDE
132b0 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e  X .  ** command.
132c0 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20    db->init.busy 
132d0 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61  is 1 when a data
132e0 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61  base is opened a
132f0 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20  nd .  ** CREATE 
13300 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73  INDEX statements
13310 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66   are read out of
13320 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
13330 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20  e.  In.  ** the 
13340 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20  latter case the 
13350 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
13360 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68  ists on disk, wh
13370 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20  ich is why.  ** 
13380 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  we don't want to
13390 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20   recreate it..  
133a0 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e  **.  ** If pTblN
133b0 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
133c0 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65  this index is ge
133d0 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72 69  nerated as a pri
133e0 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72  mary key.  ** or
133f0 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
13400 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20 54  nt of a CREATE T
13410 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
13420 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65   Since the table
13430 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62  .  ** has just b
13440 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20  een created, it 
13450 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
13460 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
13470 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
13480 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73  ** step can be s
13490 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  kipped..  */.  e
134a0 6c 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  lse if( db->init
134b0 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20  .busy==0 ){.    
134c0 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61  Vdbe *v;.    cha
134d0 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e  r *zStmt;.    in
134e0 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  t iMem = pParse-
134f0 3e 6e 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 76 20  >nMem++;..    v 
13500 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
13510 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
13520 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ( v==0 ) goto ex
13530 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13540 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
13550 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72  the rootpage for
13560 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a   the index.    *
13570 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  /.    sqlite3Beg
13580 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
13590 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
135a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
135b0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65  eAddOp(v, OP_Cre
135c0 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 30  ateIndex, iDb, 0
135d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
135e0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
135f0 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29  mStore, iMem, 0)
13600 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72  ;..    /* Gather
13610 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
13620 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
13630 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
13640 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65   into.    ** the
13650 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a   zStmt variable.
13660 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
13670 53 74 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b  Start && pEnd ){
13680 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65  .      /* A name
13690 64 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20  d index with an 
136a0 65 78 70 6c 69 63 69 74 20 43 52 45 41 54 45 20  explicit CREATE 
136b0 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
136c0 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  */.      zStmt =
136d0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
136e0 22 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20  "CREATE%s INDEX 
136f0 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f  %.*s",.        o
13700 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
13710 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22  ? "" : " UNIQUE"
13720 2c 0a 20 20 20 20 20 20 20 20 41 64 64 72 28 70  ,.        Addr(p
13730 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70  End->z) - Addr(p
13740 4e 61 6d 65 2d 3e 7a 29 20 2b 20 31 2c 0a 20 20  Name->z) + 1,.  
13750 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b        pName->z);
13760 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13770 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69    /* An automati
13780 63 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20  c index created 
13790 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  by a PRIMARY KEY
137a0 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
137b0 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f  raint */.      /
137c0 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  * zStmt = sqlite
137d0 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f  3MPrintf(""); */
137e0 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30  .      zStmt = 0
137f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
13800 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  Add an entry in 
13810 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f  sqlite_master fo
13820 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20  r this index.   
13830 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
13840 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
13850 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53  e, .        "INS
13860 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56  ERT INTO %Q.%s V
13870 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51  ALUES('index',%Q
13880 2c 25 51 2c 23 30 2c 25 51 29 3b 22 2c 0a 20 20  ,%Q,#0,%Q);",.  
13890 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
138a0 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
138b0 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
138c0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
138d0 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  me,.        pTab
138e0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
138f0 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20   zStmt.    );.  
13900 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13910 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
13920 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46   0);.    sqliteF
13930 72 65 65 28 7a 53 74 6d 74 29 3b 0a 0a 20 20 20  ree(zStmt);..   
13940 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64   /* Fill the ind
13950 65 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64  ex with data and
13960 20 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68   reparse the sch
13970 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f  ema. Code an OP_
13980 45 78 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f  Expire.    ** to
13990 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
139a0 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61  pre-compiled sta
139b0 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a  tements..    */.
139c0 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
139d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
139e0 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
139f0 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65  rse, pIndex, iMe
13a00 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
13a10 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  3ChangeCookie(db
13a20 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  , v, iDb);.     
13a30 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
13a40 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  v, OP_ParseSchem
13a50 61 2c 20 69 44 62 2c 20 30 2c 0a 20 20 20 20 20  a, iDb, 0,.     
13a60 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
13a70 74 66 28 22 6e 61 6d 65 3d 27 25 71 27 22 2c 20  tf("name='%q'", 
13a80 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20  pIndex->zName), 
13a90 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P3_DYNAMIC);.   
13aa0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13ab0 64 4f 70 28 76 2c 20 4f 50 5f 45 78 70 69 72 65  dOp(v, OP_Expire
13ac0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
13ad0 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64   }..  /* When ad
13ae0 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f  ding an index to
13af0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64   the list of ind
13b00 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ices for a table
13b10 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  , make.  ** sure
13b20 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62   all indices lab
13b30 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20  eled OE_Replace 
13b40 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74  come after all t
13b50 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a  hose labeled.  *
13b60 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68  * OE_Ignore.  Th
13b70 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
13b80 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20  for the correct 
13b90 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44  operation of UPD
13ba0 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53  ATE.  ** and INS
13bb0 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ERT..  */.  if( 
13bc0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
13bd0 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a   pTblName==0 ){.
13be0 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21      if( onError!
13bf0 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70  =OE_Replace || p
13c00 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20  Tab->pIndex==0. 
13c10 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d          || pTab-
13c20 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  >pIndex->onError
13c30 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20  ==OE_Replace){. 
13c40 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
13c50 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  xt = pTab->pInde
13c60 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70  x;.      pTab->p
13c70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
13c80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13c90 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d   Index *pOther =
13ca0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
13cb0 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68       while( pOth
13cc0 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74  er->pNext && pOt
13cd0 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72  her->pNext->onEr
13ce0 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
13cf0 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65  ){.        pOthe
13d00 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  r = pOther->pNex
13d10 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
13d20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
13d30 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
13d40 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e        pOther->pN
13d50 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  ext = pIndex;.  
13d60 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 20 3d    }.    pIndex =
13d70 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c   0;.  }..  /* Cl
13d80 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78  ean up before ex
13d90 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72  iting */.exit_cr
13da0 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66  eate_index:.  if
13db0 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
13dc0 66 72 65 65 49 6e 64 65 78 28 70 49 6e 64 65 78  freeIndex(pIndex
13dd0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
13de0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
13df0 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
13e00 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54  SrcListDelete(pT
13e10 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  blName);.  sqlit
13e20 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
13e30 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
13e40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
13e50 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74  ll drop an exist
13e60 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e  ing named index.
13e70 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
13e80 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  * implements the
13e90 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74   DROP INDEX stat
13ea0 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
13eb0 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28  qlite3DropIndex(
13ec0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
13ed0 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 29 7b 0a  rcList *pName){.
13ee0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
13ef0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
13f00 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
13f10 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
13f20 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
13f30 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
13f40 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
13f50 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
13f60 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28  nSrc==1 );.  if(
13f70 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
13f80 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
13f90 61 72 73 65 29 20 29 20 72 65 74 75 72 6e 3b 0a  arse) ) return;.
13fa0 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
13fb0 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
13fc0 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
13fd0 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
13fe0 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
13ff0 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20   pIndex==0 ){.  
14000 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
14010 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
14020 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70  ch index: %S", p
14030 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50  Name, 0);.    pP
14040 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
14050 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  a = 1;.    goto 
14060 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
14070 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65  .  }.  if( pInde
14080 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a  x->autoIndex ){.
14090 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
140a0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
140b0 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
140c0 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20  th UNIQUE ".    
140d0 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45    "or PRIMARY KE
140e0 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Y constraint can
140f0 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
14100 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78   0);.    goto ex
14110 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
14120 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
14130 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
14140 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
14150 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
14160 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54  ROP_INDEX;.    T
14170 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
14180 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  dex->pTable;.   
14190 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
141a0 20 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65   = db->aDb[pInde
141b0 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  x->iDb].zName;. 
141c0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
141d0 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
141e0 4c 45 28 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b  LE(pIndex->iDb);
141f0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14200 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
14210 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
14220 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29   zTab, 0, zDb) )
14230 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
14240 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
14250 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 64    }.    if( pInd
14260 65 78 2d 3e 69 44 62 20 29 20 63 6f 64 65 20 3d  ex->iDb ) code =
14270 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
14280 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
14290 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
142a0 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
142b0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70  pIndex->zName, p
142c0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
142d0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
142e0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
142f0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
14300 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
14310 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
14320 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f  he index and fro
14330 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
14340 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  le */.  v = sqli
14350 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
14360 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
14370 20 20 20 69 6e 74 20 69 44 62 20 3d 20 70 49 6e     int iDb = pIn
14380 64 65 78 2d 3e 69 44 62 3b 0a 20 20 20 20 73 71  dex->iDb;.    sq
14390 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
143a0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
143b0 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
143c0 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  %s WHERE name=%Q
143d0 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ",.       db->aD
143e0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
143f0 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
14400 0a 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  .       pIndex->
14410 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20  zName.    );.   
14420 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
14430 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29  okie(db, v, iDb)
14440 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  ;.    destroyRoo
14450 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
14460 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  ndex->tnum, iDb)
14470 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14480 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 49  eOp3(v, OP_DropI
14490 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 70 49  ndex, iDb, 0, pI
144a0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  ndex->zName, 0);
144b0 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  .  }..exit_drop_
144c0 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33  index:.  sqlite3
144d0 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e  SrcListDelete(pN
144e0 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ame);.}../*.** A
144f0 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d  ppend a new elem
14500 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ent to the given
14510 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65   IdList.  Create
14520 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66   a new IdList if
14530 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a  .** need be..**.
14540 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20  ** A new IdList 
14550 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
14560 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
14570 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73   fails..*/.IdLis
14580 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
14590 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a 70  Append(IdList *p
145a0 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
145b0 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ken){.  if( pLis
145c0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
145d0 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
145e0 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29  ( sizeof(IdList)
145f0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
14600 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
14610 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
14620 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  oc = 0;.  }.  if
14630 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3e 3d 70 4c  ( pList->nId>=pL
14640 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  ist->nAlloc ){. 
14650 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
14660 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 70 4c  _item *a;.    pL
14670 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4c  ist->nAlloc = pL
14680 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  ist->nAlloc*2 + 
14690 35 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  5;.    a = sqlit
146a0 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e  eRealloc(pList->
146b0 61 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  a, pList->nAlloc
146c0 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61  *sizeof(pList->a
146d0 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
146e0 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  a==0 ){.      sq
146f0 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
14700 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
14710 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
14720 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61      pList->a = a
14730 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
14740 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
14750 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  nId], 0, sizeof(
14760 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
14770 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d   pList->a[pList-
14780 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >nId].zName = sq
14790 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
147a0 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20 20 70 4c  en(pToken);.  pL
147b0 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65  ist->nId++;.  re
147c0 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
147d0 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
147e0 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  w table name to 
147f0 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73  the given SrcLis
14800 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
14810 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e   SrcList if.** n
14820 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65  eed be.  A new e
14830 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20  ntry is created 
14840 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65  in the SrcList e
14850 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73  ven if pToken is
14860 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e   NULL..**.** A n
14870 65 77 20 53 72 63 4c 69 73 74 20 69 73 20 72 65  ew SrcList is re
14880 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
14890 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  if malloc() fail
148a0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74  s..**.** If pDat
148b0 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c  abase is not nul
148c0 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  l, it means that
148d0 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
148e0 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61  n optional.** da
148f0 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66  tabase name pref
14900 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20  ix.  Like this: 
14910 20 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65   "database.table
14920 22 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73  ".  The pDatabas
14930 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  e.** points to t
14940 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
14950 64 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69  d the pTable poi
14960 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  nts to the datab
14970 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65  ase name..** The
14980 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61   SrcList.a[].zNa
14990 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c  me field is fill
149a0 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
149b0 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67  e name which mig
149c0 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20  ht.** come from 
149d0 70 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61  pTable (if pData
149e0 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72  base is NULL) or
149f0 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e   from pDatabase.
14a00 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b    .** SrcList.a[
14a10 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66  ].zDatabase is f
14a20 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64  illed with the d
14a30 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f  atabase name fro
14a40 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20  m pTable,.** or 
14a50 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20  with NULL if no 
14a60 64 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63  database is spec
14a70 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  ified..**.** In 
14a80 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
14a90 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  call like this:.
14aa0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
14ab0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
14ac0 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a  nd(A,B,0);.**.**
14ad0 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62   Then B is a tab
14ae0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
14af0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73  database name is
14b00 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49   unspecified.  I
14b10 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65  f called.** like
14b20 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
14b30 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
14b40 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 43 29  istAppend(A,B,C)
14b50 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69  ;.**.** Then C i
14b60 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  s the table name
14b70 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61   and B is the da
14b80 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a  tabase name..*/.
14b90 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
14ba0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 53 72  SrcListAppend(Sr
14bb0 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  cList *pList, To
14bc0 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b  ken *pTable, Tok
14bd0 65 6e 20 2a 70 44 61 74 61 62 61 73 65 29 7b 0a  en *pDatabase){.
14be0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
14bf0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
14c00 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
14c10 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
14c20 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
14c30 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20  (SrcList) );.   
14c40 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
14c50 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c  return 0;.    pL
14c60 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b  ist->nAlloc = 1;
14c70 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
14c80 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e  ->nSrc>=pList->n
14c90 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63  Alloc ){.    Src
14ca0 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  List *pNew;.    
14cb0 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d  pList->nAlloc *=
14cc0 20 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73   2;.    pNew = s
14cd0 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69  qliteRealloc(pLi
14ce0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
14cf0 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74     sizeof(*pList
14d00 29 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c  ) + (pList->nAll
14d10 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69  oc-1)*sizeof(pLi
14d20 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20  st->a[0]) );.   
14d30 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
14d40 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
14d50 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
14d60 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
14d70 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  0;.    }.    pLi
14d80 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  st = pNew;.  }. 
14d90 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
14da0 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b  >a[pList->nSrc];
14db0 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c  .  memset(pItem,
14dc0 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74   0, sizeof(pList
14dd0 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  ->a[0]));.  if( 
14de0 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61  pDatabase && pDa
14df0 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a  tabase->z==0 ){.
14e00 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
14e10 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61  0;.  }.  if( pDa
14e20 74 61 62 61 73 65 20 26 26 20 70 54 61 62 6c 65  tabase && pTable
14e30 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70   ){.    Token *p
14e40 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65  Temp = pDatabase
14e50 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  ;.    pDatabase 
14e60 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54  = pTable;.    pT
14e70 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20  able = pTemp;.  
14e80 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  }.  pItem->zName
14e90 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
14ea0 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 29 3b  omToken(pTable);
14eb0 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  .  pItem->zDatab
14ec0 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ase = sqlite3Nam
14ed0 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 61 74 61  eFromToken(pData
14ee0 62 61 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e  base);.  pItem->
14ef0 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  iCursor = -1;.  
14f00 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20  pList->nSrc++;. 
14f10 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
14f20 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63  ../*.** Assign c
14f30 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61  ursors to all ta
14f40 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73  bles in a SrcLis
14f50 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
14f60 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
14f70 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61  rsors(Parse *pPa
14f80 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  rse, SrcList *pL
14f90 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
14fa0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
14fb0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66  item *pItem;.  f
14fc0 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(i=0, pItem=pL
14fd0 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
14fe0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
14ff0 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49  m++){.    if( pI
15000 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20  tem->iCursor>=0 
15010 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 74  ) break;.    pIt
15020 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50  em->iCursor = pP
15030 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
15040 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
15050 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71  lect ){.      sq
15060 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
15070 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
15080 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
15090 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 7d 0a 20  ->pSrc);.    }. 
150a0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
150b0 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20  an alias to the 
150c0 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65 72 20  last identifier 
150d0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69 64 65  on the given ide
150e0 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f  ntifier list..*/
150f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
15100 4c 69 73 74 41 64 64 41 6c 69 61 73 28 53 72 63  ListAddAlias(Src
15110 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
15120 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69  en *pToken){.  i
15130 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73  f( pList && pLis
15140 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20  t->nSrc>0 ){.   
15150 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d   pList->a[pList-
15160 3e 6e 53 72 63 2d 31 5d 2e 7a 41 6c 69 61 73 20  >nSrc-1].zAlias 
15170 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
15180 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a  mToken(pToken);.
15190 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
151a0 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a  ete an IdList..*
151b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64  /.void sqlite3Id
151c0 4c 69 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73  ListDelete(IdLis
151d0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
151e0 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
151f0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
15200 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
15210 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
15220 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
15230 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
15240 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
15250 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
15260 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a  iteFree(pList);.
15270 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
15280 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69  the index in pLi
15290 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69  st of the identi
152a0 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20  fier named zId. 
152b0 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66   Return -1.** if
152c0 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69   not found..*/.i
152d0 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  nt sqlite3IdList
152e0 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c  Index(IdList *pL
152f0 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ist, const char 
15300 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
15310 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
15320 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
15330 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
15340 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
15350 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
15360 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
15370 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30  zName, zName)==0
15380 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d   ) return i;.  }
15390 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
153a0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
153b0 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20   entire SrcList 
153c0 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74  including all it
153d0 73 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a  s substructure..
153e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
153f0 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53 72 63  rcListDelete(Src
15400 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
15410 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
15420 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
15430 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  tem;.  if( pList
15440 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
15450 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
15460 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
15470 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
15480 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  em++){.    sqlit
15490 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 44 61  eFree(pItem->zDa
154a0 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c  tabase);.    sql
154b0 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a  iteFree(pItem->z
154c0 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
154d0 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 41 6c  eFree(pItem->zAl
154e0 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ias);.    if( pI
154f0 74 65 6d 2d 3e 70 54 61 62 20 26 26 20 70 49 74  tem->pTab && pIt
15500 65 6d 2d 3e 70 54 61 62 2d 3e 69 73 54 72 61 6e  em->pTab->isTran
15510 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  sient ){.      s
15520 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
15530 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  e(0, pItem->pTab
15540 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
15550 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
15560 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29  (pItem->pSelect)
15570 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
15580 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70  rDelete(pItem->p
15590 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  On);.    sqlite3
155a0 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 49 74  IdListDelete(pIt
155b0 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  em->pUsing);.  }
155c0 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
155d0 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  ist);.}../*.** B
155e0 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
155f0 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
15600 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  e3BeginTransacti
15610 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
15620 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73  , int type){.  s
15630 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
15640 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a  be *v;.  int i;.
15650 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
15660 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
15670 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44  db)==0 || db->aD
15680 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  b[0].pBt==0 ) re
15690 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
156a0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
156b0 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
156c0 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
156d0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
156e0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
156f0 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
15700 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 20  BEGIN", 0, 0) ) 
15710 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73  return;..  v = s
15720 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
15730 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20  arse);.  if( !v 
15740 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
15750 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45  type!=TK_DEFERRE
15760 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  D ){.    for(i=0
15770 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
15780 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15790 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
157a0 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20  Transaction, i, 
157b0 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53  (type==TK_EXCLUS
157c0 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  IVE)+1);.    }. 
157d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
157e0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f  AddOp(v, OP_Auto
157f0 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d  Commit, 0, 0);.}
15800 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
15810 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
15820 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d  void sqlite3Comm
15830 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  itTransaction(Pa
15840 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
15850 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
15860 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70  dbe *v;..  if( p
15870 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d  Parse==0 || (db=
15880 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c  pParse->db)==0 |
15890 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  | db->aDb[0].pBt
158a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
158b0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
158c0 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
158d0 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
158e0 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
158f0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
15900 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
15910 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c  CTION, "COMMIT",
15920 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
15930 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
15940 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
15950 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
15960 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
15970 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
15980 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 1, 0);.  }.}..
15990 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
159a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
159b0 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
159c0 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
159d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
159e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
159f0 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
15a00 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
15a10 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
15a20 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
15a30 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
15a40 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
15a50 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
15a60 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
15a70 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
15a80 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
15a90 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
15aa0 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41  SACTION, "ROLLBA
15ab0 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  CK", 0, 0) ) ret
15ac0 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  urn;..  v = sqli
15ad0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
15ae0 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
15af0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15b00 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  dOp(v, OP_AutoCo
15b10 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d  mmit, 1, 1);.  }
15b20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
15b30 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74  ure the TEMP dat
15b40 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e  abase is open an
15b50 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
15b60 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
15b70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
15b80 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79  rors.  Leave any
15b90 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
15ba0 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
15bb0 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
15bc0 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 70  ic int sqlite3Op
15bd0 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50  enTempDatabase(P
15be0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
15bf0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
15c00 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
15c10 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d   db->aDb[1].pBt=
15c20 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65  =0 && !pParse->e
15c30 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e  xplain ){.    in
15c40 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74  t rc = sqlite3Bt
15c50 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30  reeFactory(db, 0
15c60 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20  , 0, MAX_PAGES, 
15c70 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29  &db->aDb[1].pBt)
15c80 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
15c90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15ca0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
15cb0 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
15cc0 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
15cd0 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a  rary database ".
15ce0 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f          "file fo
15cf0 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72  r storing tempor
15d00 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20  ary tables");.  
15d10 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
15d20 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
15d30 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
15d40 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 21  f( db->flags & !
15d50 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
15d60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
15d70 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
15d80 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ans(db->aDb[1].p
15d90 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  Bt, 1);.      if
15da0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15db0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
15dc0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15dd0 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65  e, "unable to ge
15de0 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  t a write lock o
15df0 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 74  n ".          "t
15e00 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  he temporary dat
15e10 61 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20 20  abase file");.  
15e20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
15e30 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72   = rc;.        r
15e40 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
15e50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
15e60 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
15e70 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
15e80 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72  de that will ver
15e90 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63  ify the schema c
15ea0 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a  ookie and start.
15eb0 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  ** a read-transa
15ec0 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61  ction for all na
15ed0 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
15ee0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  es..**.** It is 
15ef0 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
15f00 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  ll schema cookie
15f10 73 20 62 65 20 76 65 72 69 66 69 65 64 20 61 6e  s be verified an
15f20 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72  d all.** read tr
15f30 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74  ansactions be st
15f40 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79  arted before any
15f50 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65  thing else happe
15f60 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42  ns in.** the VDB
15f70 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20  E program.  But 
15f80 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
15f90 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
15fa0 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63   much other.** c
15fb0 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e  ode has been gen
15fc0 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65  erated.  So here
15fd0 20 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a   is what we do:.
15fe0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
15ff0 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
16000 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20  e is called, we 
16010 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20  code an OP_Goto 
16020 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d  that.** will jum
16030 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e  p to a subroutin
16040 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
16050 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68  the program.  Th
16060 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20  en we.** record 
16070 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20 74  every database t
16080 68 61 74 20 6e 65 65 64 73 20 69 74 73 20 73 63  hat needs its sc
16090 68 65 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e  hema verified in
160a0 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e   the.** pParse->
160b0 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64  cookieMask field
160c0 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20  .  Later, after 
160d0 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68  all other code h
160e0 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72  as been.** gener
160f0 61 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75  ated, the subrou
16100 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74  tine that does t
16110 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  he cookie verifi
16120 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73  cations and.** s
16130 74 61 72 74 73 20 74 68 65 20 74 72 61 6e 73 61  tarts the transa
16140 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63  ctions will be c
16150 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f  oded and the OP_
16160 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a  Goto P2 value.**
16170 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
16180 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73   point to that s
16190 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
161a0 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68  generation of th
161b0 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69  e.** cookie veri
161c0 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74  fication subrout
161d0 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73  ine code happens
161e0 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73   in sqlite3Finis
161f0 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a  hCoding()..**.**
16200 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63   If iDb<0 then c
16210 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20  ode the OP_Goto 
16220 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74  only - don't set
16230 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20   flag to verify 
16240 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e  the.** schema on
16250 20 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20   any databases. 
16260 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
16270 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68  d to position th
16280 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72  e OP_Goto.** ear
16290 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20  ly in the code, 
162a0 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69  before we know i
162b0 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 74  f any database t
162c0 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73  ables will be us
162d0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
162e0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
162f0 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
16300 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73  e, int iDb){.  s
16310 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
16320 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73  be *v;.  int mas
16330 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  k;..  v = sqlite
16340 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
16350 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
16360 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20  eturn;  /* This 
16370 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20  only happens if 
16380 74 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f  there was a prio
16390 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20  r error */.  db 
163a0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
163b0 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  if( pParse->cook
163c0 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20  ieGoto==0 ){.   
163d0 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
163e0 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oto = sqlite3Vdb
163f0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
16400 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a  o, 0, 0)+1;.  }.
16410 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a    if( iDb>=0 ){.
16420 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c      assert( iDb<
16430 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61  db->nDb );.    a
16440 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69  ssert( db->aDb[i
16450 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44  Db].pBt!=0 || iD
16460 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  b==1 );.    asse
16470 72 74 28 20 69 44 62 3c 33 32 20 29 3b 0a 20 20  rt( iDb<32 );.  
16480 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b    mask = 1<<iDb;
16490 0a 20 20 20 20 69 66 28 20 28 70 50 61 72 73 65  .    if( (pParse
164a0 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d  ->cookieMask & m
164b0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
164c0 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
164d0 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
164e0 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
164f0 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62  eValue[iDb] = db
16500 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d  ->aDb[iDb].schem
16510 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20  a_cookie;.      
16520 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20  if( iDb==1 ){.  
16530 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
16540 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 50  nTempDatabase(pP
16550 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  arse);.      }. 
16560 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
16570 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
16580 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72  code that prepar
16590 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20  es for doing an 
165a0 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a  operation that.*
165b0 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  * might change t
165c0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
165d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
165e0 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61  starts a new tra
165f0 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61  nsaction if we a
16600 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77  re not already w
16610 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73  ithin.** a trans
16620 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61  action.  If we a
16630 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  re already withi
16640 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  n a transaction,
16650 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69   then a checkpoi
16660 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20  nt.** is set if 
16670 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74  the setStatement
16680 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72   parameter is tr
16690 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e  ue.  A checkpoin
166a0 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
166b0 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e  et for operation
166c0 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69  s that might fai
166d0 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73  l (due to a cons
166e0 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a  traint) part of.
166f0 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75  ** the way throu
16700 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c  gh and which wil
16710 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73  l need to undo s
16720 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f  ome writes witho
16730 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20  ut having to.** 
16740 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f  rollback the who
16750 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  le transaction. 
16760 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   For operations 
16770 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72  where all constr
16780 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20  aints.** can be 
16790 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61  checked before a
167a0 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  ny changes are m
167b0 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ade to the datab
167c0 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72  ase, it is never
167d0 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  .** necessary to
167e0 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e   undo a write an
167f0 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  d the checkpoint
16800 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73   should not be s
16810 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64  et..**.** Only d
16820 61 74 61 62 61 73 65 20 69 44 62 20 61 6e 64 20  atabase iDb and 
16830 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
16840 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  e are made writa
16850 62 6c 65 20 62 79 20 74 68 69 73 20 63 61 6c 6c  ble by this call
16860 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20  ..** If iDb==0, 
16870 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e  then the main an
16880 64 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 73  d temp databases
16890 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62   are made writab
168a0 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d  le.   If.** iDb=
168b0 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65  =1 then only the
168c0 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 69   temp database i
168d0 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e  s made writable.
168e0 20 20 49 66 20 69 44 62 3e 31 20 74 68 65 6e 20    If iDb>1 then 
168f0 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  the.** specified
16900 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
16910 61 73 65 20 61 6e 64 20 74 68 65 20 74 65 6d 70  ase and the temp
16920 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61   database are ma
16930 64 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a  de writable..*/.
16940 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69  void sqlite3Begi
16950 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
16960 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
16970 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c  nt setStatement,
16980 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
16990 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
169a0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
169b0 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
169c0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64  rn;.  sqlite3Cod
169d0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
169e0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 50  arse, iDb);.  pP
169f0 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20  arse->writeMask 
16a00 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28  |= 1<<iDb;.  if(
16a10 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 26 26   setStatement &&
16a20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
16a30 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
16a40 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
16a50 5f 53 74 61 74 65 6d 65 6e 74 2c 20 69 44 62 2c  _Statement, iDb,
16a60 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69   0);.  }.  if( i
16a70 44 62 21 3d 31 20 26 26 20 70 50 61 72 73 65 2d  Db!=1 && pParse-
16a80 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 21  >db->aDb[1].pBt!
16a90 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
16aa0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
16ab0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 73 65 74  tion(pParse, set
16ac0 53 74 61 74 65 6d 65 6e 74 2c 20 31 29 3b 0a 20  Statement, 1);. 
16ad0 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
16ae0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
16af0 2f 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  /* .** Return th
16b00 65 20 74 72 61 6e 73 69 65 6e 74 20 73 71 6c 69  e transient sqli
16b10 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74  te3_value object
16b20 20 75 73 65 64 20 66 6f 72 20 65 6e 63 6f 64 69   used for encodi
16b30 6e 67 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 2a  ng conversions.*
16b40 2a 20 64 75 72 69 6e 67 20 53 51 4c 20 63 6f 6d  * during SQL com
16b50 70 69 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c  pilation..*/.sql
16b60 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69  ite3_value *sqli
16b70 74 65 33 47 65 74 54 72 61 6e 73 69 65 6e 74 56  te3GetTransientV
16b80 61 6c 75 65 28 73 71 6c 69 74 65 33 20 2a 64 62  alue(sqlite3 *db
16b90 29 7b 0a 20 20 69 66 28 20 21 64 62 2d 3e 70 56  ){.  if( !db->pV
16ba0 61 6c 75 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e  alue ){.    db->
16bb0 70 56 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33  pValue = sqlite3
16bc0 56 61 6c 75 65 4e 65 77 28 29 3b 0a 20 20 7d 0a  ValueNew();.  }.
16bd0 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 70 56 61    return db->pVa
16be0 6c 75 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  lue;.}.#endif../
16bf0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
16c00 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73  e if pIndex uses
16c10 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
16c20 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20  equence pColl.  
16c30 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
16c40 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61  f it does and fa
16c50 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e  lse if it does n
16c60 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ot..*/.#ifndef S
16c70 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
16c80 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  EX.static int co
16c90 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 43 6f 6c  llationMatch(Col
16ca0 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 20 49 6e 64  lSeq *pColl, Ind
16cb0 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69  ex *pIndex){.  i
16cc0 6e 74 20 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6b  nt n = pIndex->k
16cd0 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 3b 0a 20  eyInfo.nField;. 
16ce0 20 43 6f 6c 6c 53 65 71 20 2a 2a 70 70 20 3d 20   CollSeq **pp = 
16cf0 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e  pIndex->keyInfo.
16d00 61 43 6f 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20  aColl;.  while( 
16d10 6e 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 2a  n-- ){.    if( *
16d20 70 70 3d 3d 70 43 6f 6c 6c 20 29 20 72 65 74 75  pp==pColl ) retu
16d30 72 6e 20 31 3b 0a 20 20 20 20 70 70 2b 2b 3b 0a  rn 1;.    pp++;.
16d40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
16d50 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
16d60 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
16d70 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68  dices of pTab th
16d80 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61  at use the colla
16d90 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
16da0 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c  oll..** If pColl
16db0 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75  ==0 then recompu
16dc0 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
16dd0 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64  f pTab..*/.#ifnd
16de0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
16df0 45 49 4e 44 45 58 0a 76 6f 69 64 20 72 65 69 6e  EINDEX.void rein
16e00 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a  dexTable(Parse *
16e10 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
16e20 54 61 62 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43  Tab, CollSeq *pC
16e30 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  oll){.  Index *p
16e40 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
16e50 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
16e60 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
16e70 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70  pTab */..  for(p
16e80 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64  Index=pTab->pInd
16e90 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
16ea0 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74  ex=pIndex->pNext
16eb0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  ){.    if( pColl
16ec0 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e  ==0 || collation
16ed0 4d 61 74 63 68 28 70 43 6f 6c 6c 2c 70 49 6e 64  Match(pColl,pInd
16ee0 65 78 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ex) ){.      sql
16ef0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
16f00 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
16f10 30 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20  0, pTab->iDb);. 
16f20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69       sqlite3Refi
16f30 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
16f40 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20  pIndex, -1);.   
16f50 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
16f60 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65  ./*.** Recompute
16f70 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
16f80 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c  all tables in al
16f90 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72  l databases wher
16fa0 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73  e the.** indices
16fb0 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69   use the collati
16fc0 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
16fd0 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20  l.  If pColl==0 
16fe0 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a  then recompute.*
16ff0 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76  * all indices ev
17000 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66  erywhere..*/.#if
17010 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17020 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 72 65  _REINDEX.void re
17030 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 50  indexDatabases(P
17040 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f  arse *pParse, Co
17050 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
17060 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
17070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17080 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  A single databas
17090 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
170a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170b0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
170c0 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
170d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
170e0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
170f0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
17100 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
17110 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20   HashElem *k;   
17120 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17130 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
17140 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a   tables in pDb *
17150 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
17160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17170 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
17180 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20  e database */.. 
17190 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d   for(iDb=0, pDb=
171a0 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d  db->aDb; iDb<db-
171b0 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62  >nDb; iDb++, pDb
171c0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 44 62  ++){.    if( pDb
171d0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
171e0 20 20 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69        for(k=sqli
171f0 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62  teHashFirst(&pDb
17200 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20  ->tblHash);  k; 
17210 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  k=sqliteHashNext
17220 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62  (k)){.      pTab
17230 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74   = (Table*)sqlit
17240 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20  eHashData(k);.  
17250 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65      reindexTable
17260 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
17270 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Coll);.    }.  }
17280 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
17290 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
172a0 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63  or the REINDEX c
172b0 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  ommand..**.**   
172c0 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20       REINDEX    
172d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172e0 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20          -- 1.** 
172f0 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
17300 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20  <collation>     
17310 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a            -- 2.*
17320 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
17330 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c    ?<database>.?<
17340 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33  tablename>  -- 3
17350 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
17360 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  EX  ?<database>.
17370 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d  ?<indexname>  --
17380 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20   4.**.** Form 1 
17390 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63  causes all indic
173a0 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68  es in all attach
173b0 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20  ed databases to 
173c0 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46  be rebuilt..** F
173d0 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61  orm 2 rebuilds a
173e0 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c  ll indices in al
173f0 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  l databases that
17400 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a   use the named.*
17410 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  * collating func
17420 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61  tion.  Forms 3 a
17430 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65  nd 4 rebuild the
17440 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20   named index or 
17450 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61  all.** indices a
17460 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
17470 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a  he named table..
17480 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
17490 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76  E_OMIT_REINDEX.v
174a0 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64  oid sqlite3Reind
174b0 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
174c0 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c  , Token *pName1,
174d0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b   Token *pName2){
174e0 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
174f0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
17500 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
17510 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64  ence to be reind
17520 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  exed, or NULL */
17530 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
17540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17550 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c  * Name of a tabl
17560 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e or index */.  
17570 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b  const char *zDb;
17580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
17590 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
175a0 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ase */.  Table *
175b0 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
175c0 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
175d0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
175e0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
175f0 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
17600 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73   /* An index ass
17610 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61  ociated with pTa
17620 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  b */.  int iDb; 
17630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17640 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
17650 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
17660 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
17670 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
17680 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
17690 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
176a0 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65   Token *pObjName
176b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
176c0 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
176d0 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65  e or index to be
176e0 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20   reindexed */.. 
176f0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
17700 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
17710 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
17720 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
17730 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e   message.  ** an
17740 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65  d code in pParse
17750 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
17760 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54  . */.  if( SQLIT
17770 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
17780 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
17790 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
177a0 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31   }..  if( pName1
177b0 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 31 2d 3e 7a  ==0 || pName1->z
177c0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64  ==0 ){.    reind
177d0 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72  exDatabases(pPar
177e0 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  se, 0);.    retu
177f0 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  rn;.  }else if( 
17800 70 4e 61 6d 65 32 3d 3d 30 20 7c 7c 20 70 4e 61  pName2==0 || pNa
17810 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  me2->z==0 ){.   
17820 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
17830 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
17840 64 62 2d 3e 65 6e 63 2c 20 70 4e 61 6d 65 31 2d  db->enc, pName1-
17850 3e 7a 2c 20 70 4e 61 6d 65 31 2d 3e 6e 2c 20 30  >z, pName1->n, 0
17860 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
17870 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65   ){.      reinde
17880 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73  xDatabases(pPars
17890 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  e, pColl);.     
178a0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
178b0 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
178c0 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
178d0 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
178e0 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29  ame2, &pObjName)
178f0 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20  ;.  if( iDb<0 ) 
17900 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71  return;.  z = sq
17910 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
17920 65 6e 28 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  en(pObjName);.  
17930 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
17940 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62  b].zName;.  pTab
17950 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
17960 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  ble(db, z, zDb);
17970 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20  .  if( pTab ){. 
17980 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
17990 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29  pParse, pTab, 0)
179a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
179b0 28 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  (z);.    return;
179c0 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20  .  }.  pIndex = 
179d0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
179e0 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20  (db, z, zDb);.  
179f0 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
17a00 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
17a10 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
17a20 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
17a30 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
17a40 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
17a50 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
17a60 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72  ndex, -1);.    r
17a70 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
17a80 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
17a90 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
17aa0 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a  identify the obj
17ab0 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65  ect to be reinde
17ac0 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  xed");.}.#endif.
17ad0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17ae0 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a  OMIT_ALTERTABLE.
17af0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
17b00 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ode to implement
17b10 20 74 68 65 20 22 41 4c 54 45 52 20 54 41 42 4c   the "ALTER TABL
17b20 45 20 78 78 78 20 52 45 4e 41 4d 45 20 54 4f 20  E xxx RENAME TO 
17b30 79 79 79 22 20 0a 2a 2a 20 63 6f 6d 6d 61 6e 64  yyy" .** command
17b40 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
17b50 65 33 41 6c 74 65 72 52 65 6e 61 6d 65 54 61 62  e3AlterRenameTab
17b60 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
17b70 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
17b80 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
17b90 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  t. */.  SrcList 
17ba0 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20  *pSrc,          
17bb0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74    /* The table t
17bc0 6f 20 72 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 54  o rename. */.  T
17bd0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 20 20 20 20  oken *pName     
17be0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17bf0 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  new table name. 
17c00 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b  */.){.  int iDb;
17c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74 68    /* Database th
17c30 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
17c40 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20  table */.  char 
17c50 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *zDb;           
17c60 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
17c70 64 61 74 61 62 61 73 65 20 69 44 62 20 2a 2f 0a  database iDb */.
17c80 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
17c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17ca0 61 62 6c 65 20 62 65 69 6e 67 20 72 65 6e 61 6d  able being renam
17cb0 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ed */.  char *zN
17cc0 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ame = 0;        
17cd0 20 20 2f 2a 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e    /* NULL-termin
17ce0 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ated version of 
17cf0 70 4e 61 6d 65 20 2a 2f 20 0a 20 20 63 68 61 72  pName */ .  char
17d00 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 20 20 20   *zWhere = 0;   
17d10 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 63        /* Where c
17d20 6c 61 75 73 65 20 6f 66 20 73 63 68 65 6d 61 20  lause of schema 
17d30 65 6c 65 6d 65 6e 74 73 20 74 6f 20 72 65 70 61  elements to repa
17d40 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rse */.  sqlite3
17d50 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
17d60 62 3b 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  b; /* Database c
17d70 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56  onnection */.  V
17d80 64 62 65 20 2a 76 3b 0a 23 69 66 6e 64 65 66 20  dbe *v;.#ifndef 
17d90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
17da0 47 45 52 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d  GER.  char *zTem
17db0 70 54 72 69 67 20 3d 20 30 3b 20 20 20 20 20 20  pTrig = 0;      
17dc0 2f 2a 20 57 68 65 72 65 20 63 6c 61 75 73 65 20  /* Where clause 
17dd0 74 6f 20 6c 6f 63 61 74 65 20 74 65 6d 70 20 74  to locate temp t
17de0 72 69 67 67 65 72 73 20 2a 2f 0a 23 65 6e 64 69  riggers */.#endi
17df0 66 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  f.  .  assert( p
17e00 53 72 63 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  Src->nSrc==1 );.
17e10 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
17e20 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
17e30 72 73 65 2c 20 70 53 72 63 2d 3e 61 5b 30 5d 2e  rse, pSrc->a[0].
17e40 7a 4e 61 6d 65 2c 20 70 53 72 63 2d 3e 61 5b 30  zName, pSrc->a[0
17e50 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
17e60 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f  if( !pTab ) goto
17e70 20 65 78 69 74 5f 61 6c 74 65 72 5f 74 61 62 6c   exit_alter_tabl
17e80 65 3b 0a 20 20 69 44 62 20 3d 20 70 54 61 62 2d  e;.  iDb = pTab-
17e90 3e 69 44 62 3b 0a 20 20 7a 44 62 20 3d 20 64 62  >iDb;.  zDb = db
17ea0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
17eb0 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 4e 55  ;..  /* Get a NU
17ec0 4c 4c 20 74 65 72 6d 69 6e 61 74 65 64 20 76 65  LL terminated ve
17ed0 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77  rsion of the new
17ee0 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 2a 2f 0a   table name. */.
17ef0 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
17f00 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
17f10 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 7a 4e  Name);.  if( !zN
17f20 61 6d 65 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ame ) goto exit_
17f30 61 6c 74 65 72 5f 74 61 62 6c 65 3b 0a 0a 20 20  alter_table;..  
17f40 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61 20  /* Check that a 
17f50 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 6e  table or index n
17f60 61 6d 65 64 20 27 7a 4e 61 6d 65 27 20 64 6f 65  amed 'zName' doe
17f70 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
17f80 69 73 74 0a 20 20 2a 2a 20 69 6e 20 64 61 74 61  ist.  ** in data
17f90 62 61 73 65 20 69 44 62 2e 20 49 66 20 73 6f 2c  base iDb. If so,
17fa0 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f   this is an erro
17fb0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  r..  */.  if( sq
17fc0 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
17fd0 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 7c  b, zName, zDb) |
17fe0 7c 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  | sqlite3FindInd
17ff0 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  ex(db, zName, zD
18000 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
18010 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
18020 2c 20 0a 20 20 20 20 20 20 20 20 22 74 68 65 72  , .        "ther
18030 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 6f  e is already ano
18040 74 68 65 72 20 74 61 62 6c 65 20 6f 72 20 69 6e  ther table or in
18050 64 65 78 20 77 69 74 68 20 74 68 69 73 20 6e 61  dex with this na
18060 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  me: %s", zName);
18070 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 61  .    goto exit_a
18080 6c 74 65 72 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  lter_table;.  }.
18090 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
180a0 69 74 20 69 73 20 6e 6f 74 20 61 20 73 79 73 74  it is not a syst
180b0 65 6d 20 74 61 62 6c 65 20 62 65 69 6e 67 20 61  em table being a
180c0 6c 74 65 72 65 64 2c 20 6f 72 20 61 20 72 65 73  ltered, or a res
180d0 65 72 76 65 64 20 6e 61 6d 65 0a 20 20 2a 2a 20  erved name.  ** 
180e0 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 69  that the table i
180f0 73 20 62 65 69 6e 67 20 72 65 6e 61 6d 65 64 20  s being renamed 
18100 74 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  to..  */.  if( s
18110 74 72 6c 65 6e 28 70 54 61 62 2d 3e 7a 4e 61 6d  trlen(pTab->zNam
18120 65 29 3e 36 20 26 26 20 30 3d 3d 73 71 6c 69 74  e)>6 && 0==sqlit
18130 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
18140 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
18150 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c  ", 7) ){.    sql
18160 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
18170 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
18180 61 79 20 6e 6f 74 20 62 65 20 61 6c 74 65 72 65  ay not be altere
18190 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
181a0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
181b0 61 6c 74 65 72 5f 74 61 62 6c 65 3b 0a 20 20 7d  alter_table;.  }
181c0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
181d0 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  !=sqlite3CheckOb
181e0 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  jectName(pParse,
181f0 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67   zName) ){.    g
18200 6f 74 6f 20 65 78 69 74 5f 61 6c 74 65 72 5f 74  oto exit_alter_t
18210 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  able;.  }..#ifnd
18220 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
18230 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 2f  UTHORIZATION.  /
18240 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 61 75 74  * Invoke the aut
18250 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62  horization callb
18260 61 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71  ack. */.  if( sq
18270 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
18280 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 41 4c  Parse, SQLITE_AL
18290 54 45 52 5f 54 41 42 4c 45 2c 20 7a 44 62 2c 20  TER_TABLE, zDb, 
182a0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 20  pTab->zName, 0) 
182b0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
182c0 5f 61 6c 74 65 72 5f 74 61 62 6c 65 3b 0a 20 20  _alter_table;.  
182d0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42  }.#endif..  /* B
182e0 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
182f0 6f 6e 20 61 6e 64 20 63 6f 64 65 20 74 68 65 20  on and code the 
18300 56 65 72 69 66 79 43 6f 6f 6b 69 65 20 66 6f 72  VerifyCookie for
18310 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 0a   database iDb. .
18320 20 20 2a 2a 20 54 68 65 6e 20 6d 6f 64 69 66 79    ** Then modify
18330 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
18340 69 65 20 28 73 69 6e 63 65 20 74 68 65 20 41 4c  ie (since the AL
18350 54 45 52 20 54 41 42 4c 45 20 6d 6f 64 69 66 69  TER TABLE modifi
18360 65 73 20 74 68 65 0a 20 20 2a 2a 20 73 63 68 65  es the.  ** sche
18370 6d 61 29 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ma)..  */.  v = 
18380 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
18390 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
183a0 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  =0 ){.    goto e
183b0 78 69 74 5f 61 6c 74 65 72 5f 74 61 62 6c 65 3b  xit_alter_table;
183c0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 65  .  }.  sqlite3Be
183d0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
183e0 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
183f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 68 61 6e  );.  sqlite3Chan
18400 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20  geCookie(db, v, 
18410 69 44 62 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 64 69  iDb);..  /* Modi
18420 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  fy the sqlite_ma
18430 73 74 65 72 20 74 61 62 6c 65 20 74 6f 20 75 73  ster table to us
18440 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  e the new table 
18450 6e 61 6d 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  name. */.  sqlit
18460 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
18470 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44  arse,.      "UPD
18480 41 54 45 20 25 51 2e 25 73 20 53 45 54 20 22 0a  ATE %Q.%s SET ".
18490 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
184a0 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 20  IT_TRIGGER.     
184b0 20 20 20 20 20 22 73 71 6c 20 3d 20 73 71 6c 69       "sql = sqli
184c0 74 65 5f 61 6c 74 65 72 5f 74 61 62 6c 65 28 73  te_alter_table(s
184d0 71 6c 2c 20 25 51 29 2c 20 22 0a 23 65 6c 73 65  ql, %Q), ".#else
184e0 0a 20 20 20 20 20 20 20 20 20 20 22 73 71 6c 20  .          "sql 
184f0 3d 20 43 41 53 45 20 22 0a 20 20 20 20 20 20 20  = CASE ".       
18500 20 20 20 20 20 22 57 48 45 4e 20 74 79 70 65 20       "WHEN type 
18510 3d 20 27 74 72 69 67 67 65 72 27 20 54 48 45 4e  = 'trigger' THEN
18520 20 73 71 6c 69 74 65 5f 61 6c 74 65 72 5f 74 72   sqlite_alter_tr
18530 69 67 67 65 72 28 73 71 6c 2c 20 25 51 29 22 0a  igger(sql, %Q)".
18540 20 20 20 20 20 20 20 20 20 20 20 20 22 45 4c 53              "ELS
18550 45 20 73 71 6c 69 74 65 5f 61 6c 74 65 72 5f 74  E sqlite_alter_t
18560 61 62 6c 65 28 73 71 6c 2c 20 25 51 29 20 45 4e  able(sql, %Q) EN
18570 44 2c 20 22 0a 23 65 6e 64 69 66 0a 20 20 20 20  D, ".#endif.    
18580 20 20 20 20 20 20 22 74 62 6c 5f 6e 61 6d 65 20        "tbl_name 
18590 3d 20 25 51 2c 20 22 0a 20 20 20 20 20 20 20 20  = %Q, ".        
185a0 20 20 22 6e 61 6d 65 20 3d 20 43 41 53 45 20 22    "name = CASE "
185b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 57 48  .            "WH
185c0 45 4e 20 74 79 70 65 3d 27 74 61 62 6c 65 27 20  EN type='table' 
185d0 54 48 45 4e 20 25 51 20 22 0a 20 20 20 20 20 20  THEN %Q ".      
185e0 20 20 20 20 20 20 22 57 48 45 4e 20 6e 61 6d 65        "WHEN name
185f0 20 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f 61 75   LIKE 'sqlite_au
18600 74 6f 69 6e 64 65 78 25 25 27 20 41 4e 44 20 74  toindex%%' AND t
18610 79 70 65 3d 27 69 6e 64 65 78 27 20 54 48 45 4e  ype='index' THEN
18620 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
18630 20 22 27 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e   "'sqlite_autoin
18640 64 65 78 5f 27 20 7c 7c 20 25 51 20 7c 7c 20 73  dex_' || %Q || s
18650 75 62 73 74 72 28 6e 61 6d 65 2c 20 25 64 2b 31  ubstr(name, %d+1
18660 38 2c 31 30 29 20 22 0a 20 20 20 20 20 20 20 20  8,10) ".        
18670 20 20 20 20 22 45 4c 53 45 20 6e 61 6d 65 20 45      "ELSE name E
18680 4e 44 20 22 0a 20 20 20 20 20 20 22 57 48 45 52  ND ".      "WHER
18690 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 41 4e  E tbl_name=%Q AN
186a0 44 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 28  D ".          "(
186b0 74 79 70 65 3d 27 74 61 62 6c 65 27 20 4f 52 20  type='table' OR 
186c0 74 79 70 65 3d 27 69 6e 64 65 78 27 20 4f 52 20  type='index' OR 
186d0 74 79 70 65 3d 27 74 72 69 67 67 65 72 27 29 3b  type='trigger');
186e0 22 2c 20 0a 20 20 20 20 20 20 7a 44 62 2c 20 53  ", .      zDb, S
186f0 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
18700 2c 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  , zName, zName, 
18710 7a 4e 61 6d 65 2c 20 0a 23 69 66 6e 64 65 66 20  zName, .#ifndef 
18720 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
18730 47 45 52 0a 7a 4e 61 6d 65 2c 0a 23 65 6e 64 69  GER.zName,.#endi
18740 66 0a 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 73  f.      zName, s
18750 74 72 6c 65 6e 28 70 54 61 62 2d 3e 7a 4e 61 6d  trlen(pTab->zNam
18760 65 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a  e), pTab->zName.
18770 20 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51    );..#ifndef SQ
18780 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
18790 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 49 66 20  CREMENT.  /* If 
187a0 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
187b0 6e 63 65 20 74 61 62 6c 65 20 65 78 69 73 74 73  nce table exists
187c0 20 69 6e 20 74 68 69 73 20 64 61 74 61 62 61 73   in this databas
187d0 65 2c 20 74 68 65 6e 20 75 70 64 61 74 65 20 0a  e, then update .
187e0 20 20 2a 2a 20 69 74 20 77 69 74 68 20 74 68 65    ** it with the
187f0 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 2e   new table name.
18800 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
18810 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
18820 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63   "sqlite_sequenc
18830 65 22 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  e", zDb) ){.    
18840 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
18850 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
18860 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 73 71     "UPDATE %Q.sq
18870 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 73 65  lite_sequence se
18880 74 20 6e 61 6d 65 20 3d 20 25 51 20 57 48 45 52  t name = %Q WHER
18890 45 20 6e 61 6d 65 20 3d 20 25 51 22 2c 0a 20 20  E name = %Q",.  
188a0 20 20 20 20 20 20 7a 44 62 2c 20 7a 4e 61 6d 65        zDb, zName
188b0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
188c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e    }.#endif..#ifn
188d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
188e0 54 52 49 47 47 45 52 0a 20 20 2f 2a 20 49 66 20  TRIGGER.  /* If 
188f0 74 68 65 72 65 20 61 72 65 20 54 45 4d 50 20 74  there are TEMP t
18900 72 69 67 67 65 72 73 20 6f 6e 20 74 68 69 73 20  riggers on this 
18910 74 61 62 6c 65 2c 20 6d 6f 64 69 66 79 20 74 68  table, modify th
18920 65 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  e sqlite_temp_ma
18930 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 2e  ster.  ** table.
18940 20 44 6f 6e 27 74 20 64 6f 20 74 68 69 73 20 69   Don't do this i
18950 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  f the table bein
18960 67 20 41 4c 54 45 52 65 64 20 69 73 20 69 74 73  g ALTERed is its
18970 65 6c 66 20 6c 6f 63 61 74 65 64 20 69 6e 0a 20  elf located in. 
18980 20 2a 2a 20 74 68 65 20 74 65 6d 70 20 64 61 74   ** the temp dat
18990 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  abase..  */.  if
189a0 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20  ( iDb!=1 ){.    
189b0 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 3b 0a  Trigger *pTrig;.
189c0 20 20 20 20 63 68 61 72 20 2a 74 6d 70 20 3d 20      char *tmp = 
189d0 30 3b 0a 20 20 20 20 66 6f 72 28 20 70 54 72 69  0;.    for( pTri
189e0 67 3d 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72  g=pTab->pTrigger
189f0 3b 20 70 54 72 69 67 3b 20 70 54 72 69 67 3d 70  ; pTrig; pTrig=p
18a00 54 72 69 67 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  Trig->pNext ){. 
18a10 20 20 20 20 20 69 66 28 20 70 54 72 69 67 2d 3e       if( pTrig->
18a20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
18a30 20 20 69 66 28 20 21 7a 54 65 6d 70 54 72 69 67    if( !zTempTrig
18a40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
18a50 65 6d 70 54 72 69 67 20 3d 20 0a 20 20 20 20 20  empTrig = .     
18a60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18a70 4d 50 72 69 6e 74 66 28 22 74 79 70 65 20 3d 20  MPrintf("type = 
18a80 27 74 72 69 67 67 65 72 27 20 41 4e 44 20 28 6e  'trigger' AND (n
18a90 61 6d 65 3d 25 51 22 2c 20 70 54 72 69 67 2d 3e  ame=%Q", pTrig->
18aa0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  name);.        }
18ab0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
18ac0 74 6d 70 20 3d 20 7a 54 65 6d 70 54 72 69 67 3b  tmp = zTempTrig;
18ad0 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70  .          zTemp
18ae0 54 72 69 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  Trig = sqlite3MP
18af0 72 69 6e 74 66 28 22 25 73 20 4f 52 20 6e 61 6d  rintf("%s OR nam
18b00 65 3d 25 51 22 2c 20 7a 54 65 6d 70 54 72 69 67  e=%Q", zTempTrig
18b10 2c 20 70 54 72 69 67 2d 3e 6e 61 6d 65 29 3b 0a  , pTrig->name);.
18b20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
18b30 46 72 65 65 28 74 6d 70 29 3b 0a 20 20 20 20 20  Free(tmp);.     
18b40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
18b50 20 7d 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70   }.    if( zTemp
18b60 54 72 69 67 20 29 7b 0a 20 20 20 20 20 20 74 6d  Trig ){.      tm
18b70 70 20 3d 20 7a 54 65 6d 70 54 72 69 67 3b 0a 20  p = zTempTrig;. 
18b80 20 20 20 20 20 7a 54 65 6d 70 54 72 69 67 20 3d       zTempTrig =
18b90 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
18ba0 22 25 73 29 22 2c 20 7a 54 65 6d 70 54 72 69 67  "%s)", zTempTrig
18bb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
18bc0 72 65 65 28 74 6d 70 29 3b 0a 20 20 20 20 20 20  ree(tmp);.      
18bd0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
18be0 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
18bf0 20 20 20 20 20 20 22 55 50 44 41 54 45 20 73 71        "UPDATE sq
18c00 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
18c10 20 53 45 54 20 22 0a 20 20 20 20 20 20 20 20 20   SET ".         
18c20 20 20 20 20 20 22 73 71 6c 20 3d 20 73 71 6c 69       "sql = sqli
18c30 74 65 5f 61 6c 74 65 72 5f 74 72 69 67 67 65 72  te_alter_trigger
18c40 28 73 71 6c 2c 20 25 51 29 2c 20 22 0a 20 20 20  (sql, %Q), ".   
18c50 20 20 20 20 20 20 20 20 20 20 20 22 74 62 6c 5f             "tbl_
18c60 6e 61 6d 65 20 3d 20 25 51 20 22 0a 20 20 20 20  name = %Q ".    
18c70 20 20 20 20 20 20 20 20 20 20 22 57 48 45 52 45            "WHERE
18c80 20 25 73 3b 22 2c 20 7a 4e 61 6d 65 2c 20 7a 4e   %s;", zName, zN
18c90 61 6d 65 2c 20 7a 54 65 6d 70 54 72 69 67 29 3b  ame, zTempTrig);
18ca0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
18cb0 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  f..  /* Drop the
18cc0 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
18cd0 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 63 68 65 6d   in-memory schem
18ce0 61 20 74 68 61 74 20 72 65 66 65 72 65 64 20 74  a that refered t
18cf0 6f 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a  o the table.  **
18d00 20 72 65 6e 61 6d 65 64 20 61 6e 64 20 6c 6f 61   renamed and loa
18d10 64 20 74 68 65 20 6e 65 77 20 76 65 72 73 69 6f  d the new versio
18d20 6e 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ns from the data
18d30 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  base..  */.  if(
18d40 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
18d50 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
18d60 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
18d70 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72      Trigger *pTr
18d80 69 67 3b 0a 20 20 20 20 66 6f 72 28 20 70 54 72  ig;.    for( pTr
18d90 69 67 3d 70 54 61 62 2d 3e 70 54 72 69 67 67 65  ig=pTab->pTrigge
18da0 72 3b 20 70 54 72 69 67 3b 20 70 54 72 69 67 3d  r; pTrig; pTrig=
18db0 70 54 72 69 67 2d 3e 70 4e 65 78 74 20 29 7b 0a  pTrig->pNext ){.
18dc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
18dd0 72 69 67 2d 3e 69 44 62 3d 3d 69 44 62 20 7c 7c  rig->iDb==iDb ||
18de0 20 70 54 72 69 67 2d 3e 69 44 62 3d 3d 31 20 29   pTrig->iDb==1 )
18df0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
18e00 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f  dbeOp3(v, OP_Dro
18e10 70 54 72 69 67 67 65 72 2c 20 70 54 72 69 67 2d  pTrigger, pTrig-
18e20 3e 69 44 62 2c 20 30 2c 20 70 54 72 69 67 2d 3e  >iDb, 0, pTrig->
18e30 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  name, 0);.    }.
18e40 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
18e50 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
18e60 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20  DropTable, iDb, 
18e70 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  0, pTab->zName, 
18e80 30 29 3b 0a 20 20 20 20 7a 57 68 65 72 65 20 3d  0);.    zWhere =
18e90 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
18ea0 22 74 62 6c 5f 6e 61 6d 65 3d 25 51 22 2c 20 7a  "tbl_name=%Q", z
18eb0 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
18ec0 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
18ed0 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62  ParseSchema, iDb
18ee0 2c 20 30 2c 20 7a 57 68 65 72 65 2c 20 50 33 5f  , 0, zWhere, P3_
18ef0 44 59 4e 41 4d 49 43 29 3b 0a 23 69 66 6e 64 65  DYNAMIC);.#ifnde
18f00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
18f10 49 47 47 45 52 0a 20 20 20 20 69 66 28 20 7a 54  IGGER.    if( zT
18f20 65 6d 70 54 72 69 67 20 29 7b 0a 20 20 20 20 20  empTrig ){.     
18f30 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
18f40 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  v, OP_ParseSchem
18f50 61 2c 20 31 2c 20 30 2c 20 7a 54 65 6d 70 54 72  a, 1, 0, zTempTr
18f60 69 67 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b  ig, P3_DYNAMIC);
18f70 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
18f80 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
18f90 54 65 6d 70 54 72 69 67 29 3b 0a 23 65 6e 64 69  TempTrig);.#endi
18fa0 66 0a 20 20 7d 0a 0a 65 78 69 74 5f 61 6c 74 65  f.  }..exit_alte
18fb0 72 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74  r_table:.  sqlit
18fc0 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
18fd0 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 46  pSrc);.  sqliteF
18fe0 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 7d 0a 23 65  ree(zName);.}.#e
18ff0 6e 64 69 66 0a                                   ndif.