/ Hex Artifact Content
Login

Artifact 7e50cb572eedf50b3f5f499bce7d5340d9b00b63:


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 35 20 32 30 30 35 2f 30 32 2f 30 31  1.305 2005/02/01
02f0: 20 30 31 3a 32 31 3a 35 35 20 64 61 6e 69 65 6c   01:21:55 daniel
0300: 6b 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23  k1977 Exp $.*/.#
0310: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0320: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
0330: 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  ctype.h>../*.** 
0340: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0350: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65  called when a ne
0360: 77 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  w SQL statement 
0370: 69 73 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a  is beginning to.
0380: 2a 2a 20 62 65 20 70 61 72 73 65 64 2e 20 20 49  ** be parsed.  I
0390: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 70 50  nitialize the pP
03a0: 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20 61  arse structure a
03b0: 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69  s needed..*/.voi
03c0: 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 50 61  d sqlite3BeginPa
03d0: 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rse(Parse *pPars
03e0: 65 2c 20 69 6e 74 20 65 78 70 6c 61 69 6e 46 6c  e, int explainFl
03f0: 61 67 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 65  ag){.  pParse->e
0400: 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61 69 6e  xplain = explain
0410: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
0420: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nVar = 0;.}../*.
0430: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0440: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
0450: 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61  a single SQL sta
0460: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
0470: 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20 61 20  ** parsed and a 
0480: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 74 6f 20  VDBE program to 
0490: 65 78 65 63 75 74 65 20 74 68 61 74 20 73 74 61  execute that sta
04a0: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
04b0: 2a 2a 20 70 72 65 70 61 72 65 64 2e 20 20 54 68  ** prepared.  Th
04c0: 69 73 20 72 6f 75 74 69 6e 65 20 70 75 74 73 20  is routine puts 
04d0: 74 68 65 20 66 69 6e 69 73 68 69 6e 67 20 74 6f  the finishing to
04e0: 75 63 68 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  uches on the.** 
04f0: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 6e 64  VDBE program and
0500: 20 72 65 73 65 74 73 20 74 68 65 20 70 50 61 72   resets the pPar
0510: 73 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  se structure for
0520: 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 70 61 72   the next.** par
0530: 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  se..**.** Note t
0540: 68 61 74 20 69 66 20 61 6e 20 65 72 72 6f 72 20  hat if an error 
0550: 6f 63 63 75 72 72 65 64 2c 20 69 74 20 6d 69 67  occurred, it mig
0560: 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
0570: 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63  hat.** no VDBE c
0580: 6f 64 65 20 77 61 73 20 67 65 6e 65 72 61 74 65  ode was generate
0590: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
05a0: 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 50  e3FinishCoding(P
05b0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
05c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
05d0: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
05e0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
05f0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
0600: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65    if( pParse->ne
0610: 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 0a  sted ) return;..
0620: 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 67 65    /* Begin by ge
0630: 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65 20 74 65  nerating some te
0640: 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20 61  rmination code a
0650: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
0660: 0a 20 20 2a 2a 20 76 64 62 65 20 70 72 6f 67 72  .  ** vdbe progr
0670: 61 6d 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70  am.  */.  db = p
0680: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d  Parse->db;.  v =
0690: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
06a0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
06b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
06c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 48  dbeAddOp(v, OP_H
06d0: 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  alt, 0, 0);..   
06e0: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
06f0: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
0700: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
0710: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
0720: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
0730: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
0740: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
0750: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
0760: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
0770: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
0780: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
0790: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
07a0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
07b0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
07c0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
07d0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
07e0: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
07f0: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
0800: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
0810: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
0820: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  if( pParse->cook
0830: 69 65 47 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20  ieGoto>0 ){.    
0840: 20 20 75 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20    u32 mask;.    
0850: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
0860: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
0870: 67 65 50 32 28 76 2c 20 70 50 61 72 73 65 2d 3e  geP2(v, pParse->
0880: 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 2c 20 73 71  cookieGoto-1, sq
0890: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
08a0: 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 20 20  Addr(v));.      
08b0: 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73 6b 3d  for(iDb=0, mask=
08c0: 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  1; iDb<db->nDb; 
08d0: 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b 29  mask<<=1, iDb++)
08e0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
08f0: 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 63 6f  ask & pParse->co
0900: 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29 20 63  okieMask)==0 ) c
0910: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
0920: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
0930: 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74  p(v, OP_Transact
0940: 69 6f 6e 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20  ion, iDb, (mask 
0950: 26 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d  & pParse->writeM
0960: 61 73 6b 29 21 3d 30 29 3b 0a 20 20 20 20 20 20  ask)!=0);.      
0970: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
0980: 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43  Op(v, OP_VerifyC
0990: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 70 50 61 72  ookie, iDb, pPar
09a0: 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b  se->cookieValue[
09b0: 69 44 62 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iDb]);.      }. 
09c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
09d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
09e0: 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  , 0, pParse->coo
09f0: 6b 69 65 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a  kieGoto);.    }.
0a00: 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 20 4e 6f  .    /* Add a No
0a10: 2d 6f 70 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  -op that contain
0a20: 73 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  s the complete t
0a30: 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 69  ext of the compi
0a40: 6c 65 64 20 53 51 4c 0a 20 20 20 20 2a 2a 20 73  led SQL.    ** s
0a50: 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74 73 20  tatement as its 
0a60: 50 33 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68  P3 argument.  Th
0a70: 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e  is does not chan
0a80: 67 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 61  ge the functiona
0a90: 6c 69 74 79 0a 20 20 20 20 2a 2a 20 6f 66 20 74  lity.    ** of t
0aa0: 68 65 20 70 72 6f 67 72 61 6d 2e 20 0a 20 20 20  he program. .   
0ab0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
0ac0: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
0ad0: 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 74 72 61  ment sqlite3_tra
0ae0: 63 65 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ce()..    */.   
0af0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
0b00: 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30  v, OP_Noop, 0, 0
0b10: 2c 20 70 50 61 72 73 65 2d 3e 7a 53 71 6c 2c 20  , pParse->zSql, 
0b20: 70 50 61 72 73 65 2d 3e 7a 54 61 69 6c 2d 70 50  pParse->zTail-pP
0b30: 61 72 73 65 2d 3e 7a 53 71 6c 29 3b 0a 20 20 7d  arse->zSql);.  }
0b40: 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ...  /* Get the 
0b50: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65 61  VDBE program rea
0b60: 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  dy for execution
0b70: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26  .  */.  if( v &&
0b80: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
0b90: 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74 72   ){.    FILE *tr
0ba0: 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  ace = (db->flags
0bb0: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72   & SQLITE_VdbeTr
0bc0: 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74  ace)!=0 ? stdout
0bd0: 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   : 0;.    sqlite
0be0: 33 56 64 62 65 54 72 61 63 65 28 76 2c 20 74 72  3VdbeTrace(v, tr
0bf0: 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ace);.    sqlite
0c00: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76  3VdbeMakeReady(v
0c10: 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  , pParse->nVar, 
0c20: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 33 2c 0a  pParse->nMem+3,.
0c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c40: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
0c50: 3e 6e 54 61 62 2b 33 2c 20 70 50 61 72 73 65 2d  >nTab+3, pParse-
0c60: 3e 6e 4d 61 78 44 65 70 74 68 2b 31 2c 20 70 50  >nMaxDepth+1, pP
0c70: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29 3b 0a  arse->explain);.
0c80: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
0c90: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 3f 20   pParse->nErr ? 
0ca0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a 20 53  SQLITE_ERROR : S
0cb0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
0cc0: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
0cd0: 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Set = 0;.  }else
0ce0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d   if( pParse->rc=
0cf0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
0d00: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
0d10: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
0d20: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20  .  pParse->nTab 
0d30: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
0d40: 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Mem = 0;.  pPars
0d50: 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70  e->nSet = 0;.  p
0d60: 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b  Parse->nVar = 0;
0d70: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  .  pParse->cooki
0d80: 65 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61  eMask = 0;.  pPa
0d90: 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20  rse->cookieGoto 
0da0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75  = 0;.}../*.** Ru
0db0: 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 6e 64  n the parser and
0dc0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
0dd0: 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e 20 6f  recursively in o
0de0: 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65  rder to generate
0df0: 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74 68 65  .** code for the
0e00: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 67   SQL statement g
0e10: 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e  iven onto the en
0e20: 64 20 6f 66 20 74 68 65 20 70 50 61 72 73 65 20  d of the pParse 
0e30: 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72 65  context.** curre
0e40: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
0e50: 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74  ruction.  When t
0e60: 68 65 20 70 61 72 73 65 72 20 69 73 20 72 75 6e  he parser is run
0e70: 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20   recursively.** 
0e80: 74 68 69 73 20 77 61 79 2c 20 74 68 65 20 66 69  this way, the fi
0e90: 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e  nal OP_Halt is n
0ea0: 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e 64 20  ot appended and 
0eb0: 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69 7a 61  other initializa
0ec0: 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61  tion.** and fina
0ed0: 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 61  lization steps a
0ee0: 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63 61 75  re omitted becau
0ef0: 73 65 20 74 68 6f 73 65 20 61 72 65 20 68 61 6e  se those are han
0f00: 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20  dling by the.** 
0f10: 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73 65 72  outermost parser
0f20: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72  ..**.** Not ever
0f30: 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74 61 62  ything is nestab
0f40: 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69 6c 69  le.  This facili
0f50: 74 79 20 69 73 20 64 65 73 69 67 6e 65 64 20 74  ty is designed t
0f60: 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45  o permit.** INSE
0f70: 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20  RT, UPDATE, and 
0f80: 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e  DELETE operation
0f90: 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49 54 45  s against SQLITE
0fa0: 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a  _MASTER.  Use.**
0fb0: 20 63 61 72 65 20 69 66 20 79 6f 75 20 64 65 63   care if you dec
0fc0: 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20 75 73  ide to try to us
0fd0: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  e this routine f
0fe0: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
0ff0: 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  rposes..*/.void 
1000: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
1010: 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
1020: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
1030: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
1040: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61  a_list ap;.  cha
1050: 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72  r *zSql;.  int r
1060: 63 3b 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45  c;.# define SAVE
1070: 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72  _SZ  (sizeof(Par
1080: 73 65 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50  se) - offsetof(P
1090: 61 72 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68  arse,nVar)).  ch
10a0: 61 72 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f  ar saveBuf[SAVE_
10b0: 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  SZ];..  if( pPar
10c0: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
10d0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  n;.  assert( pPa
10e0: 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29  rse->nested<10 )
10f0: 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68  ;  /* Nesting sh
1100: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20  ould only be of 
1110: 6c 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f  limited depth */
1120: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
1130: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c  zFormat);.  zSql
1140: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
1150: 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  tf(zFormat, ap);
1160: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
1170: 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a   if( zSql==0 ){.
1180: 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a      return;   /*
1190: 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68   A malloc must h
11a0: 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ave failed */.  
11b0: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  }.  pParse->nest
11c0: 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73  ed++;.  memcpy(s
11d0: 61 76 65 42 75 66 2c 20 26 70 50 61 72 73 65 2d  aveBuf, &pParse-
11e0: 3e 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b  >nVar, SAVE_SZ);
11f0: 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73  .  memset(&pPars
1200: 65 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41 56 45  e->nVar, 0, SAVE
1210: 5f 53 5a 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  _SZ);.  rc = sql
1220: 69 74 65 33 52 75 6e 50 61 72 73 65 72 28 70 50  ite3RunParser(pP
1230: 61 72 73 65 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a  arse, zSql, 0);.
1240: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 53 71    sqliteFree(zSq
1250: 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50  l);.  memcpy(&pP
1260: 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65  arse->nVar, save
1270: 42 75 66 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20  Buf, SAVE_SZ);. 
1280: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d   pParse->nested-
1290: 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  -;.}../*.** Loca
12a0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
12b0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
12c0: 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74  describes a part
12d0: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a  icular database.
12e0: 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  ** table given t
12f0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
1300: 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f  table and (optio
1310: 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20  nally) the name 
1320: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
1330: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
1340: 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
1350: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
1360: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61  nd..**.** If zDa
1370: 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c  tabase is 0, all
1380: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73   databases are s
1390: 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 20  earched for the 
13a0: 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a  table and the.**
13b0: 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
13c0: 74 61 62 6c 65 20 69 73 20 72 65 74 75 72 6e 65  table is returne
13d0: 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67  d.  (No checking
13e0: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 74   for duplicate t
13f0: 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73  able.** names is
1400: 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61   done.)  The sea
1410: 72 63 68 20 6f 72 64 65 72 20 69 73 20 54 45 4d  rch order is TEM
1420: 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41  P first, then MA
1430: 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20  IN, then any.** 
1440: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
1450: 73 65 73 20 61 64 64 65 64 20 75 73 69 6e 67 20  ses added using 
1460: 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61  the ATTACH comma
1470: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  nd..**.** See al
1480: 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  so sqlite3Locate
1490: 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c  Table()..*/.Tabl
14a0: 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 54 61  e *sqlite3FindTa
14b0: 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ble(sqlite3 *db,
14c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
14d0: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
14e0: 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20 54 61  zDatabase){.  Ta
14f0: 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e  ble *p = 0;.  in
1500: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  t i;.  assert( z
1510: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Name!=0 );.  ass
1520: 65 72 74 28 20 28 64 62 2d 3e 66 6c 61 67 73 20  ert( (db->flags 
1530: 26 20 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c  & SQLITE_Initial
1540: 69 7a 65 64 29 20 7c 7c 20 64 62 2d 3e 69 6e 69  ized) || db->ini
1550: 74 2e 62 75 73 79 20 29 3b 0a 20 20 66 6f 72 28  t.busy );.  for(
1560: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
1570: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20  i++){.    int j 
1580: 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20  = (i<2) ? i^1 : 
1590: 69 3b 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54  i;   /* Search T
15a0: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
15b0: 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61  */.    if( zData
15c0: 62 61 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74  base!=0 && sqlit
15d0: 65 33 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62  e3StrICmp(zDatab
15e0: 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  ase, db->aDb[j].
15f0: 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75  zName) ) continu
1600: 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  e;.    p = sqlit
1610: 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  e3HashFind(&db->
1620: 61 44 62 5b 6a 5d 2e 74 62 6c 48 61 73 68 2c 20  aDb[j].tblHash, 
1630: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
1640: 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28  ame)+1);.    if(
1650: 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   p ) break;.  }.
1660: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
1670: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
1680: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
1690: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
16a0: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
16b0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
16c0: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
16d0: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
16e0: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
16f0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
1700: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
1710: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
1720: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
1730: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c  f not found.  Al
1740: 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65  so leave an.** e
1750: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
1760: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
1770: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
1780: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
1790: 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73  is routine and s
17a0: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
17b0: 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
17c0: 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73  * routine leaves
17d0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
17e0: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
17f0: 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71  rMsg where.** sq
1800: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29  lite3FindTable()
1810: 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61   does not..*/.Ta
1820: 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  ble *sqlite3Loca
1830: 74 65 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  teTable(Parse *p
1840: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
1850: 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
1860: 63 68 61 72 20 2a 7a 44 62 61 73 65 29 7b 0a 20  char *zDbase){. 
1870: 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a   Table *p;..  /*
1880: 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
1890: 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
18a0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
18b0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
18c0: 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
18d0: 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
18e0: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
18f0: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
1900: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
1910: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
1920: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1930: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
1940: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
1950: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  ->db, zName, zDb
1960: 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
1970: 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 62 61   ){.    if( zDba
1980: 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  se ){.      sqli
1990: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
19a0: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  se, "no such tab
19b0: 6c 65 3a 20 25 73 2e 25 73 22 2c 20 7a 44 62 61  le: %s.%s", zDba
19c0: 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  se, zName);.    
19d0: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
19e0: 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
19f0: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  e->db, zName, 0)
1a00: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
1a10: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1a20: 72 73 65 2c 20 22 74 61 62 6c 65 20 5c 22 25 73  rse, "table \"%s
1a30: 5c 22 20 69 73 20 6e 6f 74 20 69 6e 20 64 61 74  \" is not in dat
1a40: 61 62 61 73 65 20 5c 22 25 73 5c 22 22 2c 0a 20  abase \"%s\"",. 
1a50: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 7a          zName, z
1a60: 44 62 61 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Dbase);.    }els
1a70: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1a80: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1a90: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
1aa0: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
1ab0: 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
1ac0: 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
1ad0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
1ae0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
1af0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
1b00: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
1b10: 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61  scribes .** a pa
1b20: 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67  rticular index g
1b30: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
1b40: 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61   that index.** a
1b50: 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nd the name of t
1b60: 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
1b70: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e   contains the in
1b80: 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e  dex..** Return N
1b90: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
1ba0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61  ..**.** If zData
1bb0: 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64  base is 0, all d
1bc0: 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61  atabases are sea
1bd0: 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a  rched for the.**
1be0: 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20 66   table and the f
1bf0: 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 69 6e  irst matching in
1c00: 64 65 78 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dex is returned.
1c10: 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a    (No checking.*
1c20: 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  * for duplicate 
1c30: 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73 20 64  index names is d
1c40: 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63  one.)  The searc
1c50: 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54 45  h order is.** TE
1c60: 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d  MP first, then M
1c70: 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61 75  AIN, then any au
1c80: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
1c90: 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67  s added.** using
1ca0: 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d   the ATTACH comm
1cb0: 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73  and..*/.Index *s
1cc0: 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
1cd0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
1ce0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
1cf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29  const char *zDb)
1d00: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 30  {.  Index *p = 0
1d10: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
1d20: 65 72 74 28 20 28 64 62 2d 3e 66 6c 61 67 73 20  ert( (db->flags 
1d30: 26 20 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c  & SQLITE_Initial
1d40: 69 7a 65 64 29 20 7c 7c 20 64 62 2d 3e 69 6e 69  ized) || db->ini
1d50: 74 2e 62 75 73 79 20 29 3b 0a 20 20 66 6f 72 28  t.busy );.  for(
1d60: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
1d70: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20  i++){.    int j 
1d80: 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20  = (i<2) ? i^1 : 
1d90: 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  i;  /* Search TE
1da0: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
1db0: 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26 26  /.    if( zDb &&
1dc0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1dd0: 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  zDb, db->aDb[j].
1de0: 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75  zName) ) continu
1df0: 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  e;.    p = sqlit
1e00: 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  e3HashFind(&db->
1e10: 61 44 62 5b 6a 5d 2e 69 64 78 48 61 73 68 2c 20  aDb[j].idxHash, 
1e20: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
1e30: 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28  ame)+1);.    if(
1e40: 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   p ) break;.  }.
1e50: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
1e60: 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68 65  *.** Reclaim the
1e70: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
1e80: 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74  an index.*/.stat
1e90: 69 63 20 76 6f 69 64 20 66 72 65 65 49 6e 64 65  ic void freeInde
1ea0: 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 73  x(Index *p){.  s
1eb0: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 43 6f  qliteFree(p->zCo
1ec0: 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 46  lAff);.  sqliteF
1ed0: 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ree(p);.}../*.**
1ee0: 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69 76 65   Remove the give
1ef0: 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65  n index from the
1f00: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
1f10: 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69  e, and free.** i
1f20: 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ts memory struct
1f30: 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ures..**.** The 
1f40: 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76 65 64  index is removed
1f50: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1f60: 73 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 62  se hash tables b
1f70: 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  ut.** it is not 
1f80: 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68  unlinked from th
1f90: 65 20 54 61 62 6c 65 20 74 68 61 74 20 69 74 20  e Table that it 
1fa0: 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69  indexes..** Unli
1fb0: 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 54  nking from the T
1fc0: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64 6f 6e  able must be don
1fd0: 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  e by the calling
1fe0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
1ff0: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
2000: 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69  DeleteIndex(sqli
2010: 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a  te3 *db, Index *
2020: 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6c  p){.  Index *pOl
2030: 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  d;..  assert( db
2040: 21 3d 30 20 26 26 20 70 2d 3e 7a 4e 61 6d 65 21  !=0 && p->zName!
2050: 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73  =0 );.  pOld = s
2060: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
2070: 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62  (&db->aDb[p->iDb
2080: 5d 2e 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a 4e  ].idxHash, p->zN
2090: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
20b0: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
20c0: 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 4f 6c  1, 0);.  if( pOl
20d0: 64 21 3d 30 20 26 26 20 70 4f 6c 64 21 3d 70 20  d!=0 && pOld!=p 
20e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61  ){.    sqlite3Ha
20f0: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44  shInsert(&db->aD
2100: 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73  b[p->iDb].idxHas
2110: 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c 0a  h, pOld->zName,.
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2130: 20 20 20 20 20 73 74 72 6c 65 6e 28 70 4f 6c 64       strlen(pOld
2140: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c 64  ->zName)+1, pOld
2150: 29 3b 0a 20 20 7d 0a 20 20 66 72 65 65 49 6e 64  );.  }.  freeInd
2160: 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ex(p);.}../*.** 
2170: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
2180: 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20   index from its 
2190: 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 6d 6f  table, then remo
21a0: 76 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  ve.** the index 
21b0: 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68  from the index h
21c0: 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72  ash table and fr
21d0: 65 65 20 69 74 73 20 6d 65 6d 6f 72 79 0a 2a 2a  ee its memory.**
21e0: 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a   structures..*/.
21f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
2200: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
2210: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
2220: 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61  t iDb, const cha
2230: 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20  r *zIdxName){.  
2240: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
2250: 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 6c 65 6e   int len;..  len
2260: 20 3d 20 73 74 72 6c 65 6e 28 7a 49 64 78 4e 61   = strlen(zIdxNa
2270: 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  me);.  pIndex = 
2280: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
2290: 74 28 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t(&db->aDb[iDb].
22a0: 69 64 78 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d  idxHash, zIdxNam
22b0: 65 2c 20 6c 65 6e 2b 31 2c 20 30 29 3b 0a 20 20  e, len+1, 0);.  
22c0: 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
22d0: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54    if( pIndex->pT
22e0: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49  able->pIndex==pI
22f0: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49  ndex ){.      pI
2300: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
2310: 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70  ndex = pIndex->p
2320: 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
2330: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  .      Index *p;
2340: 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 49 6e  .      for(p=pIn
2350: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
2360: 64 65 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65  dex; p && p->pNe
2370: 78 74 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d  xt!=pIndex; p=p-
2380: 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 20 20  >pNext){}.      
2390: 69 66 28 20 70 20 26 26 20 70 2d 3e 70 4e 65 78  if( p && p->pNex
23a0: 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  t==pIndex ){.   
23b0: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
23c0: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
23d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
23e0: 20 66 72 65 65 49 6e 64 65 78 28 70 49 6e 64 65   freeIndex(pInde
23f0: 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c  x);.  }.  db->fl
2400: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
2410: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
2420: 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20  /*.** Erase all 
2430: 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69  schema informati
2440: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d  on from the in-m
2450: 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
2460: 73 20 6f 66 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  s of.** a single
2470: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
2480: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2490: 65 64 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65  ed to reclaim me
24a0: 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74  mory.** before t
24b0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6c 6f 73  he database clos
24c0: 65 73 2e 20 20 49 74 20 69 73 20 61 6c 73 6f 20  es.  It is also 
24d0: 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 61 20  called during a 
24e0: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 74  rollback.** if t
24f0: 68 65 72 65 20 77 65 72 65 20 73 63 68 65 6d 61  here were schema
2500: 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20   changes during 
2510: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2520: 6f 72 20 69 66 20 61 0a 2a 2a 20 73 63 68 65 6d  or if a.** schem
2530: 61 2d 63 6f 6f 6b 69 65 20 6d 69 73 6d 61 74 63  a-cookie mismatc
2540: 68 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  h occurs..**.** 
2550: 49 66 20 69 44 62 3c 3d 30 20 74 68 65 6e 20 72  If iDb<=0 then r
2560: 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61  eset the interna
2570: 6c 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73 20  l schema tables 
2580: 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
2590: 0a 2a 2a 20 66 69 6c 65 73 2e 20 20 49 66 20 69  .** files.  If i
25a0: 44 62 3e 3d 32 20 74 68 65 6e 20 72 65 73 65 74  Db>=2 then reset
25b0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63   the internal sc
25c0: 68 65 6d 61 20 66 6f 72 20 6f 6e 6c 79 20 74 68  hema for only th
25d0: 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 66 69 6c 65  e.** single file
25e0: 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 76   indicated..*/.v
25f0: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74  oid sqlite3Reset
2600: 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 73  InternalSchema(s
2610: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
2620: 69 44 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  iDb){.  HashElem
2630: 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20   *pElem;.  Hash 
2640: 74 65 6d 70 31 3b 0a 20 20 48 61 73 68 20 74 65  temp1;.  Hash te
2650: 6d 70 32 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  mp2;.  int i, j;
2660: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ..  assert( iDb>
2670: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
2680: 62 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  b );.  db->flags
2690: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 69 74   &= ~SQLITE_Init
26a0: 69 61 6c 69 7a 65 64 3b 0a 20 20 66 6f 72 28 69  ialized;.  for(i
26b0: 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  =iDb; i<db->nDb;
26c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
26d0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
26e0: 3b 0a 20 20 20 20 74 65 6d 70 31 20 3d 20 70 44  ;.    temp1 = pD
26f0: 62 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 20 20  b->tblHash;.    
2700: 74 65 6d 70 32 20 3d 20 70 44 62 2d 3e 74 72 69  temp2 = pDb->tri
2710: 67 48 61 73 68 3b 0a 20 20 20 20 73 71 6c 69 74  gHash;.    sqlit
2720: 65 33 48 61 73 68 49 6e 69 74 28 26 70 44 62 2d  e3HashInit(&pDb-
2730: 3e 74 72 69 67 48 61 73 68 2c 20 53 51 4c 49 54  >trigHash, SQLIT
2740: 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30  E_HASH_STRING, 0
2750: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61  );.    sqlite3Ha
2760: 73 68 43 6c 65 61 72 28 26 70 44 62 2d 3e 61 46  shClear(&pDb->aF
2770: 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Key);.    sqlite
2780: 33 48 61 73 68 43 6c 65 61 72 28 26 70 44 62 2d  3HashClear(&pDb-
2790: 3e 69 64 78 48 61 73 68 29 3b 0a 20 20 20 20 66  >idxHash);.    f
27a0: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
27b0: 61 73 68 46 69 72 73 74 28 26 74 65 6d 70 32 29  ashFirst(&temp2)
27c0: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
27d0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
27e0: 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 73 71 6c  lem)){.      sql
27f0: 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65  ite3DeleteTrigge
2800: 72 28 28 54 72 69 67 67 65 72 2a 29 73 71 6c 69  r((Trigger*)sqli
2810: 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
2820: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ));.    }.    sq
2830: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
2840: 74 65 6d 70 32 29 3b 0a 20 20 20 20 73 71 6c 69  temp2);.    sqli
2850: 74 65 33 48 61 73 68 49 6e 69 74 28 26 70 44 62  te3HashInit(&pDb
2860: 2d 3e 74 62 6c 48 61 73 68 2c 20 53 51 4c 49 54  ->tblHash, SQLIT
2870: 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30  E_HASH_STRING, 0
2880: 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d  );.    for(pElem
2890: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
28a0: 28 26 74 65 6d 70 31 29 3b 20 70 45 6c 65 6d 3b  (&temp1); pElem;
28b0: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
28c0: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
28d0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
28e0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
28f0: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20  a(pElem);.      
2900: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
2910: 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
2920: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 48    }.    sqlite3H
2930: 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70 31 29  ashClear(&temp1)
2940: 3b 0a 20 20 20 20 70 44 62 2d 3e 70 53 65 71 54  ;.    pDb->pSeqT
2950: 61 62 20 3d 20 30 3b 0a 20 20 20 20 44 62 43 6c  ab = 0;.    DbCl
2960: 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20  earProperty(db, 
2970: 69 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64  i, DB_SchemaLoad
2980: 65 64 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  ed);.    if( iDb
2990: 3e 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d  >0 ) return;.  }
29a0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d  .  assert( iDb==
29b0: 30 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  0 );.  db->flags
29c0: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
29d0: 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a  rnChanges;..  /*
29e0: 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   If one or more 
29f0: 6f 66 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  of the auxiliary
2a00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
2a10: 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c  has been closed,
2a20: 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76  .  ** then remov
2a30: 65 20 74 68 65 6e 20 66 72 6f 6d 20 74 68 65 20  e then from the 
2a40: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
2a50: 73 65 20 6c 69 73 74 2e 20 20 57 65 20 74 61 6b  se list.  We tak
2a60: 65 20 74 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72  e the.  ** oppor
2a70: 74 75 6e 69 74 79 20 74 6f 20 64 6f 20 74 68 69  tunity to do thi
2a80: 73 20 68 65 72 65 20 73 69 6e 63 65 20 77 65 20  s here since we 
2a90: 68 61 76 65 20 6a 75 73 74 20 64 65 6c 65 74 65  have just delete
2aa0: 64 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a  d all of the.  *
2ab0: 2a 20 73 63 68 65 6d 61 20 68 61 73 68 20 74 61  * schema hash ta
2ac0: 62 6c 65 73 20 61 6e 64 20 74 68 65 72 65 66 6f  bles and therefo
2ad0: 72 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  re do not have t
2ae0: 6f 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67  o make any chang
2af0: 65 73 0a 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f  es.  ** to any o
2b00: 66 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a  f those tables..
2b10: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
2b20: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
2b30: 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a  .    struct Db *
2b40: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
2b50: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
2b60: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
2b70: 69 66 28 20 70 44 62 2d 3e 70 41 75 78 20 26 26  if( pDb->pAux &&
2b80: 20 70 44 62 2d 3e 78 46 72 65 65 41 75 78 20 29   pDb->xFreeAux )
2b90: 20 70 44 62 2d 3e 78 46 72 65 65 41 75 78 28 70   pDb->xFreeAux(p
2ba0: 44 62 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20  Db->pAux);.     
2bb0: 20 70 44 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a   pDb->pAux = 0;.
2bc0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
2bd0: 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62  i=j=2; i<db->nDb
2be0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
2bf0: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
2c00: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
2c10: 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b  ( pDb->pBt==0 ){
2c20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
2c30: 65 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  e(pDb->zName);. 
2c40: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20       pDb->zName 
2c50: 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  = 0;.      conti
2c60: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
2c70: 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20  f( j<i ){.      
2c80: 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d  db->aDb[j] = db-
2c90: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  >aDb[i];.    }. 
2ca0: 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65     j++;.  }.  me
2cb0: 6d 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d  mset(&db->aDb[j]
2cc0: 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29  , 0, (db->nDb-j)
2cd0: 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b  *sizeof(db->aDb[
2ce0: 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20  j]));.  db->nDb 
2cf0: 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e  = j;.  if( db->n
2d00: 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62  Db<=2 && db->aDb
2d10: 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20  !=db->aDbStatic 
2d20: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62  ){.    memcpy(db
2d30: 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d  ->aDbStatic, db-
2d40: 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64  >aDb, 2*sizeof(d
2d50: 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20  b->aDb[0]));.   
2d60: 20 73 71 6c 69 74 65 46 72 65 65 28 64 62 2d 3e   sqliteFree(db->
2d70: 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44  aDb);.    db->aD
2d80: 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69  b = db->aDbStati
2d90: 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c;.  }.}../*.** 
2da0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2db0: 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20  called whenever 
2dc0: 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
2dd0: 73 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72  s.  If there wer
2de0: 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 68 61 6e  e.** schema chan
2df0: 67 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74  ges during the t
2e00: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
2e10: 20 77 65 20 68 61 76 65 20 74 6f 20 72 65 73 65   we have to rese
2e20: 74 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61  t the.** interna
2e30: 6c 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  l hash tables an
2e40: 64 20 72 65 6c 6f 61 64 20 74 68 65 6d 20 66 72  d reload them fr
2e50: 6f 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64  om disk..*/.void
2e60: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
2e70: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
2e80: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
2e90: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
2ea0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
2eb0: 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  nges ){.    sqli
2ec0: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
2ed0: 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20  Schema(db, 0);. 
2ee0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
2ef0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2f00: 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74  ed when a commit
2f10: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
2f20: 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
2f30: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
2f40: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62  lite3 *db){.  db
2f50: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
2f60: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
2f70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
2f80: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
2f90: 73 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 6f  s from a table o
2fa0: 72 20 76 69 65 77 2e 0a 2a 2f 0a 73 74 61 74 69  r view..*/.stati
2fb0: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 52 65 73  c void sqliteRes
2fc0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61  etColumnNames(Ta
2fd0: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
2fe0: 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20  int i;.  Column 
2ff0: 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28  *pCol;.  assert(
3000: 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20   pTable!=0 );.  
3010: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(i=0, pCol=pT
3020: 61 62 6c 65 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54  able->aCol; i<pT
3030: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c  able->nCol; i++,
3040: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 71   pCol++){.    sq
3050: 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a  liteFree(pCol->z
3060: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
3070: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 43 6f  e3ExprDelete(pCo
3080: 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 73  l->pDflt);.    s
3090: 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e  qliteFree(pCol->
30a0: 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zType);.  }.  sq
30b0: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
30c0: 3e 61 43 6f 6c 29 3b 0a 20 20 70 54 61 62 6c 65  >aCol);.  pTable
30d0: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54  ->aCol = 0;.  pT
30e0: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
30f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
3100: 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20  the memory data 
3110: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
3120: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
3130: 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20  iven.** Table.  
3140: 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
3150: 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74  ade to disk by t
3160: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
3170: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3180: 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65  just deletes the
3190: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e   data structure.
31a0: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e    It does not un
31b0: 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c  link.** the tabl
31c0: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
31d0: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
31e0: 61 62 6c 65 2e 20 20 4e 6f 72 20 64 6f 65 73 20  able.  Nor does 
31f0: 69 74 20 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f 72  it remove.** for
3200: 65 69 67 6e 20 6b 65 79 73 20 66 72 6f 6d 20 74  eign keys from t
3210: 68 65 20 73 71 6c 69 74 65 2e 61 46 4b 65 79 20  he sqlite.aFKey 
3220: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74  hash table.  But
3230: 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79   it does destroy
3240: 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  .** memory struc
3250: 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64  tures of the ind
3260: 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e  ices and foreign
3270: 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64   keys associated
3280: 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61   with .** the ta
3290: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63  ble..**.** Indic
32a0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
32b0: 74 68 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  th the table are
32c0: 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74   unlinked from t
32d0: 68 65 20 22 64 62 22 0a 2a 2a 20 64 61 74 61 20  he "db".** data 
32e0: 73 74 72 75 63 74 75 72 65 20 69 66 20 64 62 21  structure if db!
32f0: 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d 3d 4e  =NULL.  If db==N
3300: 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61 74 74  ULL, indices att
3310: 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20  ached to.** the 
3320: 74 61 62 6c 65 20 61 72 65 20 64 65 6c 65 74 65  table are delete
3330: 64 2c 20 62 75 74 20 69 74 20 69 73 20 61 73 73  d, but it is ass
3340: 75 6d 65 64 20 74 68 65 79 20 68 61 76 65 20 61  umed they have a
3350: 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 75  lready been.** u
3360: 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64  nlinked..*/.void
3370: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
3380: 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ble(sqlite3 *db,
3390: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
33a0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
33b0: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79  , *pNext;.  FKey
33c0: 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46   *pFKey, *pNextF
33d0: 4b 65 79 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  Key;..  if( pTab
33e0: 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  le==0 ) return;.
33f0: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c  .  /* Delete all
3400: 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
3410: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61  ted with this ta
3420: 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  ble.  */.  for(p
3430: 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e  Index = pTable->
3440: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
3450: 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20  pIndex=pNext){. 
3460: 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65     pNext = pInde
3470: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73  x->pNext;.    as
3480: 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 69 44  sert( pIndex->iD
3490: 62 3d 3d 70 54 61 62 6c 65 2d 3e 69 44 62 20 7c  b==pTable->iDb |
34a0: 7c 20 28 70 54 61 62 6c 65 2d 3e 69 44 62 3d 3d  | (pTable->iDb==
34b0: 30 20 26 26 20 70 49 6e 64 65 78 2d 3e 69 44 62  0 && pIndex->iDb
34c0: 3d 3d 31 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ==1) );.    sqli
34d0: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62  teDeleteIndex(db
34e0: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a  , pIndex);.  }..
34f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3500: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
3510: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
3520: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73  foreign keys ass
3530: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
3540: 73 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6b 65  s table.  The ke
3550: 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  ys.  ** should h
3560: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
3570: 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74   unlinked from t
3580: 68 65 20 64 62 2d 3e 61 46 4b 65 79 20 68 61 73  he db->aFKey has
3590: 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a 20 20  h table .  */.  
35a0: 66 6f 72 28 70 46 4b 65 79 3d 70 54 61 62 6c 65  for(pFKey=pTable
35b0: 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20  ->pFKey; pFKey; 
35c0: 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79 29  pFKey=pNextFKey)
35d0: 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b 65 79 20  {.    pNextFKey 
35e0: 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72  = pFKey->pNextFr
35f0: 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  om;.    assert( 
3600: 70 54 61 62 6c 65 2d 3e 69 44 62 3c 64 62 2d 3e  pTable->iDb<db->
3610: 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nDb );.    asser
3620: 74 28 20 73 71 6c 69 74 65 33 48 61 73 68 46 69  t( sqlite3HashFi
3630: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70 54 61 62  nd(&db->aDb[pTab
3640: 6c 65 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 0a  le->iDb].aFKey,.
3650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3660: 20 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79             pFKey
3670: 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46  ->zTo, strlen(pF
3680: 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46  Key->zTo)+1)!=pF
3690: 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  Key );.    sqlit
36a0: 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20  eFree(pFKey);.  
36b0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  }.#endif..  /* D
36c0: 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20  elete the Table 
36d0: 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
36e0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 52  ..  */.  sqliteR
36f0: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
3700: 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  pTable);.  sqlit
3710: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e  eFree(pTable->zN
3720: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ame);.  sqliteFr
3730: 65 65 28 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41  ee(pTable->zColA
3740: 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ff);.  sqlite3Se
3750: 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61 62 6c  lectDelete(pTabl
3760: 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73  e->pSelect);.  s
3770: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
3780: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  );.}../*.** Unli
3790: 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62  nk the given tab
37a0: 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  le from the hash
37b0: 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20   tables and the 
37c0: 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61  delete the.** ta
37d0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69  ble structure wi
37e0: 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63  th all its indic
37f0: 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  es and foreign k
3800: 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  eys..*/.void sql
3810: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
3820: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
3830: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
3840: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e  onst char *zTabN
3850: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
3860: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a  ;.  FKey *pF1, *
3870: 70 46 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a  pF2;.  Db *pDb;.
3880: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
3890: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44   );.  assert( iD
38a0: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
38b0: 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
38c0: 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 7a 54 61   zTabName && zTa
38d0: 62 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44  bName[0] );.  pD
38e0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
38f0: 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ];.  p = sqlite3
3900: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
3910: 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61  >tblHash, zTabNa
3920: 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 54 61 62 4e  me, strlen(zTabN
3930: 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 69 66  ame)+1, 0);.  if
3940: 28 20 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ( p ){.#ifndef S
3950: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
3960: 47 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72 28 70  GN_KEY.    for(p
3970: 46 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31  F1=p->pFKey; pF1
3980: 3b 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74  ; pF1=pF1->pNext
3990: 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74  From){.      int
39a0: 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46   nTo = strlen(pF
39b0: 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20  1->zTo) + 1;.   
39c0: 20 20 20 70 46 32 20 3d 20 73 71 6c 69 74 65 33     pF2 = sqlite3
39d0: 48 61 73 68 46 69 6e 64 28 26 70 44 62 2d 3e 61  HashFind(&pDb->a
39e0: 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20  FKey, pF1->zTo, 
39f0: 6e 54 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nTo);.      if( 
3a00: 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20  pF2==pF1 ){.    
3a10: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
3a20: 6e 73 65 72 74 28 26 70 44 62 2d 3e 61 46 4b 65  nsert(&pDb->aFKe
3a30: 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f  y, pF1->zTo, nTo
3a40: 2c 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 29 3b  , pF1->pNextTo);
3a50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3a60: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 32        while( pF2
3a70: 20 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f   && pF2->pNextTo
3a80: 21 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32  !=pF1 ){ pF2=pF2
3a90: 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20  ->pNextTo; }.   
3aa0: 20 20 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a       if( pF2 ){.
3ab0: 20 20 20 20 20 20 20 20 20 20 70 46 32 2d 3e 70            pF2->p
3ac0: 4e 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e  NextTo = pF1->pN
3ad0: 65 78 74 54 6f 3b 0a 20 20 20 20 20 20 20 20 7d  extTo;.        }
3ae0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
3af0: 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
3b00: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
3b10: 20 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66   p);.  }.  db->f
3b20: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
3b30: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
3b40: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74  ./*.** Given a t
3b50: 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73  oken, return a s
3b60: 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69  tring that consi
3b70: 73 74 73 20 6f 66 20 74 68 65 20 74 65 78 74 20  sts of the text 
3b80: 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e  of that.** token
3b90: 20 77 69 74 68 20 61 6e 79 20 71 75 6f 74 61 74   with any quotat
3ba0: 69 6f 6e 73 20 72 65 6d 6f 76 65 64 2e 20 20 53  ions removed.  S
3bb0: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
3bc0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
3bd0: 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20  .** is obtained 
3be0: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
3bf0: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
3c00: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
3c10: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
3c20: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61  ..**.** Tokens a
3c30: 72 65 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 70  re really just p
3c40: 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65  ointers into the
3c50: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65   original SQL te
3c60: 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65  xt and so.** are
3c70: 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e   not \000 termin
3c80: 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74  ated and are not
3c90: 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68   persistent.  Th
3ca0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
3cb0: 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72  g.** is \000 ter
3cc0: 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70  minated and is p
3cd0: 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68  ersistent..*/.ch
3ce0: 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46  ar *sqlite3NameF
3cf0: 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a  romToken(Token *
3d00: 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  pName){.  char *
3d10: 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61  zName;.  if( pNa
3d20: 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
3d30: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
3d40: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
3d50: 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >n);.    sqlite3
3d60: 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a  Dequote(zName);.
3d70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61    }else{.    zNa
3d80: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
3d90: 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f  turn zName;.}../
3da0: 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71  *.** Open the sq
3db0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
3dc0: 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61  e stored in data
3dd0: 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20  base number iDb 
3de0: 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20  for.** writing. 
3df0: 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65  The table is ope
3e00: 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72  ned using cursor
3e10: 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69   0..*/.void sqli
3e20: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
3e30: 6c 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  le(Vdbe *v, int 
3e40: 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  iDb){.  sqlite3V
3e50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
3e60: 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b  nteger, iDb, 0);
3e70: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3e80: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
3e90: 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52  ite, 0, MASTER_R
3ea0: 4f 4f 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  OOT);.  sqlite3V
3eb0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
3ec0: 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c  etNumColumns, 0,
3ed0: 20 35 29 3b 20 2f 2a 20 73 71 6c 69 74 65 5f 6d   5); /* sqlite_m
3ee0: 61 73 74 65 72 20 68 61 73 20 35 20 63 6f 6c 75  aster has 5 colu
3ef0: 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mns */.}../*.** 
3f00: 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65  The token *pName
3f10: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61   contains the na
3f20: 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  me of a database
3f30: 20 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20   (either "main" 
3f40: 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20  or.** "temp" or 
3f50: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61  the name of an a
3f60: 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69  ttached db). Thi
3f70: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
3f80: 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f  s the.** index o
3f90: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61  f the named data
3fa0: 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b  base in db->aDb[
3fb0: 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20  ], or -1 if the 
3fc0: 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65  named db .** doe
3fd0: 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a  s not exist..*/.
3fe0: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 44  static int findD
3ff0: 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  b(sqlite3 *db, T
4000: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
4010: 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 2f  int i = -1;    /
4020: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
4030: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  r */.  int n;   
4040: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4050: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
4060: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 44   the name */.  D
4070: 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 2f 2a  b *pDb;       /*
4080: 20 41 20 64 61 74 61 62 61 73 65 20 77 68 6f 73   A database whos
4090: 65 20 6e 61 6d 65 20 73 70 61 63 65 20 69 73 20  e name space is 
40a0: 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 2a  being searched *
40b0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
40c0: 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72     /* Name we ar
40d0: 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  e searching for 
40e0: 2a 2f 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71  */..  zName = sq
40f0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
4100: 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  en(pName);.  if(
4110: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 6e 20   zName ){.    n 
4120: 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
4130: 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e  .    for(i=(db->
4140: 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d  nDb-1), pDb=&db-
4150: 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69  >aDb[i]; i>=0; i
4160: 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20  --, pDb--){.    
4170: 20 20 69 66 28 20 6e 3d 3d 73 74 72 6c 65 6e 28    if( n==strlen(
4180: 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 30  pDb->zName) && 0
4190: 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
41a0: 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  (pDb->zName, zNa
41b0: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  me) ){.        b
41c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
41d0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
41e0: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  ee(zName);.  }. 
41f0: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a   return i;.}../*
4200: 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   The table or vi
4210: 65 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61  ew or trigger na
4220: 6d 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  me is passed to 
4230: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61  this routine via
4240: 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65   tokens.** pName
4250: 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66  1 and pName2. If
4260: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
4270: 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  was fully qualif
4280: 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ied, for example
4290: 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54  :.**.** CREATE T
42a0: 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e  ABLE xxx.yyy (..
42b0: 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20  .);.** .** Then 
42c0: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
42d0: 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65   "xxx" and pName
42e0: 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20  2 "yyy". On the 
42f0: 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a  other hand if.**
4300: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
4310: 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61  is not fully qua
4320: 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a  lified, i.e.:.**
4330: 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45  .** CREATE TABLE
4340: 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a   yyy(...);.**.**
4350: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
4360: 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64  set to "yyy" and
4370: 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a   pName2 is ""..*
4380: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4390: 65 20 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e  e sets the *ppUn
43a0: 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20  qual pointer to 
43b0: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b  point at the tok
43c0: 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a  en (pName1 or.**
43d0: 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74   pName2) that st
43e0: 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69  ores the unquali
43f0: 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e  fied table name.
4400: 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74    The index of t
4410: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22  he.** database "
4420: 78 78 78 22 20 69 73 20 72 65 74 75 72 6e 65 64  xxx" is returned
4430: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4440: 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50  TwoPartName(.  P
4450: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4460: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
4470: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
4480: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
4490: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
44a0: 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20     /* The "xxx" 
44b0: 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78  in the name "xxx
44c0: 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a  .yyy" or "xxx" *
44d0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
44e0: 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  2,      /* The "
44f0: 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  yyy" in the name
4500: 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20   "xxx.yyy" */.  
4510: 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20  Token **pUnqual 
4520: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
4530: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a   unqualified obj
4540: 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f  ect name here */
4550: 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  .){.  int iDb;  
4560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4570: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
4580: 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74  lding the object
4590: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
45a0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
45b0: 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26  .  if( pName2 &&
45c0: 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a   pName2->n>0 ){.
45d0: 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
45e0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
45f0: 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61    *pUnqual = pNa
4600: 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 66  me2;.    iDb = f
4610: 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31  indDb(db, pName1
4620: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
4630: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4640: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4650: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62  , "unknown datab
4660: 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29  ase %T", pName1)
4670: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
4680: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65  nErr++;.      re
4690: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
46a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
46b0: 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  rt( db->init.iDb
46c0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e  ==0 || db->init.
46d0: 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62 20  busy );.    iDb 
46e0: 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a  = db->init.iDb;.
46f0: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
4700: 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74  Name1;.  }.  ret
4710: 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn iDb;.}../*.*
4720: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4730: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
4740: 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72  if the UTF-8 str
4750: 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c  ing zName is a l
4760: 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66  egal.** unqualif
4770: 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e  ied name for a n
4780: 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  ew schema object
4790: 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20   (table, index, 
47a0: 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67  view or.** trigg
47b0: 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61  er). All names a
47c0: 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20  re legal except 
47d0: 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e  those that begin
47e0: 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67   with the string
47f0: 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69  .** "sqlite_" (i
4800: 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f  n upper, lower o
4810: 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54  r mixed case). T
4820: 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  his portion of t
4830: 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20  he namespace.** 
4840: 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  is reserved for 
4850: 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f  internal use..*/
4860: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
4870: 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73  kObjectName(Pars
4880: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
4890: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
48a0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62   if( !pParse->db
48b0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
48c0: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
48d0: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30   .          && 0
48e0: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
48f0: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
4900: 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71  _", 7) ){.    sq
4910: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
4920: 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61  arse, "object na
4930: 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  me reserved for 
4940: 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73  internal use: %s
4950: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ", zName);.    r
4960: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
4970: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
4980: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
4990: 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74  *.** Begin const
49a0: 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ructing a new ta
49b0: 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
49c0: 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54  on in memory.  T
49d0: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
49e0: 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61  rst of several a
49f0: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74  ction routines t
4a00: 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69  hat get called i
4a10: 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f  n response.** to
4a20: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
4a30: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70  statement.  In p
4a40: 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20  articular, this 
4a50: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
4a60: 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e  d.** after seein
4a70: 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45  g tokens "CREATE
4a80: 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e  " and "TABLE" an
4a90: 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  d the table name
4aa0: 2e 20 20 54 68 65 0a 2a 2a 20 70 53 74 61 72 74  .  The.** pStart
4ab0: 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 43 52   token is the CR
4ac0: 45 41 54 45 20 61 6e 64 20 70 4e 61 6d 65 20 69  EATE and pName i
4ad0: 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  s the table name
4ae0: 2e 20 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a  .  The isTemp.**
4af0: 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66   flag is true if
4b00: 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c   the table shoul
4b10: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
4b20: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
4b30: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e  abase.** file in
4b40: 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20  stead of in the 
4b50: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
4b60: 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  le.  This is nor
4b70: 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a  mally the case.*
4b80: 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50  * when the "TEMP
4b90: 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22  " or "TEMPORARY"
4ba0: 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20   keyword occurs 
4bb0: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52  in between.** CR
4bc0: 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a  EATE and TABLE..
4bd0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61  **.** The new ta
4be0: 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e  ble record is in
4bf0: 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75  itialized and pu
4c00: 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65  t in pParse->pNe
4c10: 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f  wTable..** As mo
4c20: 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  re of the CREATE
4c30: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
4c40: 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69   is parsed, addi
4c50: 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a  tional action.**
4c60: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62   routines will b
4c70: 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20  e called to add 
4c80: 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
4c90: 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e   to this record.
4ca0: 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
4cb0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
4cc0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  LE statement, th
4cd0: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
4ce0: 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  e() routine.** i
4cf0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70  s called to comp
4d00: 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75  lete the constru
4d10: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77  ction of the new
4d20: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a   table record..*
4d30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74  /.void sqlite3St
4d40: 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73  artTable(.  Pars
4d50: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
4d60: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
4d70: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72  /.  Token *pStar
4d80: 74 2c 20 20 20 2f 2a 20 54 68 65 20 22 43 52 45  t,   /* The "CRE
4d90: 41 54 45 22 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  ATE" token */.  
4da0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
4db0: 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
4dc0: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
4dd0: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
4de0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
4df0: 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  e2,   /* Second 
4e00: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65  part of the name
4e10: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
4e20: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
4e30: 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54  sTemp,      /* T
4e40: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
4e50: 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20   TEMP table */. 
4e60: 20 69 6e 74 20 69 73 56 69 65 77 20 20 20 20 20   int isView     
4e70: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
4e80: 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 29  s is a VIEW */.)
4e90: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  {.  Table *pTabl
4ea0: 65 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  e;.  Index *pIdx
4eb0: 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  ;.  char *zName 
4ec0: 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65  = 0; /* The name
4ed0: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
4ee0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
4ef0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
4f00: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
4f10: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f  t iDb;         /
4f20: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
4f30: 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20  r to create the 
4f40: 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f  table in */.  To
4f50: 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f  ken *pName;    /
4f60: 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61  * Unqualified na
4f70: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
4f80: 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20  to create */..  
4f90: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20  /* The table or 
4fa0: 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65  view name to cre
4fb0: 61 74 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  ate is passed to
4fc0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69   this routine vi
4fd0: 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e  a tokens.  ** pN
4fe0: 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e  ame1 and pName2.
4ff0: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61   If the table na
5000: 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61  me was fully qua
5010: 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d  lified, for exam
5020: 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  ple:.  **.  ** C
5030: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
5040: 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20  yyy (...);.  ** 
5050: 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  .  ** Then pName
5060: 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78  1 is set to "xxx
5070: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79  " and pName2 "yy
5080: 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  y". On the other
5090: 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68   hand if.  ** th
50a0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20  e table name is 
50b0: 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  not fully qualif
50c0: 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a  ied, i.e.:.  **.
50d0: 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
50e0: 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a  E yyy(...);.  **
50f0: 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  .  ** Then pName
5100: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
5110: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
5120: 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ""..  **.  ** Th
5130: 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74  e call below set
5140: 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e  s the pName poin
5150: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
5160: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
5170: 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32  1 or.  ** pName2
5180: 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  ) that stores th
5190: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61  e unqualified ta
51a0: 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61  ble name. The va
51b0: 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20  riable iDb is.  
51c0: 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  ** set to the in
51d0: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
51e0: 61 73 65 20 74 68 61 74 20 74 68 65 20 74 61 62  ase that the tab
51f0: 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f  le or view is to
5200: 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64   be.  ** created
5210: 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20   in..  */.  iDb 
5220: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
5230: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
5240: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
5250: 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  ame);.  if( iDb<
5260: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
5270: 28 20 69 73 54 65 6d 70 20 26 26 20 69 44 62 3e  ( isTemp && iDb>
5280: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63  1 ){.    /* If c
5290: 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74  reating a temp t
52a0: 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d  able, the name m
52b0: 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66  ay not be qualif
52c0: 69 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ied */.    sqlit
52d0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
52e0: 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61  e, "temporary ta
52f0: 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  ble name must be
5300: 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a   unqualified");.
5310: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
5320: 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 20 69    if( isTemp ) i
5330: 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73  Db = 1;..  pPars
5340: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20  e->sNameToken = 
5350: 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20  *pName;.  zName 
5360: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
5370: 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
5380: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
5390: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51  return;.  if( SQ
53a0: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
53b0: 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
53c0: 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29  pParse, zName) )
53d0: 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  {.    goto begin
53e0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
53f0: 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  }.  if( db->init
5400: 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70  .iDb==1 ) isTemp
5410: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
5420: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
5430: 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74  IZATION.  assert
5440: 28 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d  ( (isTemp & 1)==
5450: 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20  isTemp );.  {.  
5460: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
5470: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
5480: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
5490: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
54a0: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
54b0: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
54c0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54  SCHEMA_TABLE(isT
54d0: 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  emp), 0, zDb) ){
54e0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
54f0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
5500: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56     }.    if( isV
5510: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  iew ){.      if(
5520: 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20   isTemp ){.     
5530: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
5540: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45  _CREATE_TEMP_VIE
5550: 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  W;.      }else{.
5560: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
5570: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45  QLITE_CREATE_VIE
5580: 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  W;.      }.    }
5590: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
55a0: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
55b0: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
55c0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
55d0: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
55e0: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
55f0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
5600: 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LE;.      }.    
5610: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
5620: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
5630: 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20  e, code, zName, 
5640: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
5650: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
5660: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
5670: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
5680: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
5690: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
56a0: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
56b0: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
56c0: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
56d0: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
56e0: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
56f0: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
5700: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
5710: 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   does..  */.  if
5720: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
5730: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
5740: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f  Parse) ){.    go
5750: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
5760: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rror;.  }.  pTab
5770: 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  le = sqlite3Find
5780: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
5790: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
57a0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ame);.  if( pTab
57b0: 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  le ){.    sqlite
57c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
57d0: 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65  , "table %T alre
57e0: 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61  ady exists", pNa
57f0: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65  me);.    goto be
5800: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
5810: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 49 64 78  .  }.  if( (pIdx
5820: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
5830: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  dex(db, zName, 0
5840: 29 29 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20  ))!=0 && .      
5850: 28 20 69 44 62 3d 3d 30 20 7c 7c 20 21 64 62 2d  ( iDb==0 || !db-
5860: 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20  >init.busy) ){. 
5870: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5880: 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
5890: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
58a0: 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c  index named %s",
58b0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74   zName);.    got
58c0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
58d0: 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  ror;.  }.  pTabl
58e0: 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  e = sqliteMalloc
58f0: 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  ( sizeof(Table) 
5900: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
5910: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  =0 ){.    pParse
5920: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
5930: 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  MEM;.    pParse-
5940: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
5950: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
5960: 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  ror;.  }.  pTabl
5970: 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  e->zName = zName
5980: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ;.  pTable->nCol
5990: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
59a0: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  aCol = 0;.  pTab
59b0: 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  le->iPKey = -1;.
59c0: 20 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78    pTable->pIndex
59d0: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
59e0: 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 69 66 28  iDb = iDb;.  if(
59f0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
5a00: 6c 65 20 29 20 73 71 6c 69 74 65 33 44 65 6c 65  le ) sqlite3Dele
5a10: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 50 61 72  teTable(db, pPar
5a20: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a  se->pNewTable);.
5a30: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
5a40: 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20  ble = pTable;.. 
5a50: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
5a60: 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f  he magic sqlite_
5a70: 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75  sequence table u
5a80: 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65  sed by autoincre
5a90: 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  ment,.  ** then 
5aa0: 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72  record a pointer
5ab0: 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69   to this table i
5ac0: 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
5ad0: 61 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  ase structure.  
5ae0: 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52  ** so that INSER
5af0: 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74  T can find the t
5b00: 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a  able easily..  *
5b10: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
5b20: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
5b30: 45 4e 54 0a 20 20 69 66 28 20 73 74 72 63 6d 70  ENT.  if( strcmp
5b40: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
5b50: 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b  sequence")==0 ){
5b60: 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62  .    db->aDb[iDb
5b70: 5d 2e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62  ].pSeqTab = pTab
5b80: 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  le;.  }.#endif..
5b90: 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
5ba0: 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74  ating the code t
5bb0: 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20  hat will insert 
5bc0: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
5bd0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53   into.  ** the S
5be0: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
5bf0: 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72  le.  Note in par
5c00: 74 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20  ticular that we 
5c10: 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20  must go ahead.  
5c20: 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  ** and allocate 
5c30: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
5c40: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
5c50: 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f  entry now.  Befo
5c60: 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d  re any.  ** PRIM
5c70: 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
5c80: 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70  E keywords are p
5c90: 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65  arsed.  Those ke
5ca0: 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73  ywords will caus
5cb0: 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74  e.  ** indices t
5cc0: 6f 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64  o be created and
5cd0: 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72   the table recor
5ce0: 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f  d must come befo
5cf0: 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64  re the .  ** ind
5d00: 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68  ices.  Hence, th
5d10: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
5d20: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75  for the table mu
5d30: 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a  st be allocated.
5d40: 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20    ** now..  */. 
5d50: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
5d60: 75 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69  usy && (v = sqli
5d70: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
5d80: 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  e))!=0 ){.    sq
5d90: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
5da0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
5db0: 20 30 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f   0, iDb);..    /
5dc0: 2a 20 45 76 65 72 79 20 74 69 6d 65 20 61 20 6e  * Every time a n
5dd0: 65 77 20 74 61 62 6c 65 20 69 73 20 63 72 65 61  ew table is crea
5de0: 74 65 64 20 74 68 65 20 66 69 6c 65 2d 66 6f 72  ted the file-for
5df0: 6d 61 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65  mat.    ** and e
5e00: 6e 63 6f 64 69 6e 67 20 6d 65 74 61 2d 76 61 6c  ncoding meta-val
5e10: 75 65 73 20 61 72 65 20 73 65 74 20 69 6e 20 74  ues are set in t
5e20: 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 6e 0a  he database, in.
5e30: 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73      ** case this
5e40: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 61   is the first ta
5e50: 62 6c 65 20 63 72 65 61 74 65 64 2e 0a 20 20 20  ble created..   
5e60: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
5e70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
5e80: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 66 69 6c 65  nteger, db->file
5e90: 5f 66 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20  _format, 0);.   
5ea0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5eb0: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
5ec0: 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20  e, iDb, 1);.    
5ed0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5ee0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
5ef0: 64 62 2d 3e 65 6e 63 2c 20 30 29 3b 0a 20 20 20  db->enc, 0);.   
5f00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5f10: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
5f20: 65 2c 20 69 44 62 2c 20 34 29 3b 0a 0a 20 20 20  e, iDb, 4);..   
5f30: 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72   /* This just cr
5f40: 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f  eates a place-ho
5f50: 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74  lder record in t
5f60: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
5f70: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54   table..    ** T
5f80: 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65  he record create
5f90: 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  d does not conta
5fa0: 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e  in anything yet.
5fb0: 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70    It will be rep
5fc0: 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  laced.    ** by 
5fd0: 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69  the real entry i
5fe0: 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  n code generated
5ff0: 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61   at sqlite3EndTa
6000: 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ble()..    **.  
6010: 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66    ** The rowid f
6020: 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  or the new entry
6030: 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20   is left on the 
6040: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
6050: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77  ..    ** The row
6060: 69 64 20 76 61 6c 75 65 20 69 73 20 6e 65 65 64  id value is need
6070: 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 74  ed by the code t
6080: 68 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61  hat sqlite3EndTa
6090: 62 6c 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ble will.    ** 
60a0: 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f  generate..    */
60b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
60c0: 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 69 66  OMIT_VIEW.    if
60d0: 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20  ( isView ){.    
60e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
60f0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
6100: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  , 0, 0);.    }el
6110: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
6120: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6130: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65  eAddOp(v, OP_Cre
6140: 61 74 65 54 61 62 6c 65 2c 20 69 44 62 2c 20 30  ateTable, iDb, 0
6150: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
6160: 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61  ite3OpenMasterTa
6170: 62 6c 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20  ble(v, iDb);.   
6180: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6190: 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f  p(v, OP_NewRecno
61a0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
61b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
61c0: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
61d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
61e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
61f0: 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  g8, 0, 0);.    s
6200: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6210: 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c  v, OP_PutIntKey,
6220: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
6230: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6240: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
6250: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6260: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
6270: 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 1, 0);.  }..  
6280: 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65  /* Normal (non-e
6290: 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f  rror) return. */
62a0: 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a  .  return;..  /*
62b0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
62c0: 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72  urs, we jump her
62d0: 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65  e */.begin_table
62e0: 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65  _error:.  sqlite
62f0: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72  Free(zName);.  r
6300: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
6310: 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73  This macro is us
6320: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77  ed to compare tw
6330: 6f 20 73 74 72 69 6e 67 73 20 69 6e 20 61 20 63  o strings in a c
6340: 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20  ase-insensitive 
6350: 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73  manner..** It is
6360: 20 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72   slightly faster
6370: 20 74 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71   than calling sq
6380: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 29 20 64  lite3StrICmp() d
6390: 69 72 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20  irectly, but.** 
63a0: 70 72 6f 64 75 63 65 73 20 6c 61 72 67 65 72 20  produces larger 
63b0: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e  code..**.** WARN
63c0: 49 4e 47 3a 20 54 68 69 73 20 6d 61 63 72 6f 20  ING: This macro 
63d0: 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c  is not compatibl
63e0: 65 20 77 69 74 68 20 74 68 65 20 73 74 72 63 6d  e with the strcm
63f0: 70 28 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a  p() family. It.*
6400: 2a 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69  * returns true i
6410: 66 20 74 68 65 20 74 77 6f 20 73 74 72 69 6e 67  f the two string
6420: 73 20 61 72 65 20 65 71 75 61 6c 2c 20 6f 74 68  s are equal, oth
6430: 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f  erwise false..*/
6440: 0a 23 64 65 66 69 6e 65 20 53 54 52 49 43 4d 50  .#define STRICMP
6450: 28 78 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74 65  (x, y) (\.sqlite
6460: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28  3UpperToLower[*(
6470: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
6480: 28 78 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74  (x)]==   \.sqlit
6490: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  e3UpperToLower[*
64a0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
64b0: 29 28 79 29 5d 20 20 20 20 20 5c 0a 26 26 20 73  )(y)]     \.&& s
64c0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 28 78  qlite3StrICmp((x
64d0: 29 2b 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a  )+1,(y)+1)==0 ).
64e0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
64f0: 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74   column to the t
6500: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62  able currently b
6510: 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
6520: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  ..**.** The pars
6530: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
6540: 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65  utine once for e
6550: 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61  ach column decla
6560: 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43  ration.** in a C
6570: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
6580: 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53  ement.  sqlite3S
6590: 74 61 72 74 54 61 62 6c 65 28 29 20 67 65 74 73  tartTable() gets
65a0: 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74   called.** first
65b0: 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67   to get things g
65c0: 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73  oing.  Then this
65d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
65e0: 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63  ed for each.** c
65f0: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  olumn..*/.void s
6600: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28  qlite3AddColumn(
6610: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
6620: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
6630: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
6640: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
6650: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
6660: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
6670: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
6680: 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73   return;.  z = s
6690: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
66a0: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66  ken(pName);.  if
66b0: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
66c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
66d0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
66e0: 20 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20   if( STRICMP(z, 
66f0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
6700: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
6710: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6720: 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f  e, "duplicate co
6730: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20  lumn name: %s", 
6740: 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
6750: 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72  Free(z);.      r
6760: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
6770: 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20  .  if( (p->nCol 
6780: 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20  & 0x7)==0 ){.   
6790: 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20   Column *aNew;. 
67a0: 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65     aNew = sqlite
67b0: 52 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c  Realloc( p->aCol
67c0: 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69  , (p->nCol+8)*si
67d0: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
67e0: 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d  );.    if( aNew=
67f0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
6800: 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b   p->aCol = aNew;
6810: 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70  .  }.  pCol = &p
6820: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b  ->aCol[p->nCol];
6830: 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20  .  memset(pCol, 
6840: 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  0, sizeof(p->aCo
6850: 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e  l[0]));.  pCol->
6860: 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f  zName = z;. .  /
6870: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
6880: 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c   type specified,
6890: 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68   columns have th
68a0: 65 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69  e default affini
68b0: 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20  ty.  ** 'NONE'. 
68c0: 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74 79  If there is a ty
68d0: 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 74 68  pe specified, th
68e0: 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  en sqlite3AddCol
68f0: 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20  umnType() will. 
6900: 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65   ** be called ne
6910: 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e  xt to set pCol->
6920: 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74  affinity correct
6930: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d  ly..  */.  pCol-
6940: 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49  >affinity = SQLI
6950: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70  TE_AFF_NONE;.  p
6960: 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50 61  Col->pColl = pPa
6970: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
6980: 6c 6c 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b  ll;.  p->nCol++;
6990: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
69a0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
69b0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
69c0: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
69d0: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
69e0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
69f0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e  statement.  A "N
6a00: 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
6a10: 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  int has.** been 
6a20: 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  seen on a column
6a30: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
6a40: 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c  sets the notNull
6a50: 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20   flag on.** the 
6a60: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
6a70: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
6a80: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
6a90: 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50  ite3AddNotNull(P
6aa0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
6ab0: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61  t onError){.  Ta
6ac0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
6ad0: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
6ae0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
6af0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
6b00: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69  = p->nCol-1;.  i
6b10: 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f  f( i>=0 ) p->aCo
6b20: 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f  l[i].notNull = o
6b30: 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nError;.}../*.**
6b40: 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e   Scan the column
6b50: 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65   type name zType
6b60: 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20   (length nType) 
6b70: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a  and return the.*
6b80: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66  * associated aff
6b90: 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a  inity type..**.*
6ba0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
6bb0: 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65 70  oes a case-indep
6bc0: 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f 66  endent search of
6bd0: 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 0a   zType for the .
6be0: 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e  ** substrings in
6bf0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
6c00: 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20  able. If one of 
6c10: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69  the substrings i
6c20: 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20  s.** found, the 
6c30: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 66  corresponding af
6c40: 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72 6e  finity is return
6c50: 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f 6e  ed. If zType con
6c60: 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68  tains.** more th
6c70: 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  an one of the su
6c80: 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69 65  bstrings, entrie
6c90: 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f 70  s toward the top
6ca0: 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c   of .** the tabl
6cb0: 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79 2e  e take priority.
6cc0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
6cd0: 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42 49   zType is 'BLOBI
6ce0: 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  NT', .** SQLITE_
6cf0: 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20 72  AFF_INTEGER is r
6d00: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  eturned..**.** S
6d10: 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20 41  ubstring     | A
6d20: 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d  ffinity.** -----
6d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27  -----------.** '
6d50: 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20 53  INT'         | S
6d60: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
6d70: 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20 20  R.** 'CHAR'     
6d80: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
6d90: 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20  TEXT.** 'CLOB'  
6da0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
6db0: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58 54  FF_TEXT.** 'TEXT
6dc0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
6dd0: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42  E_AFF_TEXT.** 'B
6de0: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
6df0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a  LITE_AFF_NONE.**
6e00: 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74  .** If none of t
6e10: 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e  he substrings in
6e20: 20 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65   the above table
6e30: 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53   are found,.** S
6e40: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
6e50: 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  C is returned..*
6e60: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 73 71  /.static char sq
6e70: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
6e80: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  e(const char *zT
6e90: 79 70 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b  ype, int nType){
6ea0: 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20  .  u32 h = 0;.  
6eb0: 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54  char aff = SQLIT
6ec0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
6ed0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
6ee0: 63 68 61 72 20 2a 7a 49 6e 20 3d 20 7a 54 79 70  char *zIn = zTyp
6ef0: 65 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  e;.  const unsig
6f00: 6e 65 64 20 63 68 61 72 20 2a 7a 45 6e 64 20 3d  ned char *zEnd =
6f10: 20 28 7a 49 6e 2b 6e 54 79 70 65 29 3b 0a 0a 20   (zIn+nType);.. 
6f20: 20 77 68 69 6c 65 28 20 7a 49 6e 21 3d 7a 45 6e   while( zIn!=zEn
6f30: 64 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c  d ){.    h = (h<
6f40: 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70  <8) + sqlite3Upp
6f50: 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 49 6e 5d 3b  erToLower[*zIn];
6f60: 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20  .    zIn++;.    
6f70: 69 66 20 20 20 20 20 28 20 68 3d 3d 30 78 36 33  if     ( h==0x63
6f80: 36 38 36 31 37 32 20 29 20 61 66 66 20 3d 20 53  686172 ) aff = S
6f90: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 20  QLITE_AFF_TEXT; 
6fa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48 41            /* CHA
6fb0: 52 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  R */.    else if
6fc0: 28 20 68 3d 3d 30 78 36 33 36 43 36 46 36 32 20  ( h==0x636C6F62 
6fd0: 29 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41  ) aff = SQLITE_A
6fe0: 46 46 5f 54 45 58 54 3b 20 20 20 20 20 20 20 20  FF_TEXT;        
6ff0: 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20     /* CLOB */.  
7000: 20 20 65 6c 73 65 20 69 66 28 20 68 3d 3d 30 78    else if( h==0x
7010: 37 34 36 35 37 38 37 34 20 29 20 61 66 66 20 3d  74657874 ) aff =
7020: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
7030: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
7040: 45 58 54 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  EXT */.    else 
7050: 69 66 28 20 68 3d 3d 30 78 36 32 36 43 36 46 36  if( h==0x626C6F6
7060: 32 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45  2 && aff==SQLITE
7070: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 20  _AFF_NUMERIC ){ 
7080: 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a       /* BLOB */.
7090: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
70a0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
70b0: 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78   }else if( (h&0x
70c0: 30 30 46 46 46 46 46 46 29 3d 3d 30 78 30 30 36  00FFFFFF)==0x006
70d0: 39 36 45 37 34 20 29 7b 20 20 20 20 20 20 20 20  96E74 ){        
70e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
70f0: 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  T */.      aff =
7100: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
7110: 47 45 52 3b 20 0a 20 20 20 20 20 20 62 72 65 61  GER; .      brea
7120: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
7130: 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f  return aff;.}../
7140: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7150: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
7160: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
7170: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
7180: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
7190: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
71a0: 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73  ment.  The pFirs
71b0: 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66  t token is the f
71c0: 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e  irst.** token in
71d0: 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66   the sequence of
71e0: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73   tokens that des
71f0: 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f  cribe the type o
7200: 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  f the.** column 
7210: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
7220: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20  construction.   
7230: 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73  pLast is the las
7240: 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68  t token.** in th
7250: 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65  e sequence.  Use
7260: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
7270: 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61  n to construct a
7280: 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20   string.** that 
7290: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70  contains the typ
72a0: 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c  ename of the col
72b0: 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  umn and store th
72c0: 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20  at string.** in 
72d0: 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20  zType..*/ .void 
72e0: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
72f0: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
7300: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 46 69 72 73  se, Token *pFirs
7310: 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74 29  t, Token *pLast)
7320: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
7330: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
7340: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  n;.  char *z;.  
7350: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
7360: 68 61 72 20 2a 7a 49 6e 3b 0a 0a 20 20 43 6f 6c  har *zIn;..  Col
7370: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28  umn *pCol;.  if(
7380: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
7390: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
73a0: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
73b0: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30  Col-1;.  if( i<0
73c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f   ) return;.  pCo
73d0: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b  l = &p->aCol[i];
73e0: 0a 20 20 7a 49 6e 20 3d 20 70 46 69 72 73 74 2d  .  zIn = pFirst-
73f0: 3e 7a 3b 0a 20 20 6e 20 3d 20 70 4c 61 73 74 2d  >z;.  n = pLast-
7400: 3e 6e 20 2b 20 28 70 4c 61 73 74 2d 3e 7a 20 2d  >n + (pLast->z -
7410: 20 7a 49 6e 29 3b 0a 20 20 61 73 73 65 72 74 28   zIn);.  assert(
7420: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20   pCol->zType==0 
7430: 29 3b 0a 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a  );.  z = pCol->z
7440: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Type = sqliteMal
7450: 6c 6f 63 52 61 77 28 6e 2b 31 29 3b 0a 20 20 69  locRaw(n+1);.  i
7460: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
7470: 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  ;.  for(i=j=0; i
7480: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  <n; i++){.    in
7490: 74 20 63 20 3d 20 7a 49 6e 5b 69 5d 3b 0a 20 20  t c = zIn[i];.  
74a0: 20 20 69 66 28 20 69 73 73 70 61 63 65 28 63 29    if( isspace(c)
74b0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
74c0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d   z[j++] = c;.  }
74d0: 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 70  .  z[j] = 0;.  p
74e0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
74f0: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
7500: 79 70 65 28 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a  ype(z, n);.}../*
7510: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
7520: 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  on is the defaul
7530: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
7540: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
7550: 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66  ded column.** of
7560: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
7570: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
7580: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44  ruction..**.** D
7590: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70  efault value exp
75a0: 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65  ressions must be
75b0: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73   constant.  Rais
75c0: 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69  e an exception i
75d0: 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74  f this.** is not
75e0: 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a   the case..**.**
75f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
7600: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
7610: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
7620: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
7630: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
7640: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
7650: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7660: 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  3AddDefaultValue
7670: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7680: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
7690: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75  Table *p;.  Colu
76a0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20  mn *pCol;.  if( 
76b0: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
76c0: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
76d0: 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 28  urn;.  pCol = &(
76e0: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d  p->aCol[p->nCol-
76f0: 31 5d 29 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  1]);.  if( !sqli
7700: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
7710: 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  t(pExpr) ){.    
7720: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7730: 70 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74  pParse, "default
7740: 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e   value of column
7750: 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e   [%s] is not con
7760: 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20  stant",.        
7770: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
7780: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
7790: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 43 6f  e3ExprDelete(pCo
77a0: 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 70  l->pDflt);.    p
77b0: 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c  Col->pDflt = sql
77c0: 69 74 65 33 45 78 70 72 44 75 70 28 70 45 78 70  ite3ExprDup(pExp
77d0: 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
77e0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70  3ExprDelete(pExp
77f0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  r);.}../*.** Des
7800: 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41  ignate the PRIMA
7810: 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74  RY KEY for the t
7820: 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20  able.  pList is 
7830: 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  a list of names 
7840: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  .** of columns t
7850: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69  hat form the pri
7860: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c  mary key.  If pL
7870: 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ist is NULL, the
7880: 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  n the.** most re
7890: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
78a0: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
78b0: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
78c0: 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62  key..**.** A tab
78d0: 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d  le can have at m
78e0: 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  ost one primary 
78f0: 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62  key.  If the tab
7900: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a  le already has.*
7910: 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  * a primary key 
7920: 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65  (and this is the
7930: 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20   second primary 
7940: 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65  key) then create
7950: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a   an.** error..**
7960: 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41  .** If the PRIMA
7970: 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73  RY KEY is on a s
7980: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f  ingle column who
7990: 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49  se datatype is I
79a0: 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20  NTEGER,.** then 
79b0: 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75  we will try to u
79c0: 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  se that column a
79d0: 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65  s the rowid.  Se
79e0: 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65  t the Table.iPKe
79f0: 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  y.** field of th
7a00: 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
7a10: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
7a20: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
7a30: 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
7a40: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e  MARY KEY column.
7a50: 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73    Table.iPKey is
7a60: 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68   set to -1 if th
7a70: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54  ere is.** no INT
7a80: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
7a90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b  ..**.** If the k
7aa0: 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54  ey is not an INT
7ab0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
7ac0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
7ad0: 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20  unique.** index 
7ae0: 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f  for the key.  No
7af0: 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
7b00: 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52  d for INTEGER PR
7b10: 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76  IMARY KEYs..*/.v
7b20: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72  oid sqlite3AddPr
7b30: 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73  imaryKey(.  Pars
7b40: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
7b50: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
7b60: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
7b70: 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  pList,  /* List 
7b80: 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74  of field names t
7b90: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
7ba0: 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
7bb0: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
7bc0: 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e  o with a uniquen
7bd0: 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ess conflict */.
7be0: 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 20 20 20    int autoInc   
7bf0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
7c00: 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  he AUTOINCREMENT
7c10: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
7c20: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ent */.){.  Tabl
7c30: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
7c40: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63  ->pNewTable;.  c
7c50: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  har *zType = 0;.
7c60: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c    int iCol = -1,
7c70: 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   i;.  if( pTab==
7c80: 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79  0 ) goto primary
7c90: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28  _key_exit;.  if(
7ca0: 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65   pTab->hasPrimKe
7cb0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
7cc0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7cd0: 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c   .      "table \
7ce0: 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74  "%s\" has more t
7cf0: 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  han one primary 
7d00: 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  key", pTab->zNam
7d10: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69  e);.    goto pri
7d20: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
7d30: 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73 50 72   }.  pTab->hasPr
7d40: 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66 28  imKey = 1;.  if(
7d50: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
7d60: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43   iCol = pTab->nC
7d70: 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62  ol - 1;.    pTab
7d80: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50  ->aCol[iCol].isP
7d90: 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65  rimKey = 1;.  }e
7da0: 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
7db0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
7dc0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  ; i++){.      fo
7dd0: 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70  r(iCol=0; iCol<p
7de0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  Tab->nCol; iCol+
7df0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
7e00: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
7e10: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
7e20: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  , pTab->aCol[iCo
7e30: 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  l].zName)==0 ){.
7e40: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
7e50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7e60: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f   }.      if( iCo
7e70: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 20 70  l<pTab->nCol ) p
7e80: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
7e90: 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20  isPrimKey = 1;. 
7ea0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69     }.    if( pLi
7eb0: 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 20 69 43  st->nExpr>1 ) iC
7ec0: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69  ol = -1;.  }.  i
7ed0: 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  f( iCol>=0 && iC
7ee0: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  ol<pTab->nCol ){
7ef0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61  .    zType = pTa
7f00: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
7f10: 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ype;.  }.  if( z
7f20: 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 33 53  Type && sqlite3S
7f30: 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49  trICmp(zType, "I
7f40: 4e 54 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20  NTEGER")==0 ){. 
7f50: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
7f60: 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d   iCol;.    pTab-
7f70: 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72  >keyConf = onErr
7f80: 6f 72 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 75  or;.    pTab->au
7f90: 74 6f 49 6e 63 20 3d 20 61 75 74 6f 49 6e 63 3b  toInc = autoInc;
7fa0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74  .  }else if( aut
7fb0: 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20  oInc ){.#ifndef 
7fc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
7fd0: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71  INCREMENT.    sq
7fe0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7ff0: 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45  arse, "AUTOINCRE
8000: 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c  MENT is only all
8010: 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20  owed on an ".   
8020: 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49      "INTEGER PRI
8030: 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64  MARY KEY");.#end
8040: 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
8050: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
8060: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
8070: 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72   0, pList, onErr
8080: 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70  or, 0, 0);.    p
8090: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70  List = 0;.  }..p
80a0: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a  rimary_key_exit:
80b0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
80c0: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
80d0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
80e0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c  .** Set the coll
80f0: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f  ation function o
8100: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
8110: 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c 65  tly parsed table
8120: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68   column.** to th
8130: 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e  e CollSeq given.
8140: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8150: 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50  AddCollateType(P
8160: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
8170: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c  nst char *zType,
8180: 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20 54   int nType){.  T
8190: 61 62 6c 65 20 2a 70 3b 0a 20 20 49 6e 64 65 78  able *p;.  Index
81a0: 20 2a 70 49 64 78 3b 0a 20 20 43 6f 6c 6c 53 65   *pIdx;.  CollSe
81b0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20  q *pColl;.  int 
81c0: 69 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70  i;..  if( (p = p
81d0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
81e0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
81f0: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
8200: 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
8210: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
8220: 70 50 61 72 73 65 2c 20 7a 54 79 70 65 2c 20 6e  pParse, zType, n
8230: 54 79 70 65 29 3b 0a 20 20 70 2d 3e 61 43 6f 6c  Type);.  p->aCol
8240: 5b 69 5d 2e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c  [i].pColl = pCol
8250: 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  l;..  /* If the 
8260: 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72  column is declar
8270: 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52  ed as "<name> PR
8280: 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54  IMARY KEY COLLAT
8290: 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 2a 2a 20  E <type>",.  ** 
82a0: 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61  then an index ma
82b0: 79 20 68 61 76 65 20 62 65 65 6e 20 63 72 65 61  y have been crea
82c0: 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75  ted on this colu
82d0: 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20  mn before the.  
82e0: 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70  ** collation typ
82f0: 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72  e was added. Cor
8300: 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74 20  rect this if it 
8310: 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a  is the case..  *
8320: 2f 0a 20 20 66 6f 72 28 70 49 64 78 20 3d 20 70  /.  for(pIdx = p
8330: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
8340: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
8350: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
8360: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  Idx->nColumn==1 
8370: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d  );.    if( pIdx-
8380: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20  >aiColumn[0]==i 
8390: 29 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e  ) pIdx->keyInfo.
83a0: 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 43 6f 6c 6c  aColl[0] = pColl
83b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  ;.  }.}../*.** L
83c0: 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  ocate and return
83d0: 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74   an entry from t
83e0: 68 65 20 64 62 2e 61 43 6f 6c 6c 53 65 71 20 68  he db.aCollSeq h
83f0: 61 73 68 20 74 61 62 6c 65 2e 20 49 66 20 74 68  ash table. If th
8400: 65 20 65 6e 74 72 79 0a 2a 2a 20 73 70 65 63 69  e entry.** speci
8410: 66 69 65 64 20 62 79 20 7a 4e 61 6d 65 20 61 6e  fied by zName an
8420: 64 20 6e 4e 61 6d 65 20 69 73 20 6e 6f 74 20 66  d nName is not f
8430: 6f 75 6e 64 20 61 6e 64 20 70 61 72 61 6d 65 74  ound and paramet
8440: 65 72 20 27 63 72 65 61 74 65 27 20 69 73 0a 2a  er 'create' is.*
8450: 2a 20 74 72 75 65 2c 20 74 68 65 6e 20 63 72 65  * true, then cre
8460: 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 2e  ate a new entry.
8470: 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72   Otherwise retur
8480: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 45 61  n NULL..**.** Ea
8490: 63 68 20 70 6f 69 6e 74 65 72 20 73 74 6f 72 65  ch pointer store
84a0: 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  d in the sqlite3
84b0: 2e 61 43 6f 6c 6c 53 65 71 20 68 61 73 68 20 74  .aCollSeq hash t
84c0: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  able contains an
84d0: 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 74 68 72  .** array of thr
84e0: 65 65 20 43 6f 6c 6c 53 65 71 20 73 74 72 75 63  ee CollSeq struc
84f0: 74 75 72 65 73 2e 20 54 68 65 20 66 69 72 73 74  tures. The first
8500: 20 69 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   is the collatio
8510: 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 70 72  n sequence.** pr
8520: 65 66 66 65 72 72 65 64 20 66 6f 72 20 55 54 46  efferred for UTF
8530: 2d 38 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 55  -8, the second U
8540: 54 46 2d 31 36 6c 65 2c 20 61 6e 64 20 74 68 65  TF-16le, and the
8550: 20 74 68 69 72 64 20 55 54 46 2d 31 36 62 65 2e   third UTF-16be.
8560: 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 64 20 69 6d  .**.** Stored im
8570: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
8580: 74 68 65 20 74 68 72 65 65 20 63 6f 6c 6c 61 74  the three collat
8590: 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 69 73  ion sequences is
85a0: 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68   a copy of.** th
85b0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
85c0: 65 6e 63 65 20 6e 61 6d 65 2e 20 41 20 70 6f 69  ence name. A poi
85d0: 6e 74 65 72 20 74 6f 20 74 68 69 73 20 73 74 72  nter to this str
85e0: 69 6e 67 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ing is stored in
85f0: 0a 2a 2a 20 65 61 63 68 20 63 6f 6c 6c 61 74 69  .** each collati
8600: 6f 6e 20 73 65 71 75 65 6e 63 65 20 73 74 72 75  on sequence stru
8610: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
8620: 20 43 6f 6c 6c 53 65 71 20 2a 20 66 69 6e 64 43   CollSeq * findC
8630: 6f 6c 6c 53 65 71 45 6e 74 72 79 28 0a 20 20 73  ollSeqEntry(.  s
8640: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
8650: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
8660: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20  .  int nName,.  
8670: 69 6e 74 20 63 72 65 61 74 65 0a 29 7b 0a 20 20  int create.){.  
8680: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
8690: 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29 20    if( nName<0 ) 
86a0: 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a  nName = strlen(z
86b0: 4e 61 6d 65 29 3b 0a 20 20 70 43 6f 6c 6c 20 3d  Name);.  pColl =
86c0: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
86d0: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20  (&db->aCollSeq, 
86e0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 0a  zName, nName);..
86f0: 20 20 69 66 28 20 30 3d 3d 70 43 6f 6c 6c 20 26    if( 0==pColl &
8700: 26 20 63 72 65 61 74 65 20 29 7b 0a 20 20 20 20  & create ){.    
8710: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61  pColl = sqliteMa
8720: 6c 6c 6f 63 28 20 33 2a 73 69 7a 65 6f 66 28 2a  lloc( 3*sizeof(*
8730: 70 43 6f 6c 6c 29 20 2b 20 6e 4e 61 6d 65 20 2b  pColl) + nName +
8740: 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43   1 );.    if( pC
8750: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
8760: 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63  ll[0].zName = (c
8770: 68 61 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a  har*)&pColl[3];.
8780: 20 20 20 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 65        pColl[0].e
8790: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
87a0: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 31 5d  ;.      pColl[1]
87b0: 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  .zName = (char*)
87c0: 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20  &pColl[3];.     
87d0: 20 70 43 6f 6c 6c 5b 31 5d 2e 65 6e 63 20 3d 20   pColl[1].enc = 
87e0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3b 0a  SQLITE_UTF16LE;.
87f0: 20 20 20 20 20 20 70 43 6f 6c 6c 5b 32 5d 2e 7a        pColl[2].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 32 5d 2e 65 6e 63 20 3d 20 53 51  Coll[2].enc = SQ
8830: 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20  LITE_UTF16BE;.  
8840: 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c      memcpy(pColl
8850: 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  [0].zName, zName
8860: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , nName);.      
8870: 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 5b 6e  pColl[0].zName[n
8880: 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20  Name] = 0;.     
8890: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
88a0: 72 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  rt(&db->aCollSeq
88b0: 2c 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65  , pColl[0].zName
88c0: 2c 20 6e 4e 61 6d 65 2c 20 70 43 6f 6c 6c 29 3b  , nName, pColl);
88d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
88e0: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a  urn pColl;.}../*
88f0: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4e  .** Parameter zN
8900: 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ame points to a 
8910: 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 73 74  UTF-8 encoded st
8920: 72 69 6e 67 20 6e 4e 61 6d 65 20 62 79 74 65 73  ring nName bytes
8930: 20 6c 6f 6e 67 2e 0a 2a 2a 20 52 65 74 75 72 6e   long..** Return
8940: 20 74 68 65 20 43 6f 6c 6c 53 65 71 2a 20 70 6f   the CollSeq* po
8950: 69 6e 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f  inter for the co
8960: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
8970: 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 0a 2a 2a 20   named zName.** 
8980: 66 6f 72 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  for the encoding
8990: 20 27 65 6e 63 27 20 66 72 6f 6d 20 74 68 65 20   'enc' from the 
89a0: 64 61 74 61 62 61 73 65 20 27 64 62 27 2e 0a 2a  database 'db'..*
89b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 6e 74 72  *.** If the entr
89c0: 79 20 73 70 65 63 69 66 69 65 64 20 69 73 20 6e  y specified is n
89d0: 6f 74 20 66 6f 75 6e 64 20 61 6e 64 20 27 63 72  ot found and 'cr
89e0: 65 61 74 65 27 20 69 73 20 74 72 75 65 2c 20 74  eate' is true, t
89f0: 68 65 6e 20 63 72 65 61 74 65 20 61 0a 2a 2a 20  hen create a.** 
8a00: 6e 65 77 20 65 6e 74 72 79 2e 20 20 4f 74 68 65  new entry.  Othe
8a10: 72 77 69 73 65 20 72 65 74 75 72 6e 20 4e 55 4c  rwise return NUL
8a20: 4c 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  L..*/.CollSeq *s
8a30: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
8a40: 71 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  q(.  sqlite3 *db
8a50: 2c 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 63 6f  ,.  u8 enc,.  co
8a60: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
8a70: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20  .  int nName,.  
8a80: 69 6e 74 20 63 72 65 61 74 65 0a 29 7b 0a 20 20  int create.){.  
8a90: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
8aa0: 20 66 69 6e 64 43 6f 6c 6c 53 65 71 45 6e 74 72   findCollSeqEntr
8ab0: 79 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  y(db, zName, nNa
8ac0: 6d 65 2c 20 63 72 65 61 74 65 29 3b 0a 20 20 61  me, create);.  a
8ad0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 55 54  ssert( SQLITE_UT
8ae0: 46 38 3d 3d 31 20 26 26 20 53 51 4c 49 54 45 5f  F8==1 && SQLITE_
8af0: 55 54 46 31 36 4c 45 3d 3d 32 20 26 26 20 53 51  UTF16LE==2 && SQ
8b00: 4c 49 54 45 5f 55 54 46 31 36 42 45 3d 3d 33 20  LITE_UTF16BE==3 
8b10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 6e 63  );.  assert( enc
8b20: 3e 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 26 26  >=SQLITE_UTF8 &&
8b30: 20 65 6e 63 3c 3d 53 51 4c 49 54 45 5f 55 54 46   enc<=SQLITE_UTF
8b40: 31 36 42 45 20 29 3b 0a 20 20 69 66 28 20 70 43  16BE );.  if( pC
8b50: 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 2b 3d 20 65  oll ) pColl += e
8b60: 6e 63 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  nc-1;.  return p
8b70: 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  Coll;.}../*.** I
8b80: 6e 76 6f 6b 65 20 74 68 65 20 27 63 6f 6c 6c 61  nvoke the 'colla
8b90: 74 69 6f 6e 20 6e 65 65 64 65 64 27 20 63 61 6c  tion needed' cal
8ba0: 6c 62 61 63 6b 20 74 6f 20 72 65 71 75 65 73 74  lback to request
8bb0: 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71   a collation seq
8bc0: 75 65 6e 63 65 0a 2a 2a 20 69 6e 20 74 68 65 20  uence.** in the 
8bd0: 64 61 74 61 62 61 73 65 20 74 65 78 74 20 65 6e  database text en
8be0: 63 6f 64 69 6e 67 20 6f 66 20 6e 61 6d 65 20 7a  coding of name z
8bf0: 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61  Name, length nNa
8c00: 6d 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  me..** If the co
8c10: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
8c20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8c30: 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 73  callCollNeeded(s
8c40: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
8c50: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
8c60: 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 61 73 73  nt nName){.  ass
8c70: 65 72 74 28 20 21 64 62 2d 3e 78 43 6f 6c 6c 4e  ert( !db->xCollN
8c80: 65 65 64 65 64 20 7c 7c 20 21 64 62 2d 3e 78 43  eeded || !db->xC
8c90: 6f 6c 6c 4e 65 65 64 65 64 31 36 20 29 3b 0a 20  ollNeeded16 );. 
8ca0: 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29 20 6e   if( nName<0 ) n
8cb0: 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e  Name = strlen(zN
8cc0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ame);.  if( db->
8cd0: 78 43 6f 6c 6c 4e 65 65 64 65 64 20 29 7b 0a 20  xCollNeeded ){. 
8ce0: 20 20 20 63 68 61 72 20 2a 7a 45 78 74 65 72 6e     char *zExtern
8cf0: 61 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  al = sqliteStrND
8d00: 75 70 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  up(zName, nName)
8d10: 3b 0a 20 20 20 20 69 66 28 20 21 7a 45 78 74 65  ;.    if( !zExte
8d20: 72 6e 61 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20  rnal ) return;. 
8d30: 20 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64     db->xCollNeed
8d40: 65 64 28 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64  ed(db->pCollNeed
8d50: 65 64 41 72 67 2c 20 64 62 2c 20 28 69 6e 74 29  edArg, db, (int)
8d60: 64 62 2d 3e 65 6e 63 2c 20 7a 45 78 74 65 72 6e  db->enc, zExtern
8d70: 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  al);.    sqliteF
8d80: 72 65 65 28 7a 45 78 74 65 72 6e 61 6c 29 3b 0a  ree(zExternal);.
8d90: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
8da0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
8db0: 69 66 28 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  if( db->xCollNee
8dc0: 64 65 64 31 36 20 29 7b 0a 20 20 20 20 63 68 61  ded16 ){.    cha
8dd0: 72 20 63 6f 6e 73 74 20 2a 7a 45 78 74 65 72 6e  r const *zExtern
8de0: 61 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  al;.    sqlite3_
8df0: 76 61 6c 75 65 20 2a 70 54 6d 70 20 3d 20 73 71  value *pTmp = sq
8e00: 6c 69 74 65 33 47 65 74 54 72 61 6e 73 69 65 6e  lite3GetTransien
8e10: 74 56 61 6c 75 65 28 64 62 29 3b 0a 20 20 20 20  tValue(db);.    
8e20: 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
8e30: 74 72 28 70 54 6d 70 2c 20 2d 31 2c 20 7a 4e 61  tr(pTmp, -1, zNa
8e40: 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  me, SQLITE_UTF8,
8e50: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
8e60: 0a 20 20 20 20 7a 45 78 74 65 72 6e 61 6c 20 3d  .    zExternal =
8e70: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
8e80: 74 28 70 54 6d 70 2c 20 53 51 4c 49 54 45 5f 55  t(pTmp, SQLITE_U
8e90: 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 20  TF16NATIVE);.   
8ea0: 20 69 66 28 20 21 7a 45 78 74 65 72 6e 61 6c 20   if( !zExternal 
8eb0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 64 62  ) return;.    db
8ec0: 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 28  ->xCollNeeded16(
8ed0: 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41  db->pCollNeededA
8ee0: 72 67 2c 20 64 62 2c 20 28 69 6e 74 29 64 62 2d  rg, db, (int)db-
8ef0: 3e 65 6e 63 2c 20 7a 45 78 74 65 72 6e 61 6c 29  >enc, zExternal)
8f00: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
8f10: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
8f20: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 69 66 20  ne is called if 
8f30: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
8f40: 63 74 6f 72 79 20 66 61 69 6c 73 20 74 6f 20 64  ctory fails to d
8f50: 65 6c 69 76 65 72 20 61 0a 2a 2a 20 63 6f 6c 6c  eliver a.** coll
8f60: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69  ation function i
8f70: 6e 20 74 68 65 20 62 65 73 74 20 65 6e 63 6f 64  n the best encod
8f80: 69 6e 67 20 62 75 74 20 74 68 65 72 65 20 6d 61  ing but there ma
8f90: 79 20 62 65 20 6f 74 68 65 72 20 76 65 72 73 69  y be other versi
8fa0: 6f 6e 73 0a 2a 2a 20 6f 66 20 74 68 69 73 20 63  ons.** of this c
8fb0: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
8fc0: 6e 20 28 66 6f 72 20 6f 74 68 65 72 20 74 65 78  n (for other tex
8fd0: 74 20 65 6e 63 6f 64 69 6e 67 73 29 20 61 76 61  t encodings) ava
8fe0: 69 6c 61 62 6c 65 2e 20 55 73 65 20 6f 6e 65 0a  ilable. Use one.
8ff0: 2a 2a 20 6f 66 20 74 68 65 73 65 20 69 6e 73 74  ** of these inst
9000: 65 61 64 20 69 66 20 74 68 65 79 20 65 78 69 73  ead if they exis
9010: 74 2e 20 41 76 6f 69 64 20 61 20 55 54 46 2d 38  t. Avoid a UTF-8
9020: 20 3c 2d 3e 20 55 54 46 2d 31 36 20 63 6f 6e 76   <-> UTF-16 conv
9030: 65 72 73 69 6f 6e 20 69 66 0a 2a 2a 20 70 6f 73  ersion if.** pos
9040: 73 69 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  sible..*/.static
9050: 20 69 6e 74 20 73 79 6e 74 68 43 6f 6c 6c 53 65   int synthCollSe
9060: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
9070: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29   CollSeq *pColl)
9080: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
9090: 6c 6c 32 3b 0a 20 20 63 68 61 72 20 2a 7a 20 3d  ll2;.  char *z =
90a0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20   pColl->zName;. 
90b0: 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28   int n = strlen(
90c0: 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  z);.  sqlite3 *d
90d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
90e0: 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69    int i;.  stati
90f0: 63 20 63 6f 6e 73 74 20 75 38 20 61 45 6e 63 5b  c const u8 aEnc[
9100: 5d 20 3d 20 7b 20 53 51 4c 49 54 45 5f 55 54 46  ] = { SQLITE_UTF
9110: 31 36 42 45 2c 20 53 51 4c 49 54 45 5f 55 54 46  16BE, SQLITE_UTF
9120: 31 36 4c 45 2c 20 53 51 4c 49 54 45 5f 55 54 46  16LE, SQLITE_UTF
9130: 38 20 7d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  8 };.  for(i=0; 
9140: 69 3c 33 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  i<3; i++){.    p
9150: 43 6f 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33 46  Coll2 = sqlite3F
9160: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 61  indCollSeq(db, a
9170: 45 6e 63 5b 69 5d 2c 20 7a 2c 20 6e 2c 20 30 29  Enc[i], z, n, 0)
9180: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 32  ;.    if( pColl2
9190: 2d 3e 78 43 6d 70 21 3d 30 20 29 7b 0a 20 20 20  ->xCmp!=0 ){.   
91a0: 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 2c     memcpy(pColl,
91b0: 20 70 43 6f 6c 6c 32 2c 20 73 69 7a 65 6f 66 28   pColl2, sizeof(
91c0: 43 6f 6c 6c 53 65 71 29 29 3b 0a 20 20 20 20 20  CollSeq));.     
91d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
91e0: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  K;.    }.  }.  i
91f0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  f( pParse->nErr=
9200: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
9210: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
9220: 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61  , "no such colla
9230: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25  tion sequence: %
9240: 2e 2a 73 22 2c 20 6e 2c 20 7a 29 3b 0a 20 20 7d  .*s", n, z);.  }
9250: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b  .  pParse->nErr+
9260: 2b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  +;.  return SQLI
9270: 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  TE_ERROR;.}../*.
9280: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9290: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 63  is called on a c
92a0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
92b0: 65 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 75  e before it is u
92c0: 73 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20  sed to.** check 
92d0: 74 68 61 74 20 69 74 20 69 73 20 64 65 66 69 6e  that it is defin
92e0: 65 64 2e 20 41 6e 20 75 6e 64 65 66 69 6e 65 64  ed. An undefined
92f0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
9300: 6e 63 65 20 65 78 69 73 74 73 20 77 68 65 6e 0a  nce exists when.
9310: 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 69 73  ** a database is
9320: 20 6c 6f 61 64 65 64 20 74 68 61 74 20 63 6f 6e   loaded that con
9330: 74 61 69 6e 73 20 72 65 66 65 72 65 6e 63 65 73  tains references
9340: 20 74 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   to collation se
9350: 71 75 65 6e 63 65 73 0a 2a 2a 20 74 68 61 74 20  quences.** that 
9360: 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 64 65  have not been de
9370: 66 69 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  fined by sqlite3
9380: 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
9390: 6e 28 29 20 65 74 63 2e 0a 2a 2a 0a 2a 2a 20 49  n() etc..**.** I
93a0: 66 20 72 65 71 75 69 72 65 64 2c 20 74 68 69 73  f required, this
93b0: 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74   routine calls t
93c0: 68 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65  he 'collation ne
93d0: 65 64 65 64 27 20 63 61 6c 6c 62 61 63 6b 20 74  eded' callback t
93e0: 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 61 20 64  o.** request a d
93f0: 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65  efinition of the
9400: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
9410: 6e 63 65 2e 20 49 66 20 74 68 69 73 20 64 6f 65  nce. If this doe
9420: 73 6e 27 74 20 77 6f 72 6b 2c 20 0a 2a 2a 20 61  sn't work, .** a
9430: 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6c  n equivalent col
9440: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
9450: 74 68 61 74 20 75 73 65 73 20 61 20 74 65 78 74  that uses a text
9460: 20 65 6e 63 6f 64 69 6e 67 20 64 69 66 66 65 72   encoding differ
9470: 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ent.** from the 
9480: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
9490: 20 73 75 62 73 74 69 74 75 74 65 64 2c 20 69 66   substituted, if
94a0: 20 6f 6e 65 20 69 73 20 61 76 61 69 6c 61 62 6c   one is availabl
94b0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
94c0: 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 50 61  3CheckCollSeq(Pa
94d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c  rse *pParse, Col
94e0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20  lSeq *pColl){.  
94f0: 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 21 70 43  if( pColl && !pC
9500: 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20  oll->xCmp ){.   
9510: 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e   /* No collation
9520: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 69   sequence of thi
9530: 73 20 74 79 70 65 20 66 6f 72 20 74 68 69 73 20  s type for this 
9540: 65 6e 63 6f 64 69 6e 67 20 69 73 20 72 65 67 69  encoding is regi
9550: 73 74 65 72 65 64 2e 0a 20 20 20 20 2a 2a 20 43  stered..    ** C
9560: 61 6c 6c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  all the collatio
9570: 6e 20 66 61 63 74 6f 72 79 20 74 6f 20 73 65 65  n factory to see
9580: 20 69 66 20 69 74 20 63 61 6e 20 73 75 70 70 6c   if it can suppl
9590: 79 20 75 73 20 77 69 74 68 20 6f 6e 65 2e 0a 20  y us with one.. 
95a0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 6c 6c 43 6f     */.    callCo
95b0: 6c 6c 4e 65 65 64 65 64 28 70 50 61 72 73 65 2d  llNeeded(pParse-
95c0: 3e 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  >db, pColl->zNam
95d0: 65 2c 20 73 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d  e, strlen(pColl-
95e0: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 69 66  >zName));.    if
95f0: 28 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 26  ( !pColl->xCmp &
9600: 26 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 70  & synthCollSeq(p
9610: 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b  Parse, pColl) ){
9620: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9630: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
9640: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
9650: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
9660: 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43  ** Call sqlite3C
9670: 68 65 63 6b 43 6f 6c 6c 53 65 71 28 29 20 66 6f  heckCollSeq() fo
9680: 72 20 61 6c 6c 20 63 6f 6c 6c 61 74 69 6e 67 20  r all collating 
9690: 73 65 71 75 65 6e 63 65 73 20 69 6e 20 61 6e 20  sequences in an 
96a0: 69 6e 64 65 78 2c 0a 2a 2a 20 69 6e 20 6f 72 64  index,.** in ord
96b0: 65 72 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  er to verify tha
96c0: 74 20 61 6c 6c 20 74 68 65 20 6e 65 63 65 73 73  t all the necess
96d0: 61 72 79 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ary collating se
96e0: 71 75 65 6e 63 65 73 20 61 72 65 0a 2a 2a 20 6c  quences are.** l
96f0: 6f 61 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oaded..*/.int sq
9700: 6c 69 74 65 33 43 68 65 63 6b 49 6e 64 65 78 43  lite3CheckIndexC
9710: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
9720: 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64  arse, Index *pId
9730: 78 29 7b 0a 20 20 69 66 28 20 70 49 64 78 20 29  x){.  if( pIdx )
9740: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
9750: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
9760: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
9770: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
9780: 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70  e3CheckCollSeq(p
9790: 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 6b 65 79  Parse, pIdx->key
97a0: 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 29  Info.aColl[i]) )
97b0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
97c0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
97d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
97e0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
97f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
9800: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
9810: 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  rns the collatio
9820: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64  n sequence for d
9830: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74  atabase native t
9840: 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20  ext.** encoding 
9850: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
9860: 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20  e string zName, 
9870: 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a  length nName..**
9880: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
9890: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  sted collation s
98a0: 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61  equence is not a
98b0: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74  vailable, or not
98c0: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e   available.** in
98d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
98e0: 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74  tive encoding, t
98f0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
9900: 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20  tory is invoked 
9910: 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74  to.** request it
9920: 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  . If the collati
9930: 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20  on factory does 
9940: 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20  not supply such 
9950: 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61  a sequence,.** a
9960: 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  nd the sequence 
9970: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
9980: 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63  another text enc
9990: 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74  oding, then that
99a0: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
99b0: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
99c0: 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66  f no versions of
99d0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
99e0: 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e  ollations sequen
99f0: 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ce are available
9a00: 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20  , or.** another 
9a10: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
9a20: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
9a30: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
9a40: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
9a50: 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 43  .** pParse..*/.C
9a60: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c  ollSeq *sqlite3L
9a70: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72  ocateCollSeq(Par
9a80: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
9a90: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
9aa0: 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 75 38 20  nt nName){.  u8 
9ab0: 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  enc = pParse->db
9ac0: 2d 3e 65 6e 63 3b 0a 20 20 75 38 20 69 6e 69 74  ->enc;.  u8 init
9ad0: 62 75 73 79 20 3d 20 70 50 61 72 73 65 2d 3e 64  busy = pParse->d
9ae0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20  b->init.busy;.  
9af0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
9b00: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
9b10: 53 65 71 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Seq(pParse->db, 
9b20: 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  enc, zName, nNam
9b30: 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20  e, initbusy);.  
9b40: 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e  if( nName<0 ) nN
9b50: 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61  ame = strlen(zNa
9b60: 6d 65 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74  me);.  if( !init
9b70: 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20  busy && (!pColl 
9b80: 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29  || !pColl->xCmp)
9b90: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 63 6f   ){.    /* No co
9ba0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
9bb0: 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 66 6f   of this type fo
9bc0: 72 20 74 68 69 73 20 65 6e 63 6f 64 69 6e 67 20  r this encoding 
9bd0: 69 73 20 72 65 67 69 73 74 65 72 65 64 2e 0a 20  is registered.. 
9be0: 20 20 20 2a 2a 20 43 61 6c 6c 20 74 68 65 20 63     ** Call the c
9bf0: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
9c00: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 63 61   to see if it ca
9c10: 6e 20 73 75 70 70 6c 79 20 75 73 20 77 69 74 68  n supply us with
9c20: 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
9c30: 20 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65 64 28   callCollNeeded(
9c40: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d  pParse->db, zNam
9c50: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 70  e, nName);.    p
9c60: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
9c70: 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ndCollSeq(pParse
9c80: 2d 3e 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65  ->db, enc, zName
9c90: 2c 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , nName, 0);.   
9ca0: 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 21 70   if( pColl && !p
9cb0: 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20  Coll->xCmp ){.  
9cc0: 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 61 79      /* There may
9cd0: 20 62 65 20 61 20 76 65 72 73 69 6f 6e 20 6f 66   be a version of
9ce0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
9cf0: 65 71 75 65 6e 63 65 20 74 68 61 74 20 72 65 71  equence that req
9d00: 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74  uires.      ** t
9d10: 72 61 6e 73 6c 61 74 69 6f 6e 20 62 65 74 77 65  ranslation betwe
9d20: 65 6e 20 65 6e 63 6f 64 69 6e 67 73 2e 20 53 65  en encodings. Se
9d30: 61 72 63 68 20 66 6f 72 20 69 74 20 77 69 74 68  arch for it with
9d40: 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2e   synthCollSeq().
9d50: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9d60: 69 66 28 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71  if( synthCollSeq
9d70: 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20  (pParse, pColl) 
9d80: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
9d90: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
9da0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
9db0: 6e 6f 74 68 69 6e 67 20 68 61 73 20 62 65 65 6e  nothing has been
9dc0: 20 66 6f 75 6e 64 2c 20 77 72 69 74 65 20 74 68   found, write th
9dd0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
9de0: 69 6e 74 6f 20 70 50 61 72 73 65 20 2a 2f 0a 20  into pParse */. 
9df0: 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26   if( !initbusy &
9e00: 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43  & (!pColl || !pC
9e10: 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20  oll->xCmp) ){.  
9e20: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
9e30: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  rr==0 ){.      s
9e40: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9e50: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
9e60: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
9e70: 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e 61 6d 65  ce: %.*s", nName
9e80: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , zName);.    }.
9e90: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20      pColl = 0;. 
9ea0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
9eb0: 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  l;.}.../*.** Gen
9ec0: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
9ed0: 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74  will increment t
9ee0: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
9ef0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65  ..**.** The sche
9f00: 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65  ma cookie is use
9f10: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  d to determine w
9f20: 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66  hen the schema f
9f30: 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  or the.** databa
9f40: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74  se changes.  Aft
9f50: 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20 63  er each schema c
9f60: 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69  hange, the cooki
9f70: 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67  e value.** chang
9f80: 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63  es.  When a proc
9f90: 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73 20  ess first reads 
9fa0: 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72 65  the schema it re
9fb0: 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f  cords the.** coo
9fc0: 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65 72  kie.  Thereafter
9fd0: 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f  , whenever it go
9fe0: 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  es to access the
9ff0: 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74   database,.** it
a000: 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b   checks the cook
a010: 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ie to make sure 
a020: 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e  the schema has n
a030: 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69  ot changed.** si
a040: 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20  nce it was last 
a050: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  read..**.** This
a060: 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d   plan is not com
a070: 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70  pletely bullet-p
a080: 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73  roof.  It is pos
a090: 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65  sible for.** the
a0a0: 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67   schema to chang
a0b0: 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  e multiple times
a0c0: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f   and for the coo
a0d0: 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74  kie to be.** set
a0e0: 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76   back to prior v
a0f0: 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d  alue.  But schem
a100: 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e  a changes are in
a110: 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20  frequent.** and 
a120: 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20  the probability 
a130: 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20 73  of hitting the s
a140: 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  ame cookie value
a150: 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68   is only.** 1 ch
a160: 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53  ance in 2^32.  S
a170: 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f  o we're safe eno
a180: 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ugh..*/.void sql
a190: 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
a1a0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
a1b0: 62 65 20 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b  be *v, int iDb){
a1c0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
a1d0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
a1e0: 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  r, db->aDb[iDb].
a1f0: 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c  schema_cookie+1,
a200: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
a210: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
a220: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30 29  tCookie, iDb, 0)
a230: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75  ;.}../*.** Measu
a240: 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  re the number of
a250: 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64   characters need
a260: 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65  ed to output the
a270: 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69   given.** identi
a280: 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65  fier.  The numbe
a290: 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  r returned inclu
a2a0: 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75  des any quotes u
a2b0: 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20  sed.** but does 
a2c0: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
a2d0: 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e  null terminator.
a2e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d  .**.** The estim
a2f0: 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74  ate is conservat
a300: 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62  ive.  It might b
a310: 65 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68  e larger that wh
a320: 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  at is.** really 
a330: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
a340: 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74  c int identLengt
a350: 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  h(const char *z)
a360: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72  {.  int n;.  for
a370: 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a  (n=0; *z; n++, z
a380: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  ++){.    if( *z=
a390: 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20  ='"' ){ n++; }. 
a3a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20   }.  return n + 
a3b0: 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  2;.}../*.** Writ
a3c0: 65 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20  e an identifier 
a3d0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
a3e0: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
a3f0: 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20  .  Add.** quote 
a400: 63 68 61 72 61 63 74 65 72 73 20 61 73 20 6e 65  characters as ne
a410: 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
a420: 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68  void identPut(ch
a430: 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78  ar *z, int *pIdx
a440: 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49  , char *zSignedI
a450: 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65  dent){.  unsigne
a460: 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d  d char *zIdent =
a470: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
a480: 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20  )zSignedIdent;. 
a490: 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51   int i, j, needQ
a4a0: 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64  uote;.  i = *pId
a4b0: 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  x;.  for(j=0; zI
a4c0: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
a4d0: 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28     if( !isalnum(
a4e0: 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49  zIdent[j]) && zI
a4f0: 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62  dent[j]!='_' ) b
a500: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64  reak;.  }.  need
a510: 51 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b  Quote =  zIdent[
a520: 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74  j]!=0 || isdigit
a530: 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20  (zIdent[0]).    
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
a550: 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43   sqlite3KeywordC
a560: 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d  ode(zIdent, j)!=
a570: 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65  TK_ID;.  if( nee
a580: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
a590: 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30  = '"';.  for(j=0
a5a0: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
a5b0: 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20  ){.    z[i++] = 
a5c0: 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69  zIdent[j];.    i
a5d0: 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22  f( zIdent[j]=='"
a5e0: 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  ' ) z[i++] = '"'
a5f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64  ;.  }.  if( need
a600: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
a610: 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30   '"';.  z[i] = 0
a620: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d  ;.  *pIdx = i;.}
a630: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
a640: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
a650: 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70  statement approp
a660: 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69  riate for the gi
a670: 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d  ven.** table.  M
a680: 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  emory to hold th
a690: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74  e text of the st
a6a0: 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69  atement is obtai
a6b0: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69  ned.** from sqli
a6c0: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
a6d0: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
a6e0: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
a6f0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
a700: 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c  char *createTabl
a710: 65 53 74 6d 74 28 54 61 62 6c 65 20 2a 70 29 7b  eStmt(Table *p){
a720: 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a  .  int i, k, n;.
a730: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
a740: 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53   char *zSep, *zS
a750: 65 70 32 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a  ep2, *zEnd, *z;.
a760: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
a770: 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70    n = 0;.  for(p
a780: 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69  Col = p->aCol, i
a790: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
a7a0: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
a7b0: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
a7c0: 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  h(pCol->zName);.
a7d0: 20 20 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54      z = pCol->zT
a7e0: 79 70 65 3b 0a 20 20 20 20 69 66 28 20 7a 20 29  ype;.    if( z )
a7f0: 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 28 73 74  {.      n += (st
a800: 72 6c 65 6e 28 7a 29 20 2b 20 31 29 3b 0a 20 20  rlen(z) + 1);.  
a810: 20 20 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69    }.  }.  n += i
a820: 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e  dentLength(p->zN
a830: 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30  ame);.  if( n<50
a840: 20 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22   ){.    zSep = "
a850: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
a860: 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22  ,";.    zEnd = "
a870: 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  )";.  }else{.   
a880: 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a   zSep = "\n  ";.
a890: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e      zSep2 = ",\n
a8a0: 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20    ";.    zEnd = 
a8b0: 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b  "\n)";.  }.  n +
a8c0: 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c  = 35 + 6*p->nCol
a8d0: 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69  ;.  zStmt = sqli
a8e0: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29  teMallocRaw( n )
a8f0: 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30  ;.  if( zStmt==0
a900: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
a910: 74 72 63 70 79 28 7a 53 74 6d 74 2c 20 70 2d 3e  trcpy(zStmt, p->
a920: 69 44 62 3d 3d 31 20 3f 20 22 43 52 45 41 54 45  iDb==1 ? "CREATE
a930: 20 54 45 4d 50 20 54 41 42 4c 45 20 22 20 3a 20   TEMP TABLE " : 
a940: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 29  "CREATE TABLE ")
a950: 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a  ;.  k = strlen(z
a960: 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75  Stmt);.  identPu
a970: 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e  t(zStmt, &k, p->
a980: 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b  zName);.  zStmt[
a990: 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f  k++] = '(';.  fo
a9a0: 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20  r(pCol=p->aCol, 
a9b0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
a9c0: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
a9d0: 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b    strcpy(&zStmt[
a9e0: 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b  k], zSep);.    k
a9f0: 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74 6d   += strlen(&zStm
aa00: 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20  t[k]);.    zSep 
aa10: 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65  = zSep2;.    ide
aa20: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
aa30: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
aa40: 20 20 20 69 66 28 20 28 7a 20 3d 20 70 43 6f 6c     if( (z = pCol
aa50: 2d 3e 7a 54 79 70 65 29 21 3d 30 20 29 7b 0a 20  ->zType)!=0 ){. 
aa60: 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20       zStmt[k++] 
aa70: 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 73 74 72  = ' ';.      str
aa80: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
aa90: 29 3b 0a 20 20 20 20 20 20 6b 20 2b 3d 20 73 74  );.      k += st
aaa0: 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 7d 0a 20  rlen(z);.    }. 
aab0: 20 7d 0a 20 20 73 74 72 63 70 79 28 26 7a 53 74   }.  strcpy(&zSt
aac0: 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20  mt[k], zEnd);.  
aad0: 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a  return zStmt;.}.
aae0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
aaf0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
ab00: 20 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61   report the fina
ab10: 6c 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69  l ")" that termi
ab20: 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54  nates.** a CREAT
ab30: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
ab40: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  t..**.** The tab
ab50: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
ab60: 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72  t other action r
ab70: 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65  outines have bee
ab80: 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73  n building.** is
ab90: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
aba0: 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c  ternal hash tabl
abb0: 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20  es, assuming no 
abc0: 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f  errors have.** o
abd0: 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  ccurred..**.** A
abe0: 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
abf0: 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e  table is made in
ac00: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
ac10: 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73  e on disk, unles
ac20: 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74  s.** this is a t
ac30: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
ac40: 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  r db->init.busy=
ac50: 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e  =1.  When db->in
ac60: 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74  it.busy==1.** it
ac70: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
ac80: 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
ac90: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65  _master table be
aca0: 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a  cause we just.**
acb0: 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68   connected to th
acc0: 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65  e database or be
acd0: 63 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65  cause the sqlite
ace0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61  _master table ha
acf0: 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68  s.** recently ch
ad00: 61 6e 67 65 73 2c 20 73 6f 20 74 68 65 20 65 6e  anges, so the en
ad10: 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62  try for this tab
ad20: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
ad30: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69  s in.** the sqli
ad40: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
ad50: 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74    We do not want
ad60: 20 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67   to create it ag
ad70: 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ain..**.** If th
ad80: 65 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65  e pSelect argume
ad90: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nt is not NULL, 
ada0: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
adb0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61  is routine.** wa
adc0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
add0: 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72  te a table gener
ade0: 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20  ated from a .** 
adf0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e  "CREATE TABLE ..
ae00: 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22  . AS SELECT ..."
ae10: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
ae20: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66   column names of
ae30: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c  .** the new tabl
ae40: 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65  e will match the
ae50: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
ae60: 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
ae70: 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  id sqlite3EndTab
ae80: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
ae90: 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53  , Token *pEnd, S
aea0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
aeb0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73  .  Table *p;.  s
aec0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
aed0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
aee0: 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c  (pEnd==0 && pSel
aef0: 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73  ect==0) || pPars
af00: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
af10: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
af20: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d   ) return;.  p =
af30: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
af40: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  le;.  if( p==0 )
af50: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
af60: 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
af70: 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29  sy || !pSelect )
af80: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  ;..  /* If the d
af90: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
afa0: 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  1 it means we ar
afb0: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51  e reading the SQ
afc0: 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22  L off the.  ** "
afd0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f  sqlite_master" o
afe0: 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  r "sqlite_temp_m
aff0: 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20  aster" table on 
b000: 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53  the disk..  ** S
b010: 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  o do not write t
b020: 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e  o the disk again
b030: 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72  .  Extract the r
b040: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  oot page number.
b050: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62    ** for the tab
b060: 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e  le from the db->
b070: 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65  init.newTnum fie
b080: 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e  ld.  (The page n
b090: 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c  umber.  ** shoul
b0a0: 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20  d have been put 
b0b0: 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c  there by the sql
b0c0: 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e  iteOpenCb routin
b0d0: 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  e.).  */.  if( d
b0e0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
b0f0: 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62      p->tnum = db
b100: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a  ->init.newTnum;.
b110: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74    }..  /* If not
b120: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74   initializing, t
b130: 68 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63  hen create a rec
b140: 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ord for the new 
b150: 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68  table.  ** in th
b160: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
b170: 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74  table of the dat
b180: 61 62 61 73 65 2e 20 20 54 68 65 20 72 65 63 6f  abase.  The reco
b190: 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66  rd number.  ** f
b1a0: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
b1b0: 20 65 6e 74 72 79 20 73 68 6f 75 6c 64 20 61 6c   entry should al
b1c0: 72 65 61 64 79 20 62 65 20 6f 6e 20 74 68 65 20  ready be on the 
b1d0: 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  stack..  **.  **
b1e0: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45   If this is a TE
b1f0: 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77  MPORARY table, w
b200: 72 69 74 65 20 74 68 65 20 65 6e 74 72 79 20 69  rite the entry i
b210: 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72  nto the auxiliar
b220: 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74  y.  ** file inst
b230: 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20  ead of into the 
b240: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
b250: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  le..  */.  if( !
b260: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
b270: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
b280: 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61  Vdbe *v;.    cha
b290: 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20  r *zType;    /* 
b2a0: 22 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65  "view" or "table
b2b0: 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  " */.    char *z
b2c0: 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45  Type2;   /* "VIE
b2d0: 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f  W" or "TABLE" */
b2e0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  .    char *zStmt
b2f0: 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20  ;    /* Text of 
b300: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
b310: 20 6f 72 20 43 52 45 41 54 45 20 56 49 45 57 20   or CREATE VIEW 
b320: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20  statement */..  
b330: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
b340: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
b350: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
b360: 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  urn;..    sqlite
b370: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b380: 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 0a  _Close, 0, 0);..
b390: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
b3a0: 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74  e rootpage for t
b3b0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 61 6e 64  he new table and
b3c0: 20 70 75 73 68 20 69 74 20 6f 6e 74 6f 20 74 68   push it onto th
b3d0: 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20  e stack..    ** 
b3e0: 41 20 76 69 65 77 20 68 61 73 20 6e 6f 20 72 6f  A view has no ro
b3f0: 6f 74 70 61 67 65 2c 20 73 6f 20 6a 75 73 74 20  otpage, so just 
b400: 70 75 73 68 20 61 20 7a 65 72 6f 20 6f 6e 74 6f  push a zero onto
b410: 20 74 68 65 20 73 74 61 63 6b 20 66 6f 72 0a 20   the stack for. 
b420: 20 20 20 2a 2a 20 76 69 65 77 73 2e 20 20 49 6e     ** views.  In
b430: 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 61  itialize zType a
b440: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
b450: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
b460: 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  p->pSelect==0 ){
b470: 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75  .      /* A regu
b480: 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  lar table */.   
b490: 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 56 64 62     /* sqlite3Vdb
b4a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65  eAddOp(v, OP_Cre
b4b0: 61 74 65 54 61 62 6c 65 2c 20 70 2d 3e 69 44 62  ateTable, p->iDb
b4c0: 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a  , 0); */.      z
b4d0: 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a  Type = "table";.
b4e0: 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
b4f0: 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20  TABLE";.#ifndef 
b500: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
b510: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b520: 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20    /* A view */. 
b530: 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 56 64     /*  sqlite3Vd
b540: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
b550: 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 20 2a 2f  teger, 0, 0); */
b560: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
b570: 76 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79  view";.      zTy
b580: 70 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65  pe2 = "VIEW";.#e
b590: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
b5a0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
b5b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 20  CREATE TABLE xx 
b5c0: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65  AS SELECT ..., e
b5d0: 78 65 63 75 74 65 20 74 68 65 20 53 45 4c 45 43  xecute the SELEC
b5e0: 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65  T.    ** stateme
b5f0: 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  nt to populate t
b600: 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68  he new table. Th
b610: 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  e root-page numb
b620: 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  er for the.    *
b630: 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6f  * new table is o
b640: 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  n the top of the
b650: 20 76 64 62 65 20 73 74 61 63 6b 2e 0a 20 20 20   vdbe stack..   
b660: 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20   **.    ** Once 
b670: 74 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62  the SELECT has b
b680: 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c  een coded by sql
b690: 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74  ite3Select(), it
b6a0: 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20   is in a.    ** 
b6b0: 73 75 69 74 61 62 6c 65 20 73 74 61 74 65 20 74  suitable state t
b6c0: 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 20  o query for the 
b6d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64  column names and
b6e0: 20 74 79 70 65 73 20 74 6f 20 62 65 20 75 73 65   types to be use
b6f0: 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  d.    ** by the 
b700: 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  new table..    *
b710: 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  /.    if( pSelec
b720: 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  t ){.      Table
b730: 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20 20 20 20   *pSelTab;.     
b740: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b750: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
b760: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
b770: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b780: 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e 69 44 62  _Integer, p->iDb
b790: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
b7a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b7b0: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
b7c0: 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
b7d0: 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20  e->nTab = 2;.   
b7e0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
b7f0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
b800: 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20  , SRT_Table, 1, 
b810: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  0, 0, 0, 0);.   
b820: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b830: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
b840: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   1, 0);.      if
b850: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
b860: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65  0 ){.        pSe
b870: 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
b880: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
b890: 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 65  pParse, 0, pSele
b8a0: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ct);.        if(
b8b0: 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65   pSelTab==0 ) re
b8c0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  turn;.        as
b8d0: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30  sert( p->aCol==0
b8e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   );.        p->n
b8f0: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
b900: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  Col;.        p->
b910: 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
b920: 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53  aCol;.        pS
b930: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
b940: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
b950: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
b960: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
b970: 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61  eTable(0, pSelTa
b980: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
b990: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  }..    /* Comput
b9a0: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  e the complete t
b9b0: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
b9c0: 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  E statement */. 
b9d0: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
b9e0: 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  {.      zStmt = 
b9f0: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
ba00: 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
ba10: 20 20 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45       n = Addr(pE
ba20: 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 50  nd->z) - Addr(pP
ba30: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
ba40: 2e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 7a  .z) + 1;.      z
ba50: 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
ba60: 72 69 6e 74 66 28 22 43 52 45 41 54 45 20 25 73  rintf("CREATE %s
ba70: 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20   %.*s", zType2, 
ba80: 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65  n, pParse->sName
ba90: 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 7d 0a  Token.z);.    }.
baa0: 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66  .    /* A slot f
bab0: 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68 61  or the record ha
bac0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
bad0: 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20  llocated in the 
bae0: 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d  .    ** SQLITE_M
baf0: 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65  ASTER table.  We
bb00: 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70   just need to up
bb10: 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77  date that slot w
bb20: 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  ith all.    ** t
bb30: 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  he information w
bb40: 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 20  e've collected. 
bb50: 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   The rowid for t
bb60: 68 65 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 0a  he preallocated.
bb70: 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 74      ** slot is t
bb80: 68 65 20 32 6e 64 20 69 74 65 6d 20 6f 6e 20 74  he 2nd item on t
bb90: 68 65 20 73 74 61 63 6b 2e 20 20 54 68 65 20 74  he stack.  The t
bba0: 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20  op of the stack 
bbb0: 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f  is the.    ** ro
bbc0: 6f 74 20 70 61 67 65 20 66 6f 72 20 74 68 65 20  ot page for the 
bbd0: 6e 65 77 20 74 61 62 6c 65 20 28 6f 72 20 61 20  new table (or a 
bbe0: 30 20 69 66 20 74 68 69 73 20 69 73 20 61 20 76  0 if this is a v
bbf0: 69 65 77 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  iew)..    */.   
bc00: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
bc10: 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
bc20: 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
bc30: 22 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20  ".         "SET 
bc40: 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d  type='%s', name=
bc50: 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c  %Q, tbl_name=%Q,
bc60: 20 72 6f 6f 74 70 61 67 65 3d 23 30 2c 20 73 71   rootpage=#0, sq
bc70: 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57  l=%Q ".       "W
bc80: 48 45 52 45 20 72 6f 77 69 64 3d 23 31 22 2c 0a  HERE rowid=#1",.
bc90: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 70 2d        db->aDb[p-
bca0: 3e 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  >iDb].zName, SCH
bcb0: 45 4d 41 5f 54 41 42 4c 45 28 70 2d 3e 69 44 62  EMA_TABLE(p->iDb
bcc0: 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a  ),.      zType,.
bcd0: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
bce0: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
bcf0: 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20        zStmt.    
bd00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
bd10: 65 28 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71  e(zStmt);.    sq
bd20: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
bd30: 65 28 64 62 2c 20 76 2c 20 70 2d 3e 69 44 62 29  e(db, v, p->iDb)
bd40: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
bd50: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
bd60: 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63  MENT.    /* Chec
bd70: 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e  k to see if we n
bd80: 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e  eed to create an
bd90: 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
bda0: 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a   table for.    *
bdb0: 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20  * keeping track 
bdc0: 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  of autoincrement
bdd0: 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20   keys..    */.  
bde0: 20 20 69 66 28 20 70 2d 3e 61 75 74 6f 49 6e 63    if( p->autoInc
bdf0: 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44   ){.      Db *pD
be00: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70 2d 3e  b = &db->aDb[p->
be10: 69 44 62 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  iDb];.      if( 
be20: 70 44 62 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20  pDb->pSeqTab==0 
be30: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
be40: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
be50: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
be60: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51  "CREATE TABLE %Q
be70: 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  .sqlite_sequence
be80: 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20  (name,seq)",.   
be90: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d         pDb->zNam
bea0: 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  e.        );.   
beb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
bec0: 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73  f..    /* Repars
bed0: 65 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20  e everything to 
bee0: 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72  update our inter
bef0: 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75  nal data structu
bf00: 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  res */.    sqlit
bf10: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
bf20: 50 61 72 73 65 53 63 68 65 6d 61 2c 20 70 2d 3e  ParseSchema, p->
bf30: 69 44 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  iDb, 0,.        
bf40: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
bf50: 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70  tbl_name='%q'",p
bf60: 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e  ->zName), P3_DYN
bf70: 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  AMIC);.  }...  /
bf80: 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20  * Add the table 
bf90: 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  to the in-memory
bfa0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
bfb0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
bfc0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
bfd0: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61  init.busy && pPa
bfe0: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
bff0: 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b      Table *pOld;
c000: 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  .    FKey *pFKey
c010: 3b 20 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d  ; .    Db *pDb =
c020: 20 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62   &db->aDb[p->iDb
c030: 5d 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71  ];.    pOld = sq
c040: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
c050: 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70  &pDb->tblHash, p
c060: 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  ->zName, strlen(
c070: 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b  p->zName)+1, p);
c080: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b  .    if( pOld ){
c090: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c0a0: 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61  ==pOld );  /* Ma
c0b0: 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
c0c0: 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73  ailed inside Has
c0d0: 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20  hInsert() */.   
c0e0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
c0f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c100: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
c110: 0a 20 20 20 20 66 6f 72 28 70 46 4b 65 79 3d 70  .    for(pFKey=p
c120: 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20  ->pFKey; pFKey; 
c130: 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65  pFKey=pFKey->pNe
c140: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69  xtFrom){.      i
c150: 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28  nt nTo = strlen(
c160: 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b  pFKey->zTo) + 1;
c170: 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e  .      pFKey->pN
c180: 65 78 74 54 6f 20 3d 20 73 71 6c 69 74 65 33 48  extTo = sqlite3H
c190: 61 73 68 46 69 6e 64 28 26 70 44 62 2d 3e 61 46  ashFind(&pDb->aF
c1a0: 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c  Key, pFKey->zTo,
c1b0: 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c   nTo);.      sql
c1c0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
c1d0: 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65  pDb->aFKey, pFKe
c1e0: 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b  y->zTo, nTo, pFK
c1f0: 65 79 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ey);.    }.#endi
c200: 66 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e  f.    pParse->pN
c210: 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  ewTable = 0;.   
c220: 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20   db->nTable++;. 
c230: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
c240: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
c250: 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  nges;.  }.}..#if
c260: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c270: 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20  _VIEW./*.** The 
c280: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
c290: 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64  s routine in ord
c2a0: 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  er to create a n
c2b0: 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20  ew VIEW.*/.void 
c2c0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65  sqlite3CreateVie
c2d0: 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
c2e0: 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70  se,     /* The p
c2f0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
c300: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69  /.  Token *pBegi
c310: 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52  n,     /* The CR
c320: 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
c330: 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65  begins the state
c340: 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
c350: 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20  *pName1,     /* 
c360: 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
c370: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
c380: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54   the view */.  T
c390: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
c3a0: 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74    /* The token t
c3b0: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  hat holds the na
c3c0: 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a  me of the view *
c3d0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
c3e0: 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45  ect,   /* A SELE
c3f0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
c400: 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
c410: 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20  e new view */.  
c420: 69 6e 74 20 69 73 54 65 6d 70 20 20 20 20 20 20  int isTemp      
c430: 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61     /* TRUE for a
c440: 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20   TEMPORARY view 
c450: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
c460: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e  ;.  int n;.  con
c470: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
c480: 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e   *z;.  Token sEn
c490: 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  d;.  DbFixer sFi
c4a0: 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  x;.  Token *pNam
c4b0: 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 61  e;..  sqlite3Sta
c4c0: 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  rtTable(pParse, 
c4d0: 70 42 65 67 69 6e 2c 20 70 4e 61 6d 65 31 2c 20  pBegin, pName1, 
c4e0: 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20  pName2, isTemp, 
c4f0: 31 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  1);.  p = pParse
c500: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
c510: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73  f( p==0 || pPars
c520: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73  e->nErr ){.    s
c530: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
c540: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  te(pSelect);.   
c550: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
c560: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
c570: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
c580: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
c590: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
c5a0: 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
c5b0: 50 61 72 73 65 2c 20 70 2d 3e 69 44 62 2c 20 22  Parse, p->iDb, "
c5c0: 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20  view", pName).  
c5d0: 20 20 26 26 20 73 71 6c 69 74 65 33 46 69 78 53    && sqlite3FixS
c5e0: 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65  elect(&sFix, pSe
c5f0: 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20 20 20 73  lect).  ){.    s
c600: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
c610: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  te(pSelect);.   
c620: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
c630: 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f  /* Make a copy o
c640: 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c  f the entire SEL
c650: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
c660: 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76  at defines the v
c670: 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77  iew..  ** This w
c680: 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68  ill force all th
c690: 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76  e Expr.token.z v
c6a0: 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61  alues to be dyna
c6b0: 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c  mically.  ** all
c6c0: 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68  ocated rather th
c6d0: 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  an point to the 
c6e0: 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77  input string - w
c6f0: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a  hich means that.
c700: 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70    ** they will p
c710: 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65  ersist after the
c720: 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33   current sqlite3
c730: 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74  _exec() call ret
c740: 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  urns..  */.  p->
c750: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
c760: 33 53 65 6c 65 63 74 44 75 70 28 70 53 65 6c 65  3SelectDup(pSele
c770: 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ct);.  sqlite3Se
c780: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65  lectDelete(pSele
c790: 63 74 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72  ct);.  if( !pPar
c7a0: 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73  se->db->init.bus
c7b0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
c7c0: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
c7d0: 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  es(pParse, p);. 
c7e0: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
c7f0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
c800: 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
c810: 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64  ment.  Make sEnd
c820: 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74   point to.  ** t
c830: 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73  he end..  */.  s
c840: 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c  End = pParse->sL
c850: 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20  astToken;.  if( 
c860: 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20  sEnd.z[0]!=0 && 
c870: 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29  sEnd.z[0]!=';' )
c880: 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20  {.    sEnd.z += 
c890: 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45  sEnd.n;.  }.  sE
c8a0: 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20  nd.n = 0;.  n = 
c8b0: 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d  sEnd.z - pBegin-
c8c0: 3e 7a 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e 73 74  >z;.  z = (const
c8d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29   unsigned char*)
c8e0: 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69  pBegin->z;.  whi
c8f0: 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d  le( n>0 && (z[n-
c900: 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61  1]==';' || isspa
c910: 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e  ce(z[n-1])) ){ n
c920: 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d  --; }.  sEnd.z =
c930: 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64   &z[n-1];.  sEnd
c940: 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73  .n = 1;..  /* Us
c950: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
c960: 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76  e() to add the v
c970: 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54  iew to the SQLIT
c980: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a  E_MASTER table *
c990: 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61  /.  sqlite3EndTa
c9a0: 62 6c 65 28 70 50 61 72 73 65 2c 20 26 73 45 6e  ble(pParse, &sEn
c9b0: 64 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b  d, 0);.  return;
c9c0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
c9d0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
c9e0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c9f0: 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
ca00: 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   The Table struc
ca10: 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72  ture pTable is r
ca20: 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46  eally a VIEW.  F
ca30: 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73  ill in the names
ca40: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   of.** the colum
ca50: 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69  ns of the view i
ca60: 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72  n the pTable str
ca70: 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20  ucture.  Return 
ca80: 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
ca90: 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20   errors.  If an 
caa0: 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65  error is seen le
cab0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
cac0: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
cad0: 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
cae0: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
caf0: 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20  lumnNames(Parse 
cb00: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
cb10: 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65  pTable){.  Table
cb20: 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20   *pSelTab;   /* 
cb30: 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f  A fake table fro
cb40: 6d 20 77 68 69 63 68 20 77 65 20 67 65 74 20 74  m which we get t
cb50: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
cb60: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b  .  Select *pSel;
cb70: 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
cb80: 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74 20  the SELECT that 
cb90: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
cba0: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72  iew */.  int nEr
cbb0: 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  r = 0;     /* Nu
cbc0: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65  mber of errors e
cbd0: 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20  ncountered */.  
cbe0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
cbf0: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79    /* Temporarily
cc00: 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65   holds the numbe
cc10: 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73  r of cursors ass
cc20: 69 67 6e 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  igned */..  asse
cc30: 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 20  rt( pTable );.. 
cc40: 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e   /* A positive n
cc50: 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f  Col means the co
cc60: 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20  lumns names for 
cc70: 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20  this view are.  
cc80: 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e  ** already known
cc90: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
cca0: 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65  ble->nCol>0 ) re
ccb0: 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20  turn 0;..  /* A 
ccc0: 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73  negative nCol is
ccd0: 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65   a special marke
cce0: 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77  r meaning that w
ccf0: 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  e are currently.
cd00: 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63    ** trying to c
cd10: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d  ompute the colum
cd20: 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20  n names.  If we 
cd30: 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  enter this routi
cd40: 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e  ne with.  ** a n
cd50: 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74  egative nCol, it
cd60: 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f   means two or mo
cd70: 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20  re views form a 
cd80: 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a  loop, like this:
cd90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43  .  **.  **     C
cda0: 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41  REATE VIEW one A
cdb0: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
cdc0: 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52  two;.  **     CR
cdd0: 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53  EATE VIEW two AS
cde0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f   SELECT * FROM o
cdf0: 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ne;.  **.  ** Ac
ce00: 74 75 61 6c 6c 79 2c 20 74 68 69 73 20 65 72 72  tually, this err
ce10: 6f 72 20 69 73 20 63 61 75 67 68 74 20 70 72 65  or is caught pre
ce20: 76 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20 74  viously and so t
ce30: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
ce40: 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c  t.  ** should al
ce50: 77 61 79 73 20 66 61 69 6c 2e 20 20 42 75 74 20  ways fail.  But 
ce60: 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 69 74  we will leave it
ce70: 20 69 6e 20 70 6c 61 63 65 20 6a 75 73 74 20 74   in place just t
ce80: 6f 20 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a  o be safe..  */.
ce90: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
cea0: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ol<0 ){.    sqli
ceb0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
cec0: 73 65 2c 20 22 76 69 65 77 20 25 73 20 69 73 20  se, "view %s is 
ced0: 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e  circularly defin
cee0: 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  ed", pTable->zNa
cef0: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
cf00: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
cf10: 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
cf20: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65   it means we nee
cf30: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
cf40: 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20   table names..  
cf50: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
cf60: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
cf70: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
cf80: 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20  t() will expand 
cf90: 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65  any.  ** "*" ele
cfa0: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73  ments in the res
cfb0: 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20  ults set of the 
cfc0: 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73  view and will as
cfd0: 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a  sign cursors.  *
cfe0: 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74  * to the element
cff0: 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  s of the FROM cl
d000: 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f  ause.  But we do
d010: 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20   not want these 
d020: 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20  changes.  ** to 
d030: 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53  be permanent.  S
d040: 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f  o the computatio
d050: 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63  n is done on a c
d060: 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
d070: 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  T.  ** statement
d080: 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
d090: 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61  e view..  */.  a
d0a0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70  ssert( pTable->p
d0b0: 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c  Select );.  pSel
d0c0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
d0d0: 44 75 70 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c  Dup(pTable->pSel
d0e0: 65 63 74 29 3b 0a 20 20 6e 20 3d 20 70 50 61 72  ect);.  n = pPar
d0f0: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 73 71 6c 69  se->nTab;.  sqli
d100: 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
d110: 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
d120: 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 70  pSel->pSrc);.  p
d130: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31  Table->nCol = -1
d140: 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71  ;.  pSelTab = sq
d150: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
d160: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30  Select(pParse, 0
d170: 2c 20 70 53 65 6c 29 3b 0a 20 20 70 50 61 72 73  , pSel);.  pPars
d180: 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 69  e->nTab = n;.  i
d190: 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20  f( pSelTab ){.  
d1a0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
d1b0: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
d1c0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
d1d0: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
d1e0: 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20     pTable->aCol 
d1f0: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
d200: 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43  .    pSelTab->nC
d210: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c  ol = 0;.    pSel
d220: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
d230: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
d240: 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62  Table(0, pSelTab
d250: 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70  );.    DbSetProp
d260: 65 72 74 79 28 70 50 61 72 73 65 2d 3e 64 62 2c  erty(pParse->db,
d270: 20 70 54 61 62 6c 65 2d 3e 69 44 62 2c 20 44 42   pTable->iDb, DB
d280: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a  _UnresetViews);.
d290: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61    }else{.    pTa
d2a0: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  ble->nCol = 0;. 
d2b0: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20     nErr++;.  }. 
d2c0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
d2d0: 6c 65 74 65 28 70 53 65 6c 29 3b 0a 20 20 72 65  lete(pSel);.  re
d2e0: 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23  turn nErr;  .}.#
d2f0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
d300: 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69  OMIT_VIEW */..#i
d310: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d320: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65  T_VIEW./*.** Cle
d330: 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
d340: 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56  mes from every V
d350: 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20  IEW in database 
d360: 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  idx..*/.static v
d370: 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
d380: 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a  setAll(sqlite3 *
d390: 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20  db, int idx){.  
d3a0: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69  HashElem *i;.  i
d3b0: 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  f( !DbHasPropert
d3c0: 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
d3d0: 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65  resetViews) ) re
d3e0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71  turn;.  for(i=sq
d3f0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
d400: 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 74 62 6c 48  b->aDb[idx].tblH
d410: 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74  ash); i; i=sqlit
d420: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
d430: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
d440: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
d450: 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  i);.    if( pTab
d460: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
d470: 20 20 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f     sqliteResetCo
d480: 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b  lumnNames(pTab);
d490: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43  .    }.  }.  DbC
d4a0: 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c  learProperty(db,
d4b0: 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
d4c0: 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a  Views);.}.#else.
d4d0: 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56  # define sqliteV
d4e0: 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29  iewResetAll(A,B)
d4f0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
d500: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
d510: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
d520: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
d530: 20 74 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a   the VDBE to adj
d540: 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ust the internal
d550: 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20   schema.** used 
d560: 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74  by SQLite when t
d570: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d  he btree layer m
d580: 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f  oves a table roo
d590: 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72  t page. The.** r
d5a0: 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61  oot-page of a ta
d5b0: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20  ble or index in 
d5c0: 64 61 74 61 62 61 73 65 20 69 44 62 20 68 61 73  database iDb has
d5d0: 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46   changed from iF
d5e0: 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a  rom.** to iTo..*
d5f0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
d600: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
d610: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f  .void sqlite3Roo
d620: 74 50 61 67 65 4d 6f 76 65 64 28 44 62 20 2a 70  tPageMoved(Db *p
d630: 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  Db, int iFrom, i
d640: 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45  nt iTo){.  HashE
d650: 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 0a 20  lem *pElem;.  . 
d660: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
d670: 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d  eHashFirst(&pDb-
d680: 3e 74 62 6c 48 61 73 68 29 3b 20 70 45 6c 65 6d  >tblHash); pElem
d690: 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
d6a0: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
d6b0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
d6c0: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
d6d0: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
d6e0: 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pTab->tnum==iFr
d6f0: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  om ){.      pTab
d700: 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
d710: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
d720: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 45 6c 65  }.  }.  for(pEle
d730: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
d740: 74 28 26 70 44 62 2d 3e 69 64 78 48 61 73 68 29  t(&pDb->idxHash)
d750: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
d760: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
d770: 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78  lem)){.    Index
d780: 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48   *pIdx = sqliteH
d790: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
d7a0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e      if( pIdx->tn
d7b0: 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
d7c0: 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20     pIdx->tnum = 
d7d0: 69 54 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  iTo;.      retur
d7e0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  n;.    }.  }.  a
d7f0: 73 73 65 72 74 28 30 29 3b 0a 7d 0a 23 65 6e 64  ssert(0);.}.#end
d800: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
d810: 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 68  code to erase th
d820: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
d830: 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66 72  t-page iTable fr
d840: 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  om database iDb.
d850: 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63  .** Also write c
d860: 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ode to modify th
d870: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
d880: 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e  table and intern
d890: 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20  al schema.** if 
d8a0: 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  a root-page of a
d8b0: 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
d8c0: 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
d8d0: 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a  ee-layer whilst.
d8e0: 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c  ** erasing iTabl
d8f0: 65 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70  e (this can happ
d900: 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d  en with an auto-
d910: 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29  vacuum database)
d920: 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
d930: 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67  d destroyRootPag
d940: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
d950: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74   int iTable, int
d960: 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76   iDb){.  Vdbe *v
d970: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
d980: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  e(pParse);.  sql
d990: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d9a0: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61   OP_Destroy, iTa
d9b0: 62 6c 65 2c 20 69 44 62 29 3b 0a 23 69 66 6e 64  ble, iDb);.#ifnd
d9c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
d9d0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f  UTOVACUUM.  /* O
d9e0: 50 5f 44 65 73 74 72 6f 79 20 70 75 73 68 65 73  P_Destroy pushes
d9f0: 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 6e 74 6f   an integer onto
da00: 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 74   the stack. If t
da10: 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a  his integer.  **
da20: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
da30: 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f  en it is the roo
da40: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
da50: 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74   a table moved t
da60: 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20  o.  ** location 
da70: 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c  iTable. The foll
da80: 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66  owing code modif
da90: 69 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ies the sqlite_m
daa0: 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20  aster table to. 
dab0: 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73   ** reflect this
dac0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
dad0: 22 23 30 22 20 69 6e 20 74 68 65 20 53 51 4c 20  "#0" in the SQL 
dae0: 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e  is a special con
daf0: 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73  stant that means
db00: 20 77 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a   whatever value.
db10: 20 20 2a 2a 20 69 73 20 6f 6e 20 74 68 65 20 74    ** is on the t
db20: 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
db30: 20 20 53 65 65 20 73 71 6c 69 74 65 33 52 65 67    See sqlite3Reg
db40: 69 73 74 65 72 45 78 70 72 28 29 2e 0a 20 20 2a  isterExpr()..  *
db50: 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65  /.  sqlite3Neste
db60: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
db70: 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e       "UPDATE %Q.
db80: 25 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d  %s SET rootpage=
db90: 25 64 20 57 48 45 52 45 20 23 30 20 41 4e 44 20  %d WHERE #0 AND 
dba0: 72 6f 6f 74 70 61 67 65 3d 23 30 22 2c 0a 20 20  rootpage=#0",.  
dbb0: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61     pParse->db->a
dbc0: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
dbd0: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
dbe0: 2c 20 69 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69  , iTable);.#endi
dbf0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  f.}../*.** Write
dc00: 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72   VDBE code to er
dc10: 61 73 65 20 74 61 62 6c 65 20 70 54 61 62 20 61  ase table pTab a
dc20: 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65  nd all associate
dc30: 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73  d indices on dis
dc40: 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70  k..** Code to up
dc50: 64 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f  date the sqlite_
dc60: 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e  master tables an
dc70: 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  d internal schem
dc80: 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a  a definitions.**
dc90: 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d   in case a root-
dca0: 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  page belonging t
dcb0: 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  o another table 
dcc0: 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20  is moved by the 
dcd0: 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69  btree layer.** i
dce0: 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68  s also added (th
dcf0: 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69  is can happen wi
dd00: 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  th an auto-vacuu
dd10: 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a  m database)..*/.
dd20: 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74  static void dest
dd30: 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a  royTable(Parse *
dd40: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
dd50: 54 61 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  Tab){.#ifdef SQL
dd60: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
dd70: 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  UUM.  Index *pId
dd80: 78 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  x;.  destroyRoot
dd90: 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 54 61  Page(pParse, pTa
dda0: 62 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 69  b->tnum, pTab->i
ddb0: 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  Db);.  for(pIdx=
ddc0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
ddd0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
dde0: 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72  Next){.    destr
ddf0: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
de00: 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70  e, pIdx->tnum, p
de10: 49 64 78 2d 3e 69 44 62 29 3b 0a 20 20 7d 0a 23  Idx->iDb);.  }.#
de20: 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65  else.  /* If the
de30: 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65   database may be
de40: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70   auto-vacuum cap
de50: 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f  able (if SQLITE_
de60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
de70: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69    ** is not defi
de80: 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73  ned), then it is
de90: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61   important to ca
dea0: 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e  ll OP_Destroy on
deb0: 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20   the.  ** table 
dec0: 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70  and index root-p
ded0: 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73  ages in order, s
dee0: 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65  tarting with the
def0: 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20   numerically .  
df00: 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  ** largest root-
df10: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69  page number. Thi
df20: 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  s guarantees tha
df30: 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  t none of the ro
df40: 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f  ot-pages.  ** to
df50: 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73   be destroyed is
df60: 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e   relocated by an
df70: 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74   earlier OP_Dest
df80: 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65  roy. i.e. if the
df90: 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  .  ** following 
dfa0: 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a  were coded:.  **
dfb0: 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  ** OP_Destroy
dfc0: 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20   4 0.  ** ....  
dfd0: 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  ** OP_Destroy 5 
dfe0: 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20  0.  **.  ** and 
dff0: 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70  root page 5 happ
e000: 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c  ened to be the l
e010: 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
e020: 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20   number in the. 
e030: 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
e040: 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77  en root page 5 w
e050: 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f  ould be moved to
e060: 20 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a   page 4 by the .
e070: 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79    ** "OP_Destroy
e080: 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68   4 0" opcode. Th
e090: 65 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50  e subsequent "OP
e0a0: 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f  _Destroy 5 0" wo
e0b0: 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66  uld hit.  ** a f
e0c0: 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20  ree-list page.. 
e0d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
e0e0: 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69   pTab->tnum;.  i
e0f0: 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20  nt iDestroyed = 
e100: 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29  0;..  while( 1 )
e110: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
e120: 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67  x;.    int iLarg
e130: 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  est = 0;..    if
e140: 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20  ( iDestroyed==0 
e150: 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79  || iTab<iDestroy
e160: 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72  ed ){.      iLar
e170: 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20  gest = iTab;.   
e180: 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d   }.    for(pIdx=
e190: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
e1a0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
e1b0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
e1c0: 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e   iIdx = pIdx->tn
e1d0: 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  um;.      assert
e1e0: 28 20 70 49 64 78 2d 3e 69 44 62 3d 3d 70 54 61  ( pIdx->iDb==pTa
e1f0: 62 2d 3e 69 44 62 20 29 3b 0a 20 20 20 20 20 20  b->iDb );.      
e200: 69 66 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d  if( (iDestroyed=
e210: 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73  =0 || (iIdx<iDes
e220: 74 72 6f 79 65 64 29 29 20 26 26 20 69 49 64 78  troyed)) && iIdx
e230: 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20  >iLargest ){.   
e240: 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20       iLargest = 
e250: 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iIdx;.      }.  
e260: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72    }.    if( iLar
e270: 67 65 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  gest==0 ) return
e280: 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  ;.    destroyRoo
e290: 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c  tPage(pParse, iL
e2a0: 61 72 67 65 73 74 2c 20 70 54 61 62 2d 3e 69 44  argest, pTab->iD
e2b0: 62 29 3b 0a 20 20 20 20 69 44 65 73 74 72 6f 79  b);.    iDestroy
e2c0: 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20  ed = iLargest;. 
e2d0: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
e2e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e2f0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20  is called to do 
e300: 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52  the work of a DR
e310: 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  OP TABLE stateme
e320: 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20  nt..** pName is 
e330: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
e340: 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70  table to be drop
e350: 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ped..*/.void sql
e360: 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61  ite3DropTable(Pa
e370: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
e380: 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
e390: 20 69 73 56 69 65 77 29 7b 0a 20 20 54 61 62 6c   isView){.  Tabl
e3a0: 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20  e *pTab;.  Vdbe 
e3b0: 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
e3c0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
e3d0: 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66    int iDb;..  if
e3e0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
e3f0: 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  | sqlite3_malloc
e400: 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65  _failed ) goto e
e410: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
e420: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
e430: 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54  >nSrc==1 );.  pT
e440: 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
e450: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
e460: 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
e470: 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
e480: 44 61 74 61 62 61 73 65 29 3b 0a 0a 20 20 69 66  Database);..  if
e490: 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f  ( pTab==0 ) goto
e4a0: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
e4b0: 3b 0a 20 20 69 44 62 20 3d 20 70 54 61 62 2d 3e  ;.  iDb = pTab->
e4c0: 69 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69  iDb;.  assert( i
e4d0: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
e4e0: 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65 66 20  >nDb );.#ifndef 
e4f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
e500: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
e510: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
e520: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
e530: 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
e540: 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20  pTab->iDb);.    
e550: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
e560: 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e  = db->aDb[pTab->
e570: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
e580: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
e590: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
e5a0: 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
e5b0: 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20  , 0, zDb)){.    
e5c0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
e5d0: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
e5e0: 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
e5f0: 20 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31        if( iDb==1
e600: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
e610: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
e620: 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
e630: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
e640: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
e650: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a  P_VIEW;.      }.
e660: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e670: 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20   if( iDb==1 ){. 
e680: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
e690: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
e6a0: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
e6b0: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
e6c0: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41  = SQLITE_DROP_TA
e6d0: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
e6e0: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
e6f0: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
e700: 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e  se, code, pTab->
e710: 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
e720: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
e730: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
e740: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
e750: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
e760: 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
e770: 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  TE, pTab->zName,
e780: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
e790: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
e7a0: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
e7b0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
e7c0: 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c  Tab->readOnly ||
e7d0: 20 70 54 61 62 3d 3d 64 62 2d 3e 61 44 62 5b 69   pTab==db->aDb[i
e7e0: 44 62 5d 2e 70 53 65 71 54 61 62 20 29 7b 0a 20  Db].pSeqTab ){. 
e7f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
e800: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
e810: 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
e820: 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e  dropped", pTab->
e830: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
e840: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
e850: 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
e860: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
e870: 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50    /* Ensure DROP
e880: 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73   TABLE is not us
e890: 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e  ed on a view, an
e8a0: 64 20 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e  d DROP VIEW is n
e8b0: 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20  ot used.  ** on 
e8c0: 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  a table..  */.  
e8d0: 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54  if( isView && pT
e8e0: 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ab->pSelect==0 )
e8f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
e900: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
e910: 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f  se DROP TABLE to
e920: 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73   delete table %s
e930: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
e940: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
e950: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
e960: 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
e970: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
e980: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
e990: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
e9a0: 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64  e DROP VIEW to d
e9b0: 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c 20  elete view %s", 
e9c0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
e9d0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
e9e0: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  _table;.  }.#end
e9f0: 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
ea00: 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
ea10: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
ea20: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
ea30: 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20  .  ** on disk.. 
ea40: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
ea50: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
ea60: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
ea70: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
ea80: 65 72 3b 0a 20 20 20 20 69 6e 74 20 69 44 62 20  er;.    int iDb 
ea90: 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20  = pTab->iDb;.   
eaa0: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
eab0: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 73 71  aDb[iDb];.    sq
eac0: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
ead0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
eae0: 20 30 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f   0, iDb);..    /
eaf0: 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67  * Drop all trigg
eb00: 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ers associated w
eb10: 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65  ith the table be
eb20: 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64  ing dropped. Cod
eb30: 65 0a 20 20 20 20 2a 2a 20 69 73 20 67 65 6e 65  e.    ** is gene
eb40: 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20  rated to remove 
eb50: 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c  entries from sql
eb60: 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f  ite_master and/o
eb70: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f  r.    ** sqlite_
eb80: 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72  temp_master if r
eb90: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
eba0: 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
ebb0: 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20  Tab->pTrigger;. 
ebc0: 20 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67     while( pTrigg
ebd0: 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  er ){.      asse
ebe0: 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 69 44  rt( pTrigger->iD
ebf0: 62 3d 3d 69 44 62 20 7c 7c 20 70 54 72 69 67 67  b==iDb || pTrigg
ec00: 65 72 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20  er->iDb==1 );.  
ec10: 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54      sqlite3DropT
ec20: 72 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65  riggerPtr(pParse
ec30: 2c 20 70 54 72 69 67 67 65 72 2c 20 31 29 3b 0a  , pTrigger, 1);.
ec40: 20 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d        pTrigger =
ec50: 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74   pTrigger->pNext
ec60: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
ec70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ec80: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f  OINCREMENT.    /
ec90: 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74  * Remove any ent
eca0: 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ries of the sqli
ecb0: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
ecc0: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
ecd0: 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62  h.    ** the tab
ece0: 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
ecf0: 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62  . This is done b
ed00: 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20  efore the table 
ed10: 69 73 20 64 72 6f 70 70 65 64 0a 20 20 20 20 2a  is dropped.    *
ed20: 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20 6c  * at the btree l
ed30: 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68  evel, in case th
ed40: 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
ed50: 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f  e table needs to
ed60: 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20  .    ** move as 
ed70: 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
ed80: 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e  drop (can happen
ed90: 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
eda0: 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  mode)..    */.  
edb0: 20 20 69 66 28 20 70 54 61 62 2d 3e 61 75 74 6f    if( pTab->auto
edc0: 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Inc ){.      sql
edd0: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
ede0: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
edf0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e  "DELETE FROM %s.
ee00: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
ee10: 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a  WHERE name=%Q",.
ee20: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61          pDb->zNa
ee30: 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a  me, pTab->zName.
ee40: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23        );.    }.#
ee50: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72  endif..    /* Dr
ee60: 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41  op all SQLITE_MA
ee70: 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69  STER table and i
ee80: 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61  ndex entries tha
ee90: 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20  t refer to the. 
eea0: 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65     ** table. The
eeb0: 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f   program name lo
eec0: 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ops through the 
eed0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
eee0: 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20   deletes.    ** 
eef0: 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72  every row that r
ef00: 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
ef10: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
ef20: 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69  e as the one bei
ef30: 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70 65  ng.    ** droppe
ef40: 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20  d. Triggers are 
ef50: 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74 65  handled seperate
ef60: 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69  ly because a tri
ef70: 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20 20  gger can be.    
ef80: 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  ** created in th
ef90: 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
efa0: 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
efb0: 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65   table in anothe
efc0: 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  r.    ** databas
efd0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
efe0: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
eff0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
f000: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
f010: 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e  Q.%s WHERE tbl_n
f020: 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21  ame=%Q and type!
f030: 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20  ='trigger'",.   
f040: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c       pDb->zName,
f050: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
f060: 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  b), pTab->zName)
f070: 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65  ;.    if( !isVie
f080: 77 20 29 7b 0a 20 20 20 20 20 20 64 65 73 74 72  w ){.      destr
f090: 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  oyTable(pParse, 
f0a0: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  pTab);.    }..  
f0b0: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
f0c0: 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d  table entry from
f0d0: 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e   SQLite's intern
f0e0: 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f  al schema and mo
f0f0: 64 69 66 79 0a 20 20 20 20 2a 2a 20 74 68 65 20  dify.    ** the 
f100: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20  schema cookie.. 
f110: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
f120: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44  3VdbeOp3(v, OP_D
f130: 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30  ropTable, iDb, 0
f140: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
f150: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
f160: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
f170: 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71  , iDb);.  }.  sq
f180: 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
f190: 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74  (db, iDb);..exit
f1a0: 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73  _drop_table:.  s
f1b0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
f1c0: 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  ete(pName);.}../
f1d0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f1e0: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  e is called to c
f1f0: 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65  reate a new fore
f200: 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74  ign key on the t
f210: 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  able.** currentl
f220: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
f230: 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20  tion.  pFromCol 
f240: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
f250: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
f260: 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
f270: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f   point to the fo
f280: 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70  reign key.  If p
f290: 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a  FromCol==0 then.
f2a0: 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b  ** connect the k
f2b0: 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63  ey to the last c
f2c0: 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20  olumn inserted. 
f2d0: 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65   pTo is the name
f2e0: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
f2f0: 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70   referred to.  p
f300: 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20  ToCol is a list 
f310: 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
f320: 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61   other.** pTo ta
f330: 62 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f 72  ble that the for
f340: 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20  eign key points 
f350: 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61  to.  flags conta
f360: 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72  ins all.** infor
f370: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
f380: 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
f390: 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20  tion algorithms 
f3a0: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20  specified.** in 
f3b0: 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f  the ON DELETE, O
f3c0: 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20  N UPDATE and ON 
f3d0: 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a  INSERT clauses..
f3e0: 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74  **.** An FKey st
f3f0: 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74  ructure is creat
f400: 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20  ed and added to 
f410: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
f420: 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e  tly.** under con
f430: 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65  struction in the
f440: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
f450: 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65 20 6e  le field.  The n
f460: 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f  ew FKey.** is no
f470: 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62  t linked into db
f480: 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69 73 20  ->aFKey at this 
f490: 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64 6f 65  point - that doe
f4a0: 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20  s not happen.** 
f4b0: 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 45 6e 64  until sqlite3End
f4c0: 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Table()..**.** T
f4d0: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  he foreign key i
f4e0: 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49  s set for IMMEDI
f4f0: 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  ATE processing. 
f500: 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   A subsequent ca
f510: 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ll.** to sqlite3
f520: 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
f530: 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  ) might change t
f540: 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e  his to DEFERRED.
f550: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f560: 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79  CreateForeignKey
f570: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
f580: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
f590: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
f5a0: 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d   ExprList *pFrom
f5b0: 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  Col,  /* Columns
f5c0: 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74   in this table t
f5d0: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68  hat point to oth
f5e0: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f  er table */.  To
f5f0: 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20  ken *pTo,       
f600: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
f610: 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  e other table */
f620: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f  .  ExprList *pTo
f630: 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col,    /* Colum
f640: 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  ns in the other 
f650: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66  table */.  int f
f660: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
f670: 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f  /* Conflict reso
f680: 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
f690: 73 2e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  s. */.){.#ifndef
f6a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
f6b0: 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20  EIGN_KEY.  FKey 
f6c0: 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 54 61  *pFKey = 0;.  Ta
f6d0: 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d  ble *p = pParse-
f6e0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e  >pNewTable;.  in
f6f0: 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69  t nByte;.  int i
f700: 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  ;.  int nCol;.  
f710: 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65  char *z;..  asse
f720: 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20  rt( pTo!=0 );.  
f730: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72  if( p==0 || pPar
f740: 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
f750: 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46  fk_end;.  if( pF
f760: 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
f770: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e   int iCol = p->n
f780: 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 69  Col-1;.    if( i
f790: 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f  Col<0 ) goto fk_
f7a0: 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f  end;.    if( pTo
f7b0: 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
f7c0: 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20  Expr!=1 ){.     
f7d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
f7e0: 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67  (pParse, "foreig
f7f0: 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20  n key on %s".   
f800: 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72        " should r
f810: 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e  eference only on
f820: 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  e column of tabl
f830: 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20  e %T",.         
f840: 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  p->aCol[iCol].zN
f850: 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20  ame, pTo);.     
f860: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
f870: 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31    }.    nCol = 1
f880: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  ;.  }else if( pT
f890: 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
f8a0: 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d  nExpr!=pFromCol-
f8b0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71  >nExpr ){.    sq
f8c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
f8d0: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e  arse,.        "n
f8e0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
f8f0: 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
f900: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
f910: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20  he number of ". 
f920: 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20         "columns 
f930: 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  in the reference
f940: 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67  d table");.    g
f950: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65  oto fk_end;.  }e
f960: 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  lse{.    nCol = 
f970: 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b  pFromCol->nExpr;
f980: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73  .  }.  nByte = s
f990: 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20  izeof(*pFKey) + 
f9a0: 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65  nCol*sizeof(pFKe
f9b0: 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54  y->aCol[0]) + pT
f9c0: 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20  o->n + 1;.  if( 
f9d0: 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
f9e0: 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d  r(i=0; i<pToCol-
f9f0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
fa00: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72      nByte += str
fa10: 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  len(pToCol->a[i]
fa20: 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20  .zName) + 1;.   
fa30: 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d   }.  }.  pFKey =
fa40: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e   sqliteMalloc( n
fa50: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46  Byte );.  if( pF
fa60: 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b  Key==0 ) goto fk
fa70: 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70  _end;.  pFKey->p
fa80: 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65  From = p;.  pFKe
fa90: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70  y->pNextFrom = p
faa0: 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28  ->pFKey;.  z = (
fab0: 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b  char*)&pFKey[1];
fac0: 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d  .  pFKey->aCol =
fad0: 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70   (struct sColMap
fae0: 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65  *)z;.  z += size
faf0: 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61  of(struct sColMa
fb00: 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79  p)*nCol;.  pFKey
fb10: 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d  ->zTo = z;.  mem
fb20: 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70  cpy(z, pTo->z, p
fb30: 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d  To->n);.  z[pTo-
fb40: 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20  >n] = 0;.  z += 
fb50: 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65  pTo->n+1;.  pFKe
fb60: 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a  y->pNextTo = 0;.
fb70: 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20    pFKey->nCol = 
fb80: 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f  nCol;.  if( pFro
fb90: 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70  mCol==0 ){.    p
fba0: 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46  FKey->aCol[0].iF
fbb0: 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  rom = p->nCol-1;
fbc0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
fbd0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
fbe0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ++){.      int j
fbf0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
fc00: 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29   j<p->nCol; j++)
fc10: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
fc20: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e  lite3StrICmp(p->
fc30: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70  aCol[j].zName, p
fc40: 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
fc50: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
fc60: 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c       pFKey->aCol
fc70: 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20  [i].iFrom = j;. 
fc80: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
fc90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fca0: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70  }.      if( j>=p
fcb0: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
fcc0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
fcd0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
fce0: 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f       "unknown co
fcf0: 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66  lumn \"%s\" in f
fd00: 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
fd10: 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20  ition", .       
fd20: 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69     pFromCol->a[i
fd30: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
fd40: 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
fd50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
fd60: 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
fd70: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
fd80: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
fd90: 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
fda0: 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
fdb0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65  ame);.      pFKe
fdc0: 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20  y->aCol[i].zCol 
fdd0: 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  = z;.      memcp
fde0: 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69  y(z, pToCol->a[i
fdf0: 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ].zName, n);.   
fe00: 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20     z[n] = 0;.   
fe10: 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20     z += n+1;.   
fe20: 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e   }.  }.  pFKey->
fe30: 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a  isDeferred = 0;.
fe40: 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43    pFKey->deleteC
fe50: 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78  onf = flags & 0x
fe60: 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64  ff;.  pFKey->upd
fe70: 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73  ateConf = (flags
fe80: 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a   >> 8 ) & 0xff;.
fe90: 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43    pFKey->insertC
fea0: 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20  onf = (flags >> 
feb0: 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20  16 ) & 0xff;..  
fec0: 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65  /* Link the fore
fed0: 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74  ign key to the t
fee0: 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74  able as the last
fef0: 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d   step..  */.  p-
ff00: 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a  >pFKey = pFKey;.
ff10: 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b    pFKey = 0;..fk
ff20: 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46 72  _end:.  sqliteFr
ff30: 65 65 28 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69  ee(pFKey);.#endi
ff40: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
ff50: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
ff60: 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69  N_KEY) */.  sqli
ff70: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
ff80: 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73  e(pFromCol);.  s
ff90: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
ffa0: 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a  lete(pToCol);.}.
ffb0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
ffc0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
ffd0: 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20  en an INITIALLY 
ffe0: 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49  IMMEDIATE or INI
fff0: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
10000 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65  ** clause is see
10010 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66  n as part of a f
10020 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
10030 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65  ition.  The isDe
10040 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65  ferred.** parame
10050 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49  ter is 1 for INI
10060 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20  TIALLY DEFERRED 
10070 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41  and 0 for INITIA
10080 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a  LLY IMMEDIATE..*
10090 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f  * The behavior o
100a0 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
100b0 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65  tly created fore
100c0 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73  ign key is adjus
100d0 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  ted.** according
100e0 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
100f0 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
10100 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ey(Parse *pParse
10110 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64  , int isDeferred
10120 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
10130 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
10140 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  EY.  Table *pTab
10150 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b  ;.  FKey *pFKey;
10160 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70  .  if( (pTab = p
10170 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
10180 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d  )==0 || (pFKey =
10190 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30   pTab->pFKey)==0
101a0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b   ) return;.  pFK
101b0 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
101c0 20 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e   isDeferred;.#en
101d0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  dif.}../*.** Gen
101e0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
101f0 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72  will erase and r
10200 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64  efill index *pId
10210 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75  x.  This is.** u
10220 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  sed to initializ
10230 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65  e a newly create
10240 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65  d index or to re
10250 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63  compute the.** c
10260 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64  ontent of an ind
10270 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74  ex in response t
10280 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  o a REINDEX comm
10290 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65  and..**.** if me
102a0 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74  mRootPage is not
102b0 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65   negative, it me
102c0 61 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e 64  ans that the ind
102d0 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63  ex is newly.** c
102e0 72 65 61 74 65 64 2e 20 20 54 68 65 20 6d 65 6d  reated.  The mem
102f0 6f 72 79 20 63 65 6c 6c 20 73 70 65 63 69 66 69  ory cell specifi
10300 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67  ed by memRootPag
10310 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a  e contains the.*
10320 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  * root page numb
10330 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  er of the index.
10340 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65    If memRootPage
10350 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
10360 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  en.** the index 
10370 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
10380 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72  nd must be clear
10390 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  ed before being 
103a0 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20  refilled and.** 
103b0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
103c0 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
103d0 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  x is taken from 
103e0 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f  pIndex->tnum..*/
103f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
10400 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
10410 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
10420 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e  ndex *pIndex, in
10430 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a  t memRootPage){.
10440 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
10450 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20  pIndex->pTable; 
10460 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68   /* The table th
10470 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f  at is indexed */
10480 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
10490 61 72 73 65 2d 3e 6e 54 61 62 3b 20 20 20 20 20  arse->nTab;     
104a0 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f    /* Btree curso
104b0 72 20 75 73 65 64 20 66 6f 72 20 70 54 61 62 20  r used for pTab 
104c0 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  */.  int iIdx = 
104d0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 31 3b 20  pParse->nTab+1; 
104e0 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
104f0 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e  sor used for pIn
10500 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  dex */.  int add
10510 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
10520 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
10530 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f  ss of top of loo
10540 70 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b  p */.  int tnum;
10550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10560 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
10570 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  ge of index */. 
10580 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
10590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105a0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
105b0 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75   into this virtu
105c0 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20  al machine */.  
105d0 69 6e 74 20 69 73 55 6e 69 71 75 65 3b 20 20 20  int isUnique;   
105e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
105f0 2a 20 54 72 75 65 20 66 6f 72 20 61 20 75 6e 69  * True for a uni
10600 71 75 65 20 69 6e 64 65 78 20 2a 2f 0a 0a 23 69  que index */..#i
10610 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10620 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
10630 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
10640 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
10650 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70  QLITE_REINDEX, p
10660 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c  Index->zName, 0,
10670 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
10680 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69  b->aDb[pIndex->i
10690 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20  Db].zName ) ){. 
106a0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
106b0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 73 75  endif..  /* Ensu
106c0 72 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  re all the requi
106d0 72 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  red collation se
106e0 71 75 65 6e 63 65 73 20 61 72 65 20 61 76 61 69  quences are avai
106f0 6c 61 62 6c 65 2e 20 54 68 69 73 0a 20 20 2a 2a  lable. This.  **
10700 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e   routine will in
10710 76 6f 6b 65 20 74 68 65 20 63 6f 6c 6c 61 74 69  voke the collati
10720 6f 6e 2d 6e 65 65 64 65 64 20 63 61 6c 6c 62 61  on-needed callba
10730 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  ck if necessary 
10740 28 61 6e 64 0a 20 20 2a 2a 20 69 66 20 6f 6e 65  (and.  ** if one
10750 20 68 61 73 20 62 65 65 6e 20 72 65 67 69 73 74   has been regist
10760 65 72 65 64 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  ered)..  */.  if
10770 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b 49 6e  ( sqlite3CheckIn
10780 64 65 78 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  dexCollSeq(pPars
10790 65 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  e, pIndex) ){.  
107a0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
107b0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
107c0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
107d0 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
107e0 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50  ;.  if( memRootP
107f0 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  age>=0 ){.    sq
10800 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10810 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65  , OP_MemLoad, me
10820 6d 52 6f 6f 74 50 61 67 65 2c 20 30 29 3b 0a 20  mRootPage, 0);. 
10830 20 20 20 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 7d     tnum = 0;.  }
10840 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d  else{.    tnum =
10850 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20   pIndex->tnum;. 
10860 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10870 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c  dOp(v, OP_Clear,
10880 20 74 6e 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69   tnum, pIndex->i
10890 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  Db);.  }.  sqlit
108a0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
108b0 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 6e 64 65  P_Integer, pInde
108c0 78 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 73 71  x->iDb, 0);.  sq
108d0 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
108e0 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49  OP_OpenWrite, iI
108f0 64 78 2c 20 74 6e 75 6d 2c 0a 20 20 20 20 20 20  dx, tnum,.      
10900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
10910 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65  har*)&pIndex->ke
10920 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46  yInfo, P3_KEYINF
10930 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  O);.  sqlite3Vdb
10940 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
10950 65 67 65 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c  eger, pTab->iDb,
10960 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
10970 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
10980 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 54  enRead, iTab, pT
10990 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 73 71 6c  ab->tnum);.  sql
109a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
109b0 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
109c0 73 2c 20 69 54 61 62 2c 20 70 54 61 62 2d 3e 6e  s, iTab, pTab->n
109d0 43 6f 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20  Col);.  addr1 = 
109e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
109f0 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
10a00 54 61 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  Tab, 0);.  sqlit
10a10 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b  e3GenerateIndexK
10a20 65 79 28 76 2c 20 70 49 6e 64 65 78 2c 20 69 54  ey(v, pIndex, iT
10a30 61 62 29 3b 0a 20 20 69 73 55 6e 69 71 75 65 20  ab);.  isUnique 
10a40 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  = pIndex->onErro
10a50 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 73 71  r!=OE_None;.  sq
10a60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10a70 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20 69 49 64  , OP_IdxPut, iId
10a80 78 2c 20 69 73 55 6e 69 71 75 65 29 3b 0a 20 20  x, isUnique);.  
10a90 69 66 28 20 69 73 55 6e 69 71 75 65 20 29 7b 0a  if( isUnique ){.
10aa0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
10ab0 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
10ac0 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20  indexed columns 
10ad0 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c  are not unique",
10ae0 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d   P3_STATIC);.  }
10af0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
10b00 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  dOp(v, OP_Next, 
10b10 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 0a  iTab, addr1+1);.
10b20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
10b30 6e 67 65 50 32 28 76 2c 20 61 64 64 72 31 2c 20  ngeP2(v, addr1, 
10b40 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
10b50 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 73 71  ntAddr(v));.  sq
10b60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10b70 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62  , OP_Close, iTab
10b80 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
10b90 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
10ba0 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a  lose, iIdx, 0);.
10bb0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
10bc0 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20  a new index for 
10bd0 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70  an SQL table.  p
10be0 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20  Name1.pName2 is 
10bf0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
10c00 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54  index .** and pT
10c10 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61  blList is the na
10c20 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
10c30 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
10c40 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c  dexed.  Both wil
10c50 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f  l .** be NULL fo
10c60 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  r a primary key 
10c70 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  or an index that
10c80 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20 73   is created to s
10c90 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51  atisfy a.** UNIQ
10ca0 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
10cb0 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49  If pTable and pI
10cc0 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75  ndex are NULL, u
10cd0 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
10ce0 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74  able.** as the t
10cf0 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
10d00 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  ed.  pParse->pNe
10d10 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c  wTable is a tabl
10d20 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72  e that is.** cur
10d30 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
10d40 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43 52  structed by a CR
10d50 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
10d60 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  ment..**.** pLis
10d70 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63  t is a list of c
10d80 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
10d90 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c  exed.  pList wil
10da0 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69  l be NULL if thi
10db0 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72  s.** is a primar
10dc0 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d  y key or unique-
10dd0 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68  constraint on th
10de0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f  e most recent co
10df0 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f  lumn added.** to
10e00 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
10e10 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
10e20 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f  ruction.  .*/.vo
10e30 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
10e40 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
10e50 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41  pParse,     /* A
10e60 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
10e70 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20  bout this parse 
10e80 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
10e90 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74  e1,     /* First
10ea0 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
10eb0 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
10ec0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
10ed0 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f  me2,     /* Seco
10ee0 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  nd part of index
10ef0 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
10f00 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  LL */.  SrcList 
10f10 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61  *pTblName, /* Ta
10f20 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73  ble to index. Us
10f30 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
10f40 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78  ble if 0 */.  Ex
10f50 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
10f60 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f   /* A list of co
10f70 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65  lumns to be inde
10f80 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
10f90 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f  rror,       /* O
10fa0 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f  E_Abort, OE_Igno
10fb0 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20  re, OE_Replace, 
10fc0 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20  or OE_None */.  
10fd0 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
10fe0 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
10ff0 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
11000 6e 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ns a CREATE TABL
11010 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  E statement */. 
11020 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20   Token *pEnd    
11030 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74      /* The ")" t
11040 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43  hat closes the C
11050 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
11060 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61  ement */.){.  Ta
11070 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20  ble *pTab = 0;  
11080 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
11090 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64  indexed */.  Ind
110a0 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20  ex *pIndex = 0; 
110b0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
110c0 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  be created */.  
110d0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
110e0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54  .  int i, j;.  T
110f0 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20  oken nullId;    
11100 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f  /* Fake token fo
11110 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69  r an empty ID li
11120 73 74 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20  st */.  DbFixer 
11130 73 46 69 78 3b 20 20 20 20 2f 2a 20 46 6f 72 20  sFix;    /* For 
11140 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61  assigning databa
11150 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62  se names to pTab
11160 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  le */.  int isTe
11170 6d 70 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  mp;      /* True
11180 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
11190 20 69 6e 64 65 78 20 2a 2f 0a 20 20 73 71 6c 69   index */.  sqli
111a0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
111b0 2d 3e 64 62 3b 0a 0a 20 20 69 6e 74 20 69 44 62  ->db;..  int iDb
111c0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
111d0 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
111e0 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e  ase that is bein
111f0 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54  g written */.  T
11200 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b  oken *pName = 0;
11210 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
11220 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
11230 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a  x to create */..
11240 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
11250 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
11260 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f  lloc_failed ) go
11270 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
11280 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ndex;..  /*.  **
11290 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   Find the table 
112a0 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
112b0 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65  dexed.  Return e
112c0 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e  arly if not foun
112d0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  d..  */.  if( pT
112e0 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20  blName!=0 ){..  
112f0 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f    /* Use the two
11300 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65  -part index name
11310 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
11320 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
11330 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72  ** to search for
11340 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78   the table. 'Fix
11350 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  ' the table name
11360 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20   to this db.    
11370 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e  ** before lookin
11380 67 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a  g up the table..
11390 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
113a0 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61  t( pName1 && pNa
113b0 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d  me2 );.    iDb =
113c0 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
113d0 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
113e0 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
113f0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
11400 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  <0 ) goto exit_c
11410 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20  reate_index;..  
11420 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65    /* If the inde
11430 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61  x name was unqua
11440 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66  lified, check if
11450 20 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a 20   the the table. 
11460 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20     ** is a temp 
11470 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65  table. If so, se
11480 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  t the database t
11490 6f 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  o 1..    */.    
114a0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72  pTab = sqlite3Sr
114b0 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72  cListLookup(pPar
114c0 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  se, pTblName);. 
114d0 20 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26     if( pName2 &&
114e0 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26   pName2->n==0 &&
114f0 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 69   pTab && pTab->i
11500 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69  Db==1 ){.      i
11510 44 62 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  Db = 1;.    }.. 
11520 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
11530 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
11540 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78  rse, iDb, "index
11550 22 2c 20 70 4e 61 6d 65 29 20 26 26 0a 20 20 20  ", pName) &&.   
11560 20 20 20 20 20 73 71 6c 69 74 65 33 46 69 78 53       sqlite3FixS
11570 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54  rcList(&sFix, pT
11580 62 6c 4e 61 6d 65 29 0a 20 20 20 20 29 7b 0a 20  blName).    ){. 
11590 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
115a0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
115b0 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71   }.    pTab = sq
115c0 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
115d0 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d  (pParse, pTblNam
115e0 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a  e->a[0].zName, .
115f0 20 20 20 20 20 20 20 20 70 54 62 6c 4e 61 6d 65          pTblName
11600 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
11610 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62  );.    if( !pTab
11620 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
11630 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61  ate_index;.    a
11640 73 73 65 72 74 28 20 69 44 62 3d 3d 70 54 61 62  ssert( iDb==pTab
11650 2d 3e 69 44 62 20 29 3b 0a 20 20 7d 65 6c 73 65  ->iDb );.  }else
11660 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
11670 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  ame==0 );.    pT
11680 61 62 20 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e  ab =  pParse->pN
11690 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 44 62  ewTable;.    iDb
116a0 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20   = pTab->iDb;.  
116b0 7d 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  }..  if( pTab==0
116c0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
116d0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
116e0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28  ate_index;.  if(
116f0 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20   pTab->readOnly 
11700 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
11710 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
11720 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
11730 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54   be indexed", pT
11740 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
11750 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
11760 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e  _index;.  }.#ifn
11770 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11780 56 49 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d  VIEW.  if( pTab-
11790 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
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 76 69 65 77 73 20 6d  pParse, "views m
117c0 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
117d0 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
117e0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
117f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 73  .  }.#endif.  is
11800 54 65 6d 70 20 3d 20 70 54 61 62 2d 3e 69 44 62  Temp = pTab->iDb
11810 3d 3d 31 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ==1;..  /*.  ** 
11820 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  Find the name of
11830 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b   the index.  Mak
11840 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
11850 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74  not already anot
11860 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  her.  ** index o
11870 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  r table with the
11880 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20   same name.  .  
11890 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
118a0 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65  n:  If we are re
118b0 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ading the names 
118c0 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64  of permanent ind
118d0 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ices from the.  
118e0 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
118f0 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20   table (because 
11900 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
11910 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73  ss changed the s
11920 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20  chema) and.  ** 
11930 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
11940 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20   names collides 
11950 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
11960 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
11970 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78  le or.  ** index
11980 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63  , then we will c
11990 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65  ontinue to proce
119a0 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  ss this index.. 
119b0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d   **.  ** If pNam
119c0 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
119d0 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64  at we are.  ** d
119e0 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72  ealing with a pr
119f0 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49  imary key or UNI
11a00 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
11a10 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65   We have to inve
11a20 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20  nt our.  ** own 
11a30 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
11a40 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
11a50 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
11a60 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
11a70 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
11a80 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
11a90 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
11aa0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
11ab0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
11ac0 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74  ( zName==0 ) got
11ad0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
11ae0 64 65 78 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  dex;.    if( SQL
11af0 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43  ITE_OK!=sqlite3C
11b00 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70  heckObjectName(p
11b10 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  Parse, zName) ){
11b20 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
11b30 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
11b40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62     }.    if( !db
11b50 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
11b60 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 53 61       Index *pISa
11b70 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 6e  meName;    /* An
11b80 6f 74 68 65 72 20 69 6e 64 65 78 20 77 69 74 68  other index with
11b90 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 2a   the same name *
11ba0 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
11bb0 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a  TSameName;    /*
11bc0 20 41 20 74 61 62 6c 65 20 77 69 74 68 20 73 61   A table with sa
11bd0 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 69  me name as the i
11be0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66  ndex */.      if
11bf0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
11c00 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
11c10 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78  Parse) ) goto ex
11c20 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
11c30 0a 20 20 20 20 20 20 69 66 28 20 28 70 49 53 61  .      if( (pISa
11c40 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  meName = sqlite3
11c50 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
11c60 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62  ame, db->aDb[iDb
11c70 5d 2e 7a 4e 61 6d 65 29 29 21 3d 30 20 29 7b 0a  ].zName))!=0 ){.
11c80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
11c90 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11ca0 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64  "index %s alread
11cb0 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65  y exists", zName
11cc0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
11cd0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
11ce0 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
11cf0 20 69 66 28 20 28 70 54 53 61 6d 65 4e 61 6d 65   if( (pTSameName
11d00 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
11d10 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  ble(db, zName, 0
11d20 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
11d30 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11d40 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
11d50 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62  is already a tab
11d60 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  le named %s", zN
11d70 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
11d80 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
11d90 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
11da0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
11db0 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
11dc0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49      int n;.    I
11dd0 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20  ndex *pLoop;.   
11de0 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d   for(pLoop=pTab-
11df0 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c  >pIndex, n=1; pL
11e00 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
11e10 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a  ->pNext, n++){}.
11e20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
11e30 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20 20 20 20 7a  ,"_%d",n);.    z
11e40 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71  Name = 0;.    sq
11e50 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
11e60 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61  zName, "sqlite_a
11e70 75 74 6f 69 6e 64 65 78 5f 22 2c 20 70 54 61 62  utoindex_", pTab
11e80 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75 66 2c 20 28  ->zName, zBuf, (
11e90 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 69 66  char*)0);.    if
11ea0 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74  ( zName==0 ) got
11eb0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
11ec0 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  dex;.  }..  /* C
11ed0 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69  heck for authori
11ee0 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65  zation to create
11ef0 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a   an index..  */.
11f00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11f10 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
11f20 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  N.  {.    const 
11f30 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
11f40 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a  aDb[pTab->iDb].z
11f50 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
11f60 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
11f70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
11f80 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
11f90 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a  LE(isTemp), 0, z
11fa0 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
11fb0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
11fc0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
11fd0 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
11fe0 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
11ff0 69 73 54 65 6d 70 20 29 20 69 20 3d 20 53 51 4c  isTemp ) i = SQL
12000 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
12010 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
12020 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
12030 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65  pParse, i, zName
12040 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
12050 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
12060 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
12070 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dex;.    }.  }.#
12080 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70  endif..  /* If p
12090 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e  List==0, it mean
120a0 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
120b0 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b  as called to mak
120c0 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a  e a primary.  **
120d0 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20   key out of the 
120e0 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  last column adde
120f0 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75  d to the table u
12100 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
12110 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74  n..  ** So creat
12120 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f  e a fake list to
12130 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a   simulate this..
12140 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74    */.  if( pList
12150 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49  ==0 ){.    nullI
12160 64 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  d.z = pTab->aCol
12170 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a  [pTab->nCol-1].z
12180 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64  Name;.    nullId
12190 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c 6c  .n = strlen(null
121a0 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74  Id.z);.    pList
121b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
121c0 73 74 41 70 70 65 6e 64 28 30 2c 20 30 2c 20 26  stAppend(0, 0, &
121d0 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28  nullId);.    if(
121e0 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f   pList==0 ) goto
121f0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
12200 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20  ex;.  }..  /* . 
12210 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   ** Allocate the
12220 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
12230 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78  . .  */.  pIndex
12240 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
12250 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b   sizeof(Index) +
12260 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b   strlen(zName) +
12270 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20   1 +.           
12280 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69               (si
12290 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65  zeof(int) + size
122a0 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29 2a 70 4c  of(CollSeq*))*pL
122b0 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
122c0 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 20  if( pIndex==0 ) 
122d0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
122e0 5f 69 6e 64 65 78 3b 0a 20 20 70 49 6e 64 65 78  _index;.  pIndex
122f0 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e  ->aiColumn = (in
12300 74 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49  t*)&pIndex->keyI
12310 6e 66 6f 2e 61 43 6f 6c 6c 5b 70 4c 69 73 74 2d  nfo.aColl[pList-
12320 3e 6e 45 78 70 72 5d 3b 0a 20 20 70 49 6e 64 65  >nExpr];.  pInde
12330 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  x->zName = (char
12340 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  *)&pIndex->aiCol
12350 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  umn[pList->nExpr
12360 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64  ];.  strcpy(pInd
12370 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  ex->zName, zName
12380 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61  );.  pIndex->pTa
12390 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49  ble = pTab;.  pI
123a0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20  ndex->nColumn = 
123b0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
123c0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
123d0 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e  = onError;.  pIn
123e0 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d  dex->autoIndex =
123f0 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e   pName==0;.  pIn
12400 64 65 78 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a  dex->iDb = iDb;.
12410 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e  .  /* Scan the n
12420 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75  ames of the colu
12430 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  mns of the table
12440 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61   to be indexed a
12450 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65  nd.  ** load the
12460 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20   column indices 
12470 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73  into the Index s
12480 74 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72  tructure.  Repor
12490 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20  t an error.  ** 
124a0 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73  if any column is
124b0 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
124c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
124d0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
124e0 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
124f0 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
12500 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
12510 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
12520 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70  t->a[i].zName, p
12530 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
12540 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
12550 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e      }.    if( j>
12560 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  =pTab->nCol ){. 
12570 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
12580 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
12590 62 6c 65 20 25 73 20 68 61 73 20 6e 6f 20 63 6f  ble %s has no co
125a0 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a  lumn named %s",.
125b0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
125c0 61 6d 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  ame, pList->a[i]
125d0 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67  .zName);.      g
125e0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
125f0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
12600 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
12610 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 69 66  n[i] = j;.    if
12620 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ( pList->a[i].pE
12630 78 70 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73  xpr ){.      ass
12640 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  ert( pList->a[i]
12650 2e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b  .pExpr->pColl );
12660 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b  .      pIndex->k
12670 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20  eyInfo.aColl[i] 
12680 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
12690 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20  xpr->pColl;.    
126a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e  }else{.      pIn
126b0 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  dex->keyInfo.aCo
126c0 6c 6c 5b 69 5d 20 3d 20 70 54 61 62 2d 3e 61 43  ll[i] = pTab->aC
126d0 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20  ol[j].pColl;.   
126e0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
126f0 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
12700 43 6f 6c 6c 5b 69 5d 20 29 3b 0a 20 20 20 20 69  Coll[i] );.    i
12710 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
12720 79 20 26 26 20 0a 20 20 20 20 20 20 20 20 73 71  y && .        sq
12730 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65  lite3CheckCollSe
12740 71 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  q(pParse, pIndex
12750 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
12760 69 5d 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  i]) .    ){.    
12770 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
12780 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
12790 20 20 7d 0a 20 20 70 49 6e 64 65 78 2d 3e 6b 65    }.  pIndex->ke
127a0 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70  yInfo.nField = p
127b0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20  List->nExpr;..  
127c0 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65  if( pTab==pParse
127d0 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20  ->pNewTable ){. 
127e0 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69     /* This routi
127f0 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  ne has been call
12800 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
12810 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
12820 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75  as a.    ** resu
12830 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20  lt of a PRIMARY 
12840 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c  KEY or UNIQUE cl
12850 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  ause on a column
12860 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a   definition, or.
12870 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59      ** a PRIMARY
12880 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
12890 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  lause following 
128a0 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  the column defin
128b0 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69  itions..    ** i
128c0 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20  .e. one of:.    
128d0 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  **.    ** CREATE
128e0 20 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41   TABLE t(x PRIMA
128f0 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20  RY KEY, y);.    
12900 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
12910 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78  t(x, y, UNIQUE(x
12920 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  , y));.    **.  
12930 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c    ** Either way,
12940 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
12950 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
12960 64 79 20 68 61 73 20 73 75 63 68 20 61 6e 20 69  dy has such an i
12970 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20  ndex. If.    ** 
12980 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72  so, don't bother
12990 20 63 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f   creating this o
129a0 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70  ne. This only ap
129b0 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20  plies to.    ** 
129c0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72  automatically cr
129d0 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55  eated indices. U
129e0 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74  sers can do as t
129f0 68 65 79 20 77 69 73 68 20 77 69 74 68 0a 20 20  hey wish with.  
12a00 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e    ** explicit in
12a10 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  dices..    */.  
12a20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
12a30 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
12a40 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
12a50 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
12a60 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a  ){.      int k;.
12a70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
12a80 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  dx->onError!=OE_
12a90 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20 61 73  None );.      as
12aa0 73 65 72 74 28 20 70 49 64 78 2d 3e 61 75 74 6f  sert( pIdx->auto
12ab0 49 6e 64 65 78 20 29 3b 0a 20 20 20 20 20 20 61  Index );.      a
12ac0 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6f  ssert( pIndex->o
12ad0 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
12ae0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49  );..      if( pI
12af0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e  dx->nColumn!=pIn
12b00 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63  dex->nColumn ) c
12b10 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
12b20 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e  or(k=0; k<pIdx->
12b30 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20  nColumn; k++){. 
12b40 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
12b50 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49  >aiColumn[k]!=pI
12b60 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  ndex->aiColumn[k
12b70 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
12b80 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6b 65 79     if( pIdx->key
12b90 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 21 3d 70  Info.aColl[k]!=p
12ba0 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
12bb0 43 6f 6c 6c 5b 6b 5d 20 29 20 62 72 65 61 6b 3b  Coll[k] ) break;
12bc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
12bd0 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c  f( k==pIdx->nCol
12be0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69  umn ){.        i
12bf0 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
12c00 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  !=pIndex->onErro
12c10 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
12c20 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  * This constrain
12c30 74 20 63 72 65 61 74 65 73 20 74 68 65 20 73 61  t creates the sa
12c40 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20 70 72  me index as a pr
12c50 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20  evious.         
12c60 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73   ** constraint s
12c70 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65  pecified somewhe
12c80 72 65 20 69 6e 20 74 68 65 20 43 52 45 41 54 45  re in the CREATE
12c90 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
12ca0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48  ..          ** H
12cb0 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f  owever the ON CO
12cc0 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61  NFLICT clauses a
12cd0 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66  re different. If
12ce0 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20   both this .    
12cf0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61        ** constra
12d00 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65 76  int and the prev
12d10 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20  ious equivalent 
12d20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20  constraint have 
12d30 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20  explicit.       
12d40 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43     ** ON CONFLIC
12d50 54 20 63 6c 61 75 73 65 73 20 74 68 69 73 20 69  T clauses this i
12d60 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65  s an error. Othe
12d70 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20  rwise, use the. 
12d80 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c           ** expl
12d90 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64  icitly specified
12da0 20 62 65 68 61 76 69 6f 75 72 20 66 6f 72 20 74   behaviour for t
12db0 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  he index..      
12dc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
12dd0 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45   if( !(pIdx->onE
12de0 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
12df0 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72   || pIndex->onEr
12e00 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29  ror==OE_Default)
12e10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12e20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12e30 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
12e40 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69           "confli
12e50 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43  cting ON CONFLIC
12e60 54 20 63 6c 61 75 73 65 73 20 73 70 65 63 69 66  T clauses specif
12e70 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ied", 0);.      
12e80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
12e90 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
12ea0 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b  r==OE_Default ){
12eb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64  .            pId
12ec0 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e  x->onError = pIn
12ed0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20  dex->onError;.  
12ee0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12ef0 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f    }.        goto
12f00 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
12f10 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
12f20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b  }.  }..  /* Link
12f30 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73   the new Index s
12f40 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20  tructure to its 
12f50 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65  table and to the
12f60 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d   other.  ** in-m
12f70 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73  emory database s
12f80 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f  tructures. .  */
12f90 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
12fa0 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65  busy ){.    Inde
12fb0 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71  x *p;.    p = sq
12fc0 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
12fd0 26 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d  &db->aDb[pIndex-
12fe0 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 0a  >iDb].idxHash, .
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13000 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d           pIndex-
13010 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
13020 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c  Index->zName)+1,
13030 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66   pIndex);.    if
13040 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ( p ){.      ass
13050 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29  ert( p==pIndex )
13060 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
13070 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f  t have failed */
13080 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
13090 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
130a0 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61     }.    db->fla
130b0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
130c0 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20  ernChanges;.    
130d0 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
130e0 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
130f0 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74  >tnum = db->init
13100 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a  .newTnum;.    }.
13110 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
13120 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
13130 73 20 30 20 74 68 65 6e 20 63 72 65 61 74 65 20  s 0 then create 
13140 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73  the index on dis
13150 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e  k.  This.  ** in
13160 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74  volves writing t
13170 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68  he index into th
13180 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e master table a
13190 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  nd filling in th
131a0 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74  e.  ** index wit
131b0 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  h the current ta
131c0 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20  ble contents..  
131d0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e  **.  ** The db->
131e0 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 77  init.busy is 0 w
131f0 68 65 6e 20 74 68 65 20 75 73 65 72 20 66 69 72  hen the user fir
13200 73 74 20 65 6e 74 65 72 73 20 61 20 43 52 45 41  st enters a CREA
13210 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63  TE INDEX .  ** c
13220 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69  ommand.  db->ini
13230 74 2e 62 75 73 79 20 69 73 20 31 20 77 68 65 6e  t.busy is 1 when
13240 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20 6f   a database is o
13250 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20  pened and .  ** 
13260 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
13270 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64  tements are read
13280 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74   out of the mast
13290 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20  er table.  In.  
132a0 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63 61  ** the latter ca
132b0 73 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72  se the index alr
132c0 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64  eady exists on d
132d0 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68  isk, which is wh
132e0 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20  y.  ** we don't 
132f0 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65  want to recreate
13300 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   it..  **.  ** I
13310 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74  f pTblName==0 it
13320 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65   means this inde
13330 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61  x is generated a
13340 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a  s a primary key.
13350 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63    ** or UNIQUE c
13360 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43  onstraint of a C
13370 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
13380 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68  ement.  Since th
13390 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73  e table.  ** has
133a0 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74   just been creat
133b0 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  ed, it contains 
133c0 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20  no data and the 
133d0 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61  index initializa
133e0 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63  tion.  ** step c
133f0 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20  an be skipped.. 
13400 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 64   */.  else if( d
13410 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
13420 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  ){.    Vdbe *v;.
13430 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b      char *zStmt;
13440 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20  .    int iMem = 
13450 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
13460 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
13470 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
13480 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
13490 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
134a0 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 20  _index;..    /* 
134b0 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70  Create the rootp
134c0 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65  age for the inde
134d0 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  x.    */.    sql
134e0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
134f0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
13500 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  0, iDb);.    sql
13510 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
13520 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c   OP_CreateIndex,
13530 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71   iDb, 0);.    sq
13540 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13550 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
13560 4d 65 6d 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  Mem, 0);..    /*
13570 20 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70   Gather the comp
13580 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
13590 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
135a0 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20  atement into.   
135b0 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61   ** the zStmt va
135c0 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20  riable.    */.  
135d0 20 20 69 66 28 20 70 53 74 61 72 74 20 26 26 20    if( pStart && 
135e0 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pEnd ){.      /*
135f0 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77   A named index w
13600 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20  ith an explicit 
13610 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
13620 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  tement */.      
13630 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
13640 50 72 69 6e 74 66 28 22 43 52 45 41 54 45 25 73  Printf("CREATE%s
13650 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20   INDEX %.*s",.  
13660 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f        onError==O
13670 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20  E_None ? "" : " 
13680 55 4e 49 51 55 45 22 2c 0a 20 20 20 20 20 20 20  UNIQUE",.       
13690 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d   Addr(pEnd->z) -
136a0 20 41 64 64 72 28 70 4e 61 6d 65 2d 3e 7a 29 20   Addr(pName->z) 
136b0 2b 20 31 2c 0a 20 20 20 20 20 20 20 20 70 4e 61  + 1,.        pNa
136c0 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  me->z);.    }els
136d0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61  e{.      /* An a
136e0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63  utomatic index c
136f0 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d  reated by a PRIM
13700 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
13710 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  E constraint */.
13720 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d        /* zStmt =
13730 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
13740 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53  ""); */.      zS
13750 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  tmt = 0;.    }..
13760 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e      /* Add an en
13770 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61  try in sqlite_ma
13780 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e  ster for this in
13790 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  dex.    */.    s
137a0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
137b0 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
137c0 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
137d0 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e  %Q.%s VALUES('in
137e0 64 65 78 27 2c 25 51 2c 25 51 2c 23 30 2c 25 51  dex',%Q,%Q,#0,%Q
137f0 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d  );",.        db-
13800 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
13810 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
13820 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64  b),.        pInd
13830 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ex->zName,.     
13840 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a     pTab->zName,.
13850 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20          zStmt.  
13860 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
13870 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13880 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
13890 73 71 6c 69 74 65 46 72 65 65 28 7a 53 74 6d 74  sqliteFree(zStmt
138a0 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20  );..    /* Fill 
138b0 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64  the index with d
138c0 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20  ata and reparse 
138d0 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65  the schema. Code
138e0 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20   an OP_Expire.  
138f0 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61    ** to invalida
13900 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69  te all pre-compi
13910 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
13920 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
13930 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  TblName ){.     
13940 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
13950 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
13960 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20  ex, iMem);.     
13970 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
13980 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29  okie(db, v, iDb)
13990 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
139a0 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72  dbeOp3(v, OP_Par
139b0 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30  seSchema, iDb, 0
139c0 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ,.         sqlit
139d0 65 33 4d 50 72 69 6e 74 66 28 22 6e 61 6d 65 3d  e3MPrintf("name=
139e0 27 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a  '%q'", pIndex->z
139f0 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49  Name), P3_DYNAMI
13a00 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
13a10 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
13a20 5f 45 78 70 69 72 65 2c 20 30 2c 20 30 29 3b 0a  _Expire, 0, 0);.
13a30 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
13a40 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69  When adding an i
13a50 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74  ndex to the list
13a60 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20   of indices for 
13a70 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20  a table, make.  
13a80 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69  ** sure all indi
13a90 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52  ces labeled OE_R
13aa0 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65  eplace come afte
13ab0 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65  r all those labe
13ac0 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f  led.  ** OE_Igno
13ad0 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  re.  This is nec
13ae0 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63  essary for the c
13af0 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
13b00 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20   of UPDATE.  ** 
13b10 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f  and INSERT..  */
13b20 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
13b30 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65  busy || pTblName
13b40 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ==0 ){.    if( o
13b50 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
13b60 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64  ce || pTab->pInd
13b70 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c  ex==0.         |
13b80 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e  | pTab->pIndex->
13b90 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c  onError==OE_Repl
13ba0 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  ace){.      pInd
13bb0 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62  ex->pNext = pTab
13bc0 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
13bd0 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70  pTab->pIndex = p
13be0 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65  Index;.    }else
13bf0 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
13c00 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49  Other = pTab->pI
13c10 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c  ndex;.      whil
13c20 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  e( pOther->pNext
13c30 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78   && pOther->pNex
13c40 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  t->onError!=OE_R
13c50 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eplace ){.      
13c60 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65    pOther = pOthe
13c70 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
13c80 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  }.      pIndex->
13c90 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e  pNext = pOther->
13ca0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74  pNext;.      pOt
13cb0 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  her->pNext = pIn
13cc0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
13cd0 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Index = 0;.  }..
13ce0 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65    /* Clean up be
13cf0 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a  fore exiting */.
13d00 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13d10 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  x:.  if( pIndex 
13d20 29 7b 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78  ){.    freeIndex
13d30 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20  (pIndex);.  }.  
13d40 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
13d50 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
13d60 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
13d70 6c 65 74 65 28 70 54 62 6c 4e 61 6d 65 29 3b 0a  lete(pTblName);.
13d80 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
13d90 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  me);.  return;.}
13da0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
13db0 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61  tine will drop a
13dc0 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64  n existing named
13dd0 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f   index.  This ro
13de0 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  utine.** impleme
13df0 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44  nts the DROP IND
13e00 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  EX statement..*/
13e10 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
13e20 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  pIndex(Parse *pP
13e30 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
13e40 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  Name){.  Index *
13e50 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a  pIndex;.  Vdbe *
13e60 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
13e70 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
13e80 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
13e90 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
13ea0 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
13eb0 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
13ec0 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
13ed0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
13ee0 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
13ef0 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 72  hema(pParse) ) r
13f00 65 74 75 72 6e 3b 0a 20 20 70 49 6e 64 65 78 20  eturn;.  pIndex 
13f10 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
13f20 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b  ex(db, pName->a[
13f30 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  0].zName, pName-
13f40 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
13f50 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d  ;.  if( pIndex==
13f60 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
13f70 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13f80 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
13f90 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b   %S", pName, 0);
13fa0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65  .    pParse->che
13fb0 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
13fc0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
13fd0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
13fe0 28 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e  ( pIndex->autoIn
13ff0 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dex ){.    sqlit
14000 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
14010 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69  e, "index associ
14020 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45  ated with UNIQUE
14030 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49   ".      "or PRI
14040 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
14050 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72  int cannot be dr
14060 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  opped", 0);.    
14070 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
14080 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  ndex;.  }.#ifnde
14090 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
140a0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
140b0 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53      int code = S
140c0 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58  QLITE_DROP_INDEX
140d0 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
140e0 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  b = pIndex->pTab
140f0 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le;.    const ch
14100 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
14110 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a  b[pIndex->iDb].z
14120 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Name;.    const 
14130 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48  char *zTab = SCH
14140 45 4d 41 5f 54 41 42 4c 45 28 70 49 6e 64 65 78  EMA_TABLE(pIndex
14150 2d 3e 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20  ->iDb);.    if( 
14160 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
14170 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
14180 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c  DELETE, zTab, 0,
14190 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
141a0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
141b0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
141c0 66 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 29  f( pIndex->iDb )
141d0 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
141e0 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ROP_TEMP_INDEX;.
141f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
14200 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
14210 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a   code, pIndex->z
14220 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
14230 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
14240 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
14250 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
14260 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
14270 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
14280 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
14290 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  and from the mas
142a0 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76  ter table */.  v
142b0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
142c0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
142d0 20 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44   v ){.    int iD
142e0 62 20 3d 20 70 49 6e 64 65 78 2d 3e 69 44 62 3b  b = pIndex->iDb;
142f0 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
14300 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
14310 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
14320 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
14330 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20  name=%Q",.      
14340 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
14350 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
14360 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 70  E(iDb),.       p
14370 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20  Index->zName.   
14380 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   );.    sqlite3C
14390 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20  hangeCookie(db, 
143a0 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73  v, iDb);.    des
143b0 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
143c0 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75  rse, pIndex->tnu
143d0 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  m, iDb);.    sql
143e0 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
143f0 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62  P_DropIndex, iDb
14400 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  , 0, pIndex->zNa
14410 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69  me, 0);.  }..exi
14420 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20  t_drop_index:.  
14430 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
14440 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  lete(pName);.}..
14450 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
14460 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
14470 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20  e given IdList. 
14480 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64   Create a new Id
14490 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
144a0 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  be..**.** A new 
144b0 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  IdList is return
144c0 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
144d0 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
144e0 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  /.IdList *sqlite
144f0 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 49 64  3IdListAppend(Id
14500 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
14510 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69  en *pToken){.  i
14520 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
14530 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
14540 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
14550 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  IdList) );.    i
14560 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
14570 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73  turn 0;.    pLis
14580 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20  t->nAlloc = 0;. 
14590 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e   }.  if( pList->
145a0 6e 49 64 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c  nId>=pList->nAll
145b0 6f 63 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  oc ){.    struct
145c0 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b   IdList_item *a;
145d0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
145e0 6f 63 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  oc = pList->nAll
145f0 6f 63 2a 32 20 2b 20 35 3b 0a 20 20 20 20 61 20  oc*2 + 5;.    a 
14600 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
14610 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d  pList->a, pList-
14620 3e 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70  >nAlloc*sizeof(p
14630 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  List->a[0]) );. 
14640 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20     if( a==0 ){. 
14650 20 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69       sqlite3IdLi
14660 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
14670 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
14680 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
14690 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d  ->a = a;.  }.  m
146a0 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b  emset(&pList->a[
146b0 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20  pList->nId], 0, 
146c0 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
146d0 30 5d 29 29 3b 0a 20 20 70 4c 69 73 74 2d 3e 61  0]));.  pList->a
146e0 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61  [pList->nId].zNa
146f0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
14700 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e  FromToken(pToken
14710 29 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b  );.  pList->nId+
14720 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  +;.  return pLis
14730 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  t;.}../*.** Appe
14740 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e  nd a new table n
14750 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ame to the given
14760 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74   SrcList.  Creat
14770 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  e a new SrcList 
14780 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20  if.** need be.  
14790 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63  A new entry is c
147a0 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72  reated in the Sr
147b0 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54  cList even if pT
147c0 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  oken is NULL..**
147d0 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73  .** A new SrcLis
147e0 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
147f0 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
14800 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20  () fails..**.** 
14810 49 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20  If pDatabase is 
14820 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61  not null, it mea
14830 6e 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  ns that the tabl
14840 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61  e has an optiona
14850 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61  l.** database na
14860 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65  me prefix.  Like
14870 20 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73   this:  "databas
14880 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70  e.table".  The p
14890 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e  Database.** poin
148a0 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ts to the table 
148b0 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61  name and the pTa
148c0 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ble points to th
148d0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
148e0 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e  .** The SrcList.
148f0 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20  a[].zName field 
14900 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
14910 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68  he table name wh
14920 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d  ich might.** com
14930 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69  e from pTable (i
14940 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e  f pDatabase is N
14950 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61  ULL) or from pDa
14960 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63  tabase.  .** Src
14970 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61  List.a[].zDataba
14980 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  se is filled wit
14990 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  h the database n
149a0 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c  ame from pTable,
149b0 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c  .** or with NULL
149c0 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20   if no database 
149d0 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  is specified..**
149e0 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
149f0 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65  ds, if call like
14a00 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
14a10 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
14a20 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 30 29  istAppend(A,B,0)
14a30 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69  ;.**.** Then B i
14a40 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  s a table name a
14a50 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
14a60 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66  name is unspecif
14a70 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a  ied.  If called.
14a80 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ** like this:.**
14a90 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
14aa0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
14ab0 28 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54  (A,B,C);.**.** T
14ac0 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62  hen C is the tab
14ad0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73  le name and B is
14ae0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
14af0 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a  me..*/.SrcList *
14b00 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
14b10 70 65 6e 64 28 53 72 63 4c 69 73 74 20 2a 70 4c  pend(SrcList *pL
14b20 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62  ist, Token *pTab
14b30 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61  le, Token *pData
14b40 62 61 73 65 29 7b 0a 20 20 73 74 72 75 63 74 20  base){.  struct 
14b50 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
14b60 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  tem;.  if( pList
14b70 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
14b80 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
14b90 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29   sizeof(SrcList)
14ba0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
14bb0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
14bc0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
14bd0 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  oc = 1;.  }.  if
14be0 28 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70  ( pList->nSrc>=p
14bf0 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  List->nAlloc ){.
14c00 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65      SrcList *pNe
14c10 77 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  w;.    pList->nA
14c20 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70  lloc *= 2;.    p
14c30 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
14c40 6c 6f 63 28 70 4c 69 73 74 2c 0a 20 20 20 20 20  loc(pList,.     
14c50 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
14c60 28 2a 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73  (*pList) + (pLis
14c70 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a  t->nAlloc-1)*siz
14c80 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
14c90 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77   );.    if( pNew
14ca0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
14cb0 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
14cc0 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
14cd0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
14ce0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77      pList = pNew
14cf0 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20  ;.  }.  pItem = 
14d00 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
14d10 3e 6e 53 72 63 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nSrc];.  memset
14d20 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f  (pItem, 0, sizeo
14d30 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
14d40 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
14d50 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a   && pDatabase->z
14d60 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61  ==0 ){.    pData
14d70 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  base = 0;.  }.  
14d80 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26  if( pDatabase &&
14d90 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54   pTable ){.    T
14da0 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44  oken *pTemp = pD
14db0 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61  atabase;.    pDa
14dc0 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b  tabase = pTable;
14dd0 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54  .    pTable = pT
14de0 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  emp;.  }.  pItem
14df0 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
14e00 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
14e10 54 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d  Table);.  pItem-
14e20 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c  >zDatabase = sql
14e30 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
14e40 6e 28 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  n(pDatabase);.  
14e50 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  pItem->iCursor =
14e60 20 2d 31 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 53   -1;.  pList->nS
14e70 72 63 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70  rc++;.  return p
14e80 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  List;.}../*.** A
14e90 73 73 69 67 6e 20 63 75 72 73 6f 72 73 20 74 6f  ssign cursors to
14ea0 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61   all tables in a
14eb0 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64   SrcList.*/.void
14ec0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
14ed0 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72  ssignCursors(Par
14ee0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
14ef0 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
14f00 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53  nt i;.  struct S
14f10 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
14f20 65 6d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  em;.  for(i=0, p
14f30 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
14f40 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
14f50 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
14f60 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72   if( pItem->iCur
14f70 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a  sor>=0 ) break;.
14f80 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73      pItem->iCurs
14f90 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
14fa0 62 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 49 74  b++;.    if( pIt
14fb0 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
14fc0 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
14fd0 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
14fe0 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
14ff0 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a  pSelect->pSrc);.
15000 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
15010 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20  ** Add an alias 
15020 74 6f 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e  to the last iden
15030 74 69 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69  tifier on the gi
15040 76 65 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c  ven identifier l
15050 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
15060 69 74 65 33 53 72 63 4c 69 73 74 41 64 64 41 6c  ite3SrcListAddAl
15070 69 61 73 28 53 72 63 4c 69 73 74 20 2a 70 4c 69  ias(SrcList *pLi
15080 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
15090 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20  n){.  if( pList 
150a0 26 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30  && pList->nSrc>0
150b0 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61   ){.    pList->a
150c0 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 2e  [pList->nSrc-1].
150d0 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33  zAlias = sqlite3
150e0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
150f0 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  oken);.  }.}../*
15100 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64  .** Delete an Id
15110 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  List..*/.void sq
15120 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
15130 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29  e(IdList *pList)
15140 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
15150 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
15160 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
15170 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
15180 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
15190 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  e(pList->a[i].zN
151a0 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ame);.  }.  sqli
151b0 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29  teFree(pList->a)
151c0 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
151d0 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
151e0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
151f0 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65   in pList of the
15200 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65   identifier name
15210 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d  d zId.  Return -
15220 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e  1.** if not foun
15230 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
15240 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c  3IdListIndex(IdL
15250 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73  ist *pList, cons
15260 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
15270 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
15280 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
15290 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   -1;.  for(i=0; 
152a0 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
152b0 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
152c0 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
152d0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e  ->a[i].zName, zN
152e0 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
152f0 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
15300 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   -1;.}../*.** De
15310 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53  lete an entire S
15320 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67  rcList including
15330 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75   all its substru
15340 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cture..*/.void s
15350 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
15360 65 74 65 28 53 72 63 4c 69 73 74 20 2a 70 4c 69  ete(SrcList *pLi
15370 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
15380 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
15390 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66  tem *pItem;.  if
153a0 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
153b0 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  urn;.  for(pItem
153c0 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
153d0 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  i<pList->nSrc; i
153e0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
153f0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 74    sqliteFree(pIt
15400 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
15410 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
15420 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
15430 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 74    sqliteFree(pIt
15440 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
15450 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62   if( pItem->pTab
15460 20 26 26 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d   && pItem->pTab-
15470 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a  >isTransient ){.
15480 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
15490 65 74 65 54 61 62 6c 65 28 30 2c 20 70 49 74 65  eteTable(0, pIte
154a0 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  m->pTab);.    }.
154b0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
154c0 74 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70  tDelete(pItem->p
154d0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c  Select);.    sql
154e0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
154f0 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20  Item->pOn);.    
15500 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
15510 65 74 65 28 70 49 74 65 6d 2d 3e 70 55 73 69 6e  ete(pItem->pUsin
15520 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
15530 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
15540 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72  /*.** Begin a tr
15550 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
15560 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72  d sqlite3BeginTr
15570 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
15580 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70  *pParse, int typ
15590 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
155a0 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
155b0 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 70 50  int i;..  if( pP
155c0 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
155d0 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
155e0 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
155f0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
15600 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
15610 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
15620 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
15630 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( sqlite3
15640 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
15650 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
15660 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30  TION, "BEGIN", 0
15670 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  , 0) ) return;..
15680 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
15690 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
156a0 69 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b  if( !v ) return;
156b0 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f  .  if( type!=TK_
156c0 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20  DEFERRED ){.    
156d0 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
156e0 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
156f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15700 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
15710 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b  on, i, (type==TK
15720 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a  _EXCLUSIVE)+1);.
15730 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
15740 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
15750 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30  OP_AutoCommit, 0
15760 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  , 0);.}../*.** C
15770 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74  ommit a transact
15780 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
15790 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63  te3CommitTransac
157a0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
157b0 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se){.  sqlite3 *
157c0 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  db;.  Vdbe *v;..
157d0 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
157e0 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
157f0 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62  b)==0 || db->aDb
15800 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74  [0].pBt==0 ) ret
15810 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
15820 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
15830 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
15840 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
15850 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
15860 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
15870 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43  _TRANSACTION, "C
15880 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 20  OMMIT", 0, 0) ) 
15890 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73  return;..  v = s
158a0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
158b0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
158c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
158d0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74  eAddOp(v, OP_Aut
158e0 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a  oCommit, 1, 0);.
158f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c    }.}../*.** Rol
15900 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74  lback a transact
15910 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
15920 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73  te3RollbackTrans
15930 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
15940 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
15950 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
15960 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
15970 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
15980 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  >db)==0 || db->a
15990 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
159a0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
159b0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
159c0 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
159d0 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
159e0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
159f0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
15a00 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
15a10 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30  "ROLLBACK", 0, 0
15a20 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76  ) ) return;..  v
15a30 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
15a40 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
15a50 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
15a60 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15a70 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20  _AutoCommit, 1, 
15a80 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
15a90 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54   Make sure the T
15aa0 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20  EMP database is 
15ab0 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62  open and availab
15ac0 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74  le for use.  Ret
15ad0 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
15ae0 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65  r of errors.  Le
15af0 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ave any error me
15b00 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50  ssages in the pP
15b10 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
15b20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
15b30 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74  lite3OpenTempDat
15b40 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50 61  abase(Parse *pPa
15b50 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  rse){.  sqlite3 
15b60 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
15b70 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  ;.  if( db->aDb[
15b80 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50  1].pBt==0 && !pP
15b90 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
15ba0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
15bb0 6c 69 74 65 33 42 74 72 65 65 46 61 63 74 6f 72  lite3BtreeFactor
15bc0 79 28 64 62 2c 20 30 2c 20 30 2c 20 4d 41 58 5f  y(db, 0, 0, MAX_
15bd0 50 41 47 45 53 2c 20 26 64 62 2d 3e 61 44 62 5b  PAGES, &db->aDb[
15be0 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28  1].pBt);.    if(
15bf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15c00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
15c10 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
15c20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
15c30 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  a temporary data
15c40 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22  base ".        "
15c50 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67  file for storing
15c60 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15c70 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  s");.      pPars
15c80 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  e->rc = rc;.    
15c90 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
15ca0 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c  }.    if( db->fl
15cb0 61 67 73 20 26 20 21 64 62 2d 3e 61 75 74 6f 43  ags & !db->autoC
15cc0 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 72  ommit ){.      r
15cd0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
15ce0 42 65 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e 61  BeginTrans(db->a
15cf0 44 62 5b 31 5d 2e 70 42 74 2c 20 31 29 3b 0a 20  Db[1].pBt, 1);. 
15d00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
15d10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15d20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15d30 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
15d40 65 20 74 6f 20 67 65 74 20 61 20 77 72 69 74 65  e to get a write
15d50 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20   lock on ".     
15d60 20 20 20 20 20 22 74 68 65 20 74 65 6d 70 6f 72       "the tempor
15d70 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  ary database fil
15d80 65 22 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  e");.        pPa
15d90 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
15da0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
15db0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15dc0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
15dd0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
15de0 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 77  VDBE code that w
15df0 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20 73  ill verify the s
15e00 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64  chema cookie and
15e10 20 73 74 61 72 74 0a 2a 2a 20 61 20 72 65 61 64   start.** a read
15e20 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
15e30 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61 62   all named datab
15e40 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ase files..**.**
15e50 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   It is important
15e60 20 74 68 61 74 20 61 6c 6c 20 73 63 68 65 6d 61   that all schema
15e70 20 63 6f 6f 6b 69 65 73 20 62 65 20 76 65 72 69   cookies be veri
15e80 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20  fied and all.** 
15e90 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
15ea0 73 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66  s be started bef
15eb0 6f 72 65 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ore anything els
15ec0 65 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20  e happens in.** 
15ed0 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
15ee0 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74  .  But this rout
15ef0 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  ine can be calle
15f00 64 20 61 66 74 65 72 20 6d 75 63 68 20 6f 74 68  d after much oth
15f10 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20 62  er.** code has b
15f20 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20 20  een generated.  
15f30 53 6f 20 68 65 72 65 20 69 73 20 77 68 61 74 20  So here is what 
15f40 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  we do:.**.** The
15f50 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73   first time this
15f60 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
15f70 65 64 2c 20 77 65 20 63 6f 64 65 20 61 6e 20 4f  ed, we code an O
15f80 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77  P_Goto that.** w
15f90 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73 75  ill jump to a su
15fa0 62 72 6f 75 74 69 6e 65 20 61 74 20 74 68 65 20  broutine at the 
15fb0 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67 72  end of the progr
15fc0 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20  am.  Then we.** 
15fd0 72 65 63 6f 72 64 20 65 76 65 72 79 20 64 61 74  record every dat
15fe0 61 62 61 73 65 20 74 68 61 74 20 6e 65 65 64 73  abase that needs
15ff0 20 69 74 73 20 73 63 68 65 6d 61 20 76 65 72 69   its schema veri
16000 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70  fied in the.** p
16010 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73  Parse->cookieMas
16020 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c  k field.  Later,
16030 20 61 66 74 65 72 20 61 6c 6c 20 6f 74 68 65 72   after all other
16040 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 0a 2a   code has been.*
16050 2a 20 67 65 6e 65 72 61 74 65 64 2c 20 74 68 65  * generated, the
16060 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
16070 20 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69 65   does the cookie
16080 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20 61   verifications a
16090 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20 74 68 65  nd.** starts the
160a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 77 69   transactions wi
160b0 6c 6c 20 62 65 20 63 6f 64 65 64 20 61 6e 64 20  ll be coded and 
160c0 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76  the OP_Goto P2 v
160d0 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  alue.** will be 
160e0 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f  made to point to
160f0 20 74 68 61 74 20 73 75 62 72 6f 75 74 69 6e 65   that subroutine
16100 2e 20 20 54 68 65 20 67 65 6e 65 72 61 74 69 6f  .  The generatio
16110 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b  n of the.** cook
16120 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20  ie verification 
16130 73 75 62 72 6f 75 74 69 6e 65 20 63 6f 64 65 20  subroutine code 
16140 68 61 70 70 65 6e 73 20 69 6e 20 73 71 6c 69 74  happens in sqlit
16150 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29  e3FinishCoding()
16160 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30  ..**.** If iDb<0
16170 20 74 68 65 6e 20 63 6f 64 65 20 74 68 65 20 4f   then code the O
16180 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f  P_Goto only - do
16190 6e 27 74 20 73 65 74 20 66 6c 61 67 20 74 6f 20  n't set flag to 
161a0 76 65 72 69 66 79 20 74 68 65 0a 2a 2a 20 73 63  verify the.** sc
161b0 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74 61  hema on any data
161c0 62 61 73 65 73 2e 20 20 54 68 69 73 20 63 61 6e  bases.  This can
161d0 20 62 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69   be used to posi
161e0 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f  tion the OP_Goto
161f0 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74 68 65  .** early in the
16200 20 63 6f 64 65 2c 20 62 65 66 6f 72 65 20 77 65   code, before we
16210 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64 61 74   know if any dat
16220 61 62 61 73 65 20 74 61 62 6c 65 73 20 77 69 6c  abase tables wil
16230 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f  l be used..*/.vo
16240 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  id sqlite3CodeVe
16250 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65  rifySchema(Parse
16260 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44   *pParse, int iD
16270 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  b){.  sqlite3 *d
16280 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
16290 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d  int mask;..  v =
162a0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
162b0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
162c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  ==0 ) return;  /
162d0 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70  * This only happ
162e0 65 6e 73 20 69 66 20 74 68 65 72 65 20 77 61 73  ens if there was
162f0 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 2a   a prior error *
16300 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
16310 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73  >db;.  if( pPars
16320 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30  e->cookieGoto==0
16330 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
16340 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c  cookieGoto = sql
16350 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
16360 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 2b   OP_Goto, 0, 0)+
16370 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62  1;.  }.  if( iDb
16380 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  >=0 ){.    asser
16390 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  t( iDb<db->nDb )
163a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
163b0 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d  ->aDb[iDb].pBt!=
163c0 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20  0 || iDb==1 );. 
163d0 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 33     assert( iDb<3
163e0 32 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d 20  2 );.    mask = 
163f0 31 3c 3c 69 44 62 3b 0a 20 20 20 20 69 66 28 20  1<<iDb;.    if( 
16400 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d  (pParse->cookieM
16410 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
16420 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
16430 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61  cookieMask |= ma
16440 73 6b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  sk;.      pParse
16450 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44  ->cookieValue[iD
16460 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  b] = db->aDb[iDb
16470 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b  ].schema_cookie;
16480 0a 20 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d  .      if( iDb==
16490 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
164a0 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61  ite3OpenTempData
164b0 62 61 73 65 28 70 50 61 72 73 65 29 3b 0a 20 20  base(pParse);.  
164c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
164d0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
164e0 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
164f0 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f   prepares for do
16500 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  ing an operation
16510 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63   that.** might c
16520 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61  hange the databa
16530 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
16540 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20  outine starts a 
16550 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
16560 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c  if we are not al
16570 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20  ready within.** 
16580 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  a transaction.  
16590 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  If we are alread
165a0 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  y within a trans
165b0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63  action, then a c
165c0 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20  heckpoint.** is 
165d0 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74  set if the setSt
165e0 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65  atement paramete
165f0 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68  r is true.  A ch
16600 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a  eckpoint should.
16610 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70  ** be set for op
16620 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69  erations that mi
16630 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f  ght fail (due to
16640 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70   a constraint) p
16650 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61  art of.** the wa
16660 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68  y through and wh
16670 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  ich will need to
16680 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65   undo some write
16690 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  s without having
166a0 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20   to.** rollback 
166b0 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61  the whole transa
166c0 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72  ction.  For oper
166d0 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c  ations where all
166e0 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
166f0 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62  can be checked b
16700 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
16710 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  s are made to th
16720 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69  e database, it i
16730 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73  s never.** neces
16740 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77  sary to undo a w
16750 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65  rite and the che
16760 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e  ckpoint should n
16770 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  ot be set..**.**
16780 20 4f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 69   Only database i
16790 44 62 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20  Db and the temp 
167a0 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 64  database are mad
167b0 65 20 77 72 69 74 61 62 6c 65 20 62 79 20 74 68  e writable by th
167c0 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69  is call..** If i
167d0 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  Db==0, then the 
167e0 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70 20 64 61  main and temp da
167f0 74 61 62 61 73 65 73 20 61 72 65 20 6d 61 64 65  tabases are made
16800 20 77 72 69 74 61 62 6c 65 2e 20 20 20 49 66 0a   writable.   If.
16810 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e 20 6f  ** iDb==1 then o
16820 6e 6c 79 20 74 68 65 20 74 65 6d 70 20 64 61 74  nly the temp dat
16830 61 62 61 73 65 20 69 73 20 6d 61 64 65 20 77 72  abase is made wr
16840 69 74 61 62 6c 65 2e 20 20 49 66 20 69 44 62 3e  itable.  If iDb>
16850 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73 70  1 then the.** sp
16860 65 63 69 66 69 65 64 20 61 75 78 69 6c 69 61 72  ecified auxiliar
16870 79 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  y database and t
16880 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
16890 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62   are made writab
168a0 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
168b0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
168c0 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  ration(Parse *pP
168d0 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61  arse, int setSta
168e0 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29  tement, int iDb)
168f0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
16900 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
16910 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
16920 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
16930 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
16940 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
16950 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 77 72 69  );.  pParse->wri
16960 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44 62  teMask |= 1<<iDb
16970 3b 0a 20 20 69 66 28 20 73 65 74 53 74 61 74 65  ;.  if( setState
16980 6d 65 6e 74 20 26 26 20 70 50 61 72 73 65 2d 3e  ment && pParse->
16990 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  nested==0 ){.   
169a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
169b0 70 28 76 2c 20 4f 50 5f 53 74 61 74 65 6d 65 6e  p(v, OP_Statemen
169c0 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 7d 0a  t, iDb, 0);.  }.
169d0 20 20 69 66 28 20 69 44 62 21 3d 31 20 26 26 20    if( iDb!=1 && 
169e0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
169f0 31 5d 2e 70 42 74 21 3d 30 20 29 7b 0a 20 20 20  1].pBt!=0 ){.   
16a00 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
16a10 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
16a20 73 65 2c 20 73 65 74 53 74 61 74 65 6d 65 6e 74  se, setStatement
16a30 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  , 1);.  }.}..#if
16a40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16a50 5f 55 54 46 31 36 0a 2f 2a 20 0a 2a 2a 20 52 65  _UTF16./* .** Re
16a60 74 75 72 6e 20 74 68 65 20 74 72 61 6e 73 69 65  turn the transie
16a70 6e 74 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt sqlite3_value
16a80 20 6f 62 6a 65 63 74 20 75 73 65 64 20 66 6f 72   object used for
16a90 20 65 6e 63 6f 64 69 6e 67 20 63 6f 6e 76 65 72   encoding conver
16aa0 73 69 6f 6e 73 0a 2a 2a 20 64 75 72 69 6e 67 20  sions.** during 
16ab0 53 51 4c 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2e  SQL compilation.
16ac0 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75  .*/.sqlite3_valu
16ad0 65 20 2a 73 71 6c 69 74 65 33 47 65 74 54 72 61  e *sqlite3GetTra
16ae0 6e 73 69 65 6e 74 56 61 6c 75 65 28 73 71 6c 69  nsientValue(sqli
16af0 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20  te3 *db){.  if( 
16b00 21 64 62 2d 3e 70 56 61 6c 75 65 20 29 7b 0a 20  !db->pValue ){. 
16b10 20 20 20 64 62 2d 3e 70 56 61 6c 75 65 20 3d 20     db->pValue = 
16b20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
16b30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
16b40 64 62 2d 3e 70 56 61 6c 75 65 3b 0a 7d 0a 23 65  db->pValue;.}.#e
16b50 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ndif../*.** Chec
16b60 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64  k to see if pInd
16b70 65 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c  ex uses the coll
16b80 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
16b90 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  Coll.  Return.**
16ba0 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
16bb0 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74   and false if it
16bc0 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69   does not..*/.#i
16bd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16be0 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
16bf0 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61   int collationMa
16c00 74 63 68 28 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  tch(CollSeq *pCo
16c10 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ll, Index *pInde
16c20 78 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49  x){.  int n = pI
16c30 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46  ndex->keyInfo.nF
16c40 69 65 6c 64 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  ield;.  CollSeq 
16c50 2a 2a 70 70 20 3d 20 70 49 6e 64 65 78 2d 3e 6b  **pp = pIndex->k
16c60 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 3b 0a 20 20  eyInfo.aColl;.  
16c70 77 68 69 6c 65 28 20 6e 2d 2d 20 29 7b 0a 20 20  while( n-- ){.  
16c80 20 20 69 66 28 20 2a 70 70 3d 3d 70 43 6f 6c 6c    if( *pp==pColl
16c90 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
16ca0 20 70 70 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74   pp++;.  }.  ret
16cb0 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
16cc0 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65  ./*.** Recompute
16cd0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
16ce0 70 54 61 62 20 74 68 61 74 20 75 73 65 20 74 68  pTab that use th
16cf0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
16d00 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49  ence pColl..** I
16d10 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20  f pColl==0 then 
16d20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  recompute all in
16d30 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a  dices of pTab..*
16d40 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
16d50 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f  _OMIT_REINDEX.vo
16d60 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28  id reindexTable(
16d70 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
16d80 61 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f 6c 6c  able *pTab, Coll
16d90 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 49  Seq *pColl){.  I
16da0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
16db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
16dc0 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
16dd0 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a  d with pTab */..
16de0 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61    for(pIndex=pTa
16df0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  b->pIndex; pInde
16e00 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78  x; pIndex=pIndex
16e10 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
16e20 28 20 70 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f  ( pColl==0 || co
16e30 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 70 43 6f  llationMatch(pCo
16e40 6c 6c 2c 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  ll,pIndex) ){.  
16e50 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
16e60 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
16e70 50 61 72 73 65 2c 20 30 2c 20 70 54 61 62 2d 3e  Parse, 0, pTab->
16e80 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
16e90 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
16ea0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
16eb0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
16ec0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
16ed0 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
16ee0 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ces of all table
16ef0 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
16f00 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20  es where the.** 
16f10 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20  indices use the 
16f20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
16f30 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43  ce pColl.  If pC
16f40 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
16f50 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64  mpute.** all ind
16f60 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e  ices everywhere.
16f70 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
16f80 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
16f90 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61  void reindexData
16fa0 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61  bases(Parse *pPa
16fb0 72 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43  rse, CollSeq *pC
16fc0 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b  oll){.  Db *pDb;
16fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fe0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
16ff0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
17000 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
17010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17020 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
17030 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69  number */.  sqli
17040 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
17050 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64  ->db;   /* The d
17060 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
17070 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d  on */.  HashElem
17080 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20   *k;            
17090 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
170a0 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69  ng over tables i
170b0 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65  n pDb */.  Table
170c0 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
170d0 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c         /* A tabl
170e0 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
170f0 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d  e */..  for(iDb=
17100 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20  0, pDb=db->aDb; 
17110 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62  iDb<db->nDb; iDb
17120 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20  ++, pDb++){.    
17130 69 66 28 20 70 44 62 3d 3d 30 20 29 20 63 6f 6e  if( pDb==0 ) con
17140 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72  tinue;.      for
17150 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (k=sqliteHashFir
17160 73 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68  st(&pDb->tblHash
17170 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48  );  k; k=sqliteH
17180 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20  ashNext(k)){.   
17190 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65     pTab = (Table
171a0 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
171b0 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64  (k);.      reind
171c0 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  exTable(pParse, 
171d0 70 54 61 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  pTab, pColl);.  
171e0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
171f0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
17200 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45   code for the RE
17210 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  INDEX command..*
17220 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  *.**        REIN
17230 44 45 58 20 20 20 20 20 20 20 20 20 20 20 20 20  DEX             
17240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
17250 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 1.**        RE
17260 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f  INDEX  <collatio
17270 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n>              
17280 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20   -- 2.**        
17290 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62  REINDEX  ?<datab
172a0 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65  ase>.?<tablename
172b0 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20  >  -- 3.**      
172c0 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74    REINDEX  ?<dat
172d0 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61  abase>.?<indexna
172e0 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20  me>  -- 4.**.** 
172f0 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c  Form 1 causes al
17300 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c  l indices in all
17310 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
17320 73 65 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c  ses to be rebuil
17330 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62  t..** Form 2 reb
17340 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65  uilds all indice
17350 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
17360 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  es that use the 
17370 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69  named.** collati
17380 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f  ng function.  Fo
17390 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62 75  rms 3 and 4 rebu
173a0 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  ild the named in
173b0 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e  dex or all.** in
173c0 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
173d0 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20   with the named 
173e0 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  table..*/.#ifnde
173f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
17400 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74  INDEX.void sqlit
17410 65 33 52 65 69 6e 64 65 78 28 50 61 72 73 65 20  e3Reindex(Parse 
17420 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
17430 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70  pName1, Token *p
17440 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65  Name2){.  CollSe
17450 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  q *pColl;       
17460 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
17470 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62  ng sequence to b
17480 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20  e reindexed, or 
17490 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a  NULL */.  char *
174a0 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
174b0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
174c0 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
174d0 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  x */.  const cha
174e0 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20  r *zDb;         
174f0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
17500 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
17510 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
17520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
17530 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
17540 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65  tabase */.  Inde
17550 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
17560 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
17570 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
17580 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e  ith pTab */.  in
17590 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
175a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
175b0 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
175c0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69  number */.  sqli
175d0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
175e0 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64  ->db;   /* The d
175f0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
17600 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  on */.  Token *p
17610 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  ObjName;        
17620 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
17630 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
17640 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  x to be reindexe
17650 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20  d */..  /* Read 
17660 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
17670 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ema. If an error
17680 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
17690 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
176a0 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e    ** and code in
176b0 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
176c0 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66  rn NULL. */.  if
176d0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
176e0 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
176f0 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
17700 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
17710 20 70 4e 61 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e   pName1==0 || pN
17720 61 6d 65 31 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  ame1->z==0 ){.  
17730 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73    reindexDatabas
17740 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20  es(pParse, 0);. 
17750 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c     return;.  }el
17760 73 65 20 69 66 28 20 70 4e 61 6d 65 32 3d 3d 30  se if( pName2==0
17770 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30   || pName2->z==0
17780 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   ){.    pColl = 
17790 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
177a0 65 71 28 64 62 2c 20 64 62 2d 3e 65 6e 63 2c 20  eq(db, db->enc, 
177b0 70 4e 61 6d 65 31 2d 3e 7a 2c 20 70 4e 61 6d 65  pName1->z, pName
177c0 31 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66  1->n, 0);.    if
177d0 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
177e0 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
177f0 73 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29  s(pParse, pColl)
17800 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
17810 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 44 62 20      }.  }.  iDb 
17820 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
17830 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
17840 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f  me1, pName2, &pO
17850 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69  bjName);.  if( i
17860 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db<0 ) return;. 
17870 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65   z = sqlite3Name
17880 46 72 6f 6d 54 6f 6b 65 6e 28 70 4f 62 6a 4e 61  FromToken(pObjNa
17890 6d 65 29 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d  me);.  zDb = db-
178a0 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
178b0 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
178c0 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
178d0 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54  , zDb);.  if( pT
178e0 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65  ab ){.    reinde
178f0 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
17900 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  Tab, 0);.    sql
17910 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20  iteFree(z);.    
17920 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49  return;.  }.  pI
17930 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
17940 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a  ndIndex(db, z, z
17950 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  Db);.  sqliteFre
17960 65 28 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  e(z);.  if( pInd
17970 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
17980 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
17990 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
179a0 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
179b0 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
179c0 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29  rse, pIndex, -1)
179d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
179e0 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  }.  sqlite3Error
179f0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
17a00 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20  ble to identify 
17a10 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65  the object to be
17a20 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a   reindexed");.}.
17a30 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
17a40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45  SQLITE_OMIT_ALTE
17a50 52 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 47 65 6e  RTABLE./*.** Gen
17a60 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 69 6d  erate code to im
17a70 70 6c 65 6d 65 6e 74 20 74 68 65 20 22 41 4c 54  plement the "ALT
17a80 45 52 20 54 41 42 4c 45 20 78 78 78 20 52 45 4e  ER TABLE xxx REN
17a90 41 4d 45 20 54 4f 20 79 79 79 22 20 0a 2a 2a 20  AME TO yyy" .** 
17aa0 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 76 6f 69  command. .*/.voi
17ab0 64 20 73 71 6c 69 74 65 33 41 6c 74 65 72 52 65  d sqlite3AlterRe
17ac0 6e 61 6d 65 54 61 62 6c 65 28 0a 20 20 50 61 72  nameTable(.  Par
17ad0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
17ae0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
17af0 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53   context. */.  S
17b00 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
17b10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17b20 74 61 62 6c 65 20 74 6f 20 72 65 6e 61 6d 65 2e  table to rename.
17b30 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
17b40 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
17b50 2f 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65  /* The new table
17b60 20 6e 61 6d 65 2e 20 2a 2f 0a 29 7b 0a 20 20 69   name. */.){.  i
17b70 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
17b80 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
17b90 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69  base that contai
17ba0 6e 73 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  ns the table */.
17bb0 20 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20    char *zDb;    
17bc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
17bd0 61 6d 65 20 6f 66 20 64 61 74 61 62 61 73 65 20  ame of database 
17be0 69 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  iDb */.  Table *
17bf0 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
17c00 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e     /* Table bein
17c10 67 20 72 65 6e 61 6d 65 64 20 2a 2f 0a 20 20 63  g renamed */.  c
17c20 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20  har *zName = 0; 
17c30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 55 4c 4c           /* NULL
17c40 2d 74 65 72 6d 69 6e 61 74 65 64 20 76 65 72 73  -terminated vers
17c50 69 6f 6e 20 6f 66 20 70 4e 61 6d 65 20 2a 2f 20  ion of pName */ 
17c60 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20  .  char *zWhere 
17c70 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
17c80 57 68 65 72 65 20 63 6c 61 75 73 65 20 6f 66 20  Where clause of 
17c90 73 63 68 65 6d 61 20 65 6c 65 6d 65 6e 74 73 20  schema elements 
17ca0 74 6f 20 72 65 70 61 72 73 65 20 2a 2f 0a 20 20  to reparse */.  
17cb0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
17cc0 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 44 61 74  arse->db; /* Dat
17cd0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
17ce0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 0a 23   */.  Vdbe *v;.#
17cf0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17d00 49 54 5f 54 52 49 47 47 45 52 0a 20 20 63 68 61  IT_TRIGGER.  cha
17d10 72 20 2a 7a 54 65 6d 70 54 72 69 67 20 3d 20 30  r *zTempTrig = 0
17d20 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20  ;      /* Where 
17d30 63 6c 61 75 73 65 20 74 6f 20 6c 6f 63 61 74 65  clause to locate
17d40 20 74 65 6d 70 20 74 72 69 67 67 65 72 73 20 2a   temp triggers *
17d50 2f 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 61 73  /.#endif.  .  as
17d60 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63  sert( pSrc->nSrc
17d70 3d 3d 31 20 29 3b 0a 0a 20 20 70 54 61 62 20 3d  ==1 );..  pTab =
17d80 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
17d90 62 6c 65 28 70 50 61 72 73 65 2c 20 70 53 72 63  ble(pParse, pSrc
17da0 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 53  ->a[0].zName, pS
17db0 72 63 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  rc->a[0].zDataba
17dc0 73 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62  se);.  if( !pTab
17dd0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 61 6c 74   ) goto exit_alt
17de0 65 72 5f 74 61 62 6c 65 3b 0a 20 20 69 44 62 20  er_table;.  iDb 
17df0 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 7a  = pTab->iDb;.  z
17e00 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
17e10 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 47  ].zName;..  /* G
17e20 65 74 20 61 20 4e 55 4c 4c 20 74 65 72 6d 69 6e  et a NULL termin
17e30 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ated version of 
17e40 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  the new table na
17e50 6d 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d  me. */.  zName =
17e60 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
17e70 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20  Token(pName);.  
17e80 69 66 28 20 21 7a 4e 61 6d 65 20 29 20 67 6f 74  if( !zName ) got
17e90 6f 20 65 78 69 74 5f 61 6c 74 65 72 5f 74 61 62  o exit_alter_tab
17ea0 6c 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  le;..  /* Check 
17eb0 74 68 61 74 20 61 20 74 61 62 6c 65 20 6f 72 20  that a table or 
17ec0 69 6e 64 65 78 20 6e 61 6d 65 64 20 27 7a 4e 61  index named 'zNa
17ed0 6d 65 27 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72  me' does not alr
17ee0 65 61 64 79 20 65 78 69 73 74 0a 20 20 2a 2a 20  eady exist.  ** 
17ef0 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  in database iDb.
17f00 20 49 66 20 73 6f 2c 20 74 68 69 73 20 69 73 20   If so, this is 
17f10 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20  an error..  */. 
17f20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
17f30 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
17f40 20 7a 44 62 29 20 7c 7c 20 73 71 6c 69 74 65 33   zDb) || sqlite3
17f50 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
17f60 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ame, zDb) ){.   
17f70 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
17f80 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
17f90 20 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65    "there is alre
17fa0 61 64 79 20 61 6e 6f 74 68 65 72 20 74 61 62 6c  ady another tabl
17fb0 65 20 6f 72 20 69 6e 64 65 78 20 77 69 74 68 20  e or index with 
17fc0 74 68 69 73 20 6e 61 6d 65 3a 20 25 73 22 2c 20  this name: %s", 
17fd0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
17fe0 20 65 78 69 74 5f 61 6c 74 65 72 5f 74 61 62 6c   exit_alter_tabl
17ff0 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  e;.  }..  /* Mak
18000 65 20 73 75 72 65 20 69 74 20 69 73 20 6e 6f 74  e sure it is not
18010 20 61 20 73 79 73 74 65 6d 20 74 61 62 6c 65 20   a system table 
18020 62 65 69 6e 67 20 61 6c 74 65 72 65 64 2c 20 6f  being altered, o
18030 72 20 61 20 72 65 73 65 72 76 65 64 20 6e 61 6d  r a reserved nam
18040 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  e.  ** that the 
18050 74 61 62 6c 65 20 69 73 20 62 65 69 6e 67 20 72  table is being r
18060 65 6e 61 6d 65 64 20 74 6f 2e 0a 20 20 2a 2f 0a  enamed to..  */.
18070 20 20 69 66 28 20 73 74 72 6c 65 6e 28 70 54 61    if( strlen(pTa
18080 62 2d 3e 7a 4e 61 6d 65 29 3e 36 20 26 26 20 30  b->zName)>6 && 0
18090 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
180a0 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22  p(pTab->zName, "
180b0 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a  sqlite_", 7) ){.
180c0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
180d0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
180e0 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65  le %s may not be
180f0 20 61 6c 74 65 72 65 64 22 2c 20 70 54 61 62 2d   altered", pTab-
18100 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
18110 6f 20 65 78 69 74 5f 61 6c 74 65 72 5f 74 61 62  o exit_alter_tab
18120 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51  le;.  }.  if( SQ
18130 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
18140 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
18150 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29  pParse, zName) )
18160 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
18170 61 6c 74 65 72 5f 74 61 62 6c 65 3b 0a 20 20 7d  alter_table;.  }
18180 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
18190 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
181a0 49 4f 4e 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  ION.  /* Invoke 
181b0 74 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  the authorizatio
181c0 6e 20 63 61 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20  n callback. */. 
181d0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
181e0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
181f0 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45  LITE_ALTER_TABLE
18200 2c 20 7a 44 62 2c 20 70 54 61 62 2d 3e 7a 4e 61  , zDb, pTab->zNa
18210 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 67 6f  me, 0) ){.    go
18220 74 6f 20 65 78 69 74 5f 61 6c 74 65 72 5f 74 61  to exit_alter_ta
18230 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ble;.  }.#endif.
18240 0a 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 74 72  .  /* Begin a tr
18250 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 63 6f  ansaction and co
18260 64 65 20 74 68 65 20 56 65 72 69 66 79 43 6f 6f  de the VerifyCoo
18270 6b 69 65 20 66 6f 72 20 64 61 74 61 62 61 73 65  kie for database
18280 20 69 44 62 2e 20 0a 20 20 2a 2a 20 54 68 65 6e   iDb. .  ** Then
18290 20 6d 6f 64 69 66 79 20 74 68 65 20 73 63 68 65   modify the sche
182a0 6d 61 20 63 6f 6f 6b 69 65 20 28 73 69 6e 63 65  ma cookie (since
182b0 20 74 68 65 20 41 4c 54 45 52 20 54 41 42 4c 45   the ALTER TABLE
182c0 20 6d 6f 64 69 66 69 65 73 20 74 68 65 0a 20 20   modifies the.  
182d0 2a 2a 20 73 63 68 65 6d 61 29 2e 0a 20 20 2a 2f  ** schema)..  */
182e0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
182f0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
18300 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
18310 20 67 6f 74 6f 20 65 78 69 74 5f 61 6c 74 65 72   goto exit_alter
18320 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 73 71  _table;.  }.  sq
18330 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
18340 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
18350 20 30 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69   0, iDb);.  sqli
18360 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
18370 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 0a 20 20  db, v, iDb);..  
18380 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65 20 73 71  /* Modify the sq
18390 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
183a0 65 20 74 6f 20 75 73 65 20 74 68 65 20 6e 65 77  e to use the new
183b0 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 2a 2f 0a   table name. */.
183c0 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
183d0 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
183e0 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
183f0 20 53 45 54 20 22 0a 23 69 66 64 65 66 20 53 51   SET ".#ifdef SQ
18400 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
18410 52 0a 20 20 20 20 20 20 20 20 20 20 22 73 71 6c  R.          "sql
18420 20 3d 20 73 71 6c 69 74 65 5f 61 6c 74 65 72 5f   = sqlite_alter_
18430 74 61 62 6c 65 28 73 71 6c 2c 20 25 51 29 2c 20  table(sql, %Q), 
18440 22 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  ".#else.        
18450 20 20 22 73 71 6c 20 3d 20 43 41 53 45 20 22 0a    "sql = CASE ".
18460 20 20 20 20 20 20 20 20 20 20 20 20 22 57 48 45              "WHE
18470 4e 20 74 79 70 65 20 3d 20 27 74 72 69 67 67 65  N type = 'trigge
18480 72 27 20 54 48 45 4e 20 73 71 6c 69 74 65 5f 61  r' THEN sqlite_a
18490 6c 74 65 72 5f 74 72 69 67 67 65 72 28 73 71 6c  lter_trigger(sql
184a0 2c 20 25 51 29 22 0a 20 20 20 20 20 20 20 20 20  , %Q)".         
184b0 20 20 20 22 45 4c 53 45 20 73 71 6c 69 74 65 5f     "ELSE sqlite_
184c0 61 6c 74 65 72 5f 74 61 62 6c 65 28 73 71 6c 2c  alter_table(sql,
184d0 20 25 51 29 20 45 4e 44 2c 20 22 0a 23 65 6e 64   %Q) END, ".#end
184e0 69 66 0a 20 20 20 20 20 20 20 20 20 20 22 74 62  if.          "tb
184f0 6c 5f 6e 61 6d 65 20 3d 20 25 51 2c 20 22 0a 20  l_name = %Q, ". 
18500 20 20 20 20 20 20 20 20 20 22 6e 61 6d 65 20 3d           "name =
18510 20 43 41 53 45 20 22 0a 20 20 20 20 20 20 20 20   CASE ".        
18520 20 20 20 20 22 57 48 45 4e 20 74 79 70 65 3d 27      "WHEN type='
18530 74 61 62 6c 65 27 20 54 48 45 4e 20 25 51 20 22  table' THEN %Q "
18540 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 57 48  .            "WH
18550 45 4e 20 6e 61 6d 65 20 4c 49 4b 45 20 27 73 71  EN name LIKE 'sq
18560 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 25 25  lite_autoindex%%
18570 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65  ' AND type='inde
18580 78 27 20 54 48 45 4e 20 22 0a 20 20 20 20 20 20  x' THEN ".      
18590 20 20 20 20 20 20 20 20 22 27 73 71 6c 69 74 65          "'sqlite
185a0 5f 61 75 74 6f 69 6e 64 65 78 5f 27 20 7c 7c 20  _autoindex_' || 
185b0 25 51 20 7c 7c 20 73 75 62 73 74 72 28 6e 61 6d  %Q || substr(nam
185c0 65 2c 20 25 64 2b 31 38 2c 31 30 29 20 22 0a 20  e, %d+18,10) ". 
185d0 20 20 20 20 20 20 20 20 20 20 20 22 45 4c 53 45             "ELSE
185e0 20 6e 61 6d 65 20 45 4e 44 20 22 0a 20 20 20 20   name END ".    
185f0 20 20 22 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d    "WHERE tbl_nam
18600 65 3d 25 51 20 41 4e 44 20 22 0a 20 20 20 20 20  e=%Q AND ".     
18610 20 20 20 20 20 22 28 74 79 70 65 3d 27 74 61 62       "(type='tab
18620 6c 65 27 20 4f 52 20 74 79 70 65 3d 27 69 6e 64  le' OR type='ind
18630 65 78 27 20 4f 52 20 74 79 70 65 3d 27 74 72 69  ex' OR type='tri
18640 67 67 65 72 27 29 3b 22 2c 20 0a 20 20 20 20 20  gger');", .     
18650 20 7a 44 62 2c 20 53 43 48 45 4d 41 5f 54 41 42   zDb, SCHEMA_TAB
18660 4c 45 28 69 44 62 29 2c 20 7a 4e 61 6d 65 2c 20  LE(iDb), zName, 
18670 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 0a 23  zName, zName, .#
18680 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18690 49 54 5f 54 52 49 47 47 45 52 0a 7a 4e 61 6d 65  IT_TRIGGER.zName
186a0 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7a  ,.#endif.      z
186b0 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 54 61  Name, strlen(pTa
186c0 62 2d 3e 7a 4e 61 6d 65 29 2c 20 70 54 61 62 2d  b->zName), pTab-
186d0 3e 7a 4e 61 6d 65 0a 20 20 29 3b 0a 0a 23 69 66  >zName.  );..#if
186e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
186f0 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
18700 20 2f 2a 20 49 66 20 74 68 65 20 73 71 6c 69 74   /* If the sqlit
18710 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
18720 20 65 78 69 73 74 73 20 69 6e 20 74 68 69 73 20   exists in this 
18730 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 75  database, then u
18740 70 64 61 74 65 20 0a 20 20 2a 2a 20 69 74 20 77  pdate .  ** it w
18750 69 74 68 20 74 68 65 20 6e 65 77 20 74 61 62 6c  ith the new tabl
18760 65 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  e name..  */.  i
18770 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  f( sqlite3FindTa
18780 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ble(db, "sqlite_
18790 73 65 71 75 65 6e 63 65 22 2c 20 7a 44 62 29 20  sequence", zDb) 
187a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  ){.    sqlite3Ne
187b0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
187c0 2c 0a 20 20 20 20 20 20 20 20 22 55 50 44 41 54  ,.        "UPDAT
187d0 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75  E %Q.sqlite_sequ
187e0 65 6e 63 65 20 73 65 74 20 6e 61 6d 65 20 3d 20  ence set name = 
187f0 25 51 20 57 48 45 52 45 20 6e 61 6d 65 20 3d 20  %Q WHERE name = 
18800 25 51 22 2c 0a 20 20 20 20 20 20 20 20 7a 44 62  %Q",.        zDb
18810 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  , zName, pTab->z
18820 4e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Name);.  }.#endi
18830 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
18840 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
18850 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
18860 20 54 45 4d 50 20 74 72 69 67 67 65 72 73 20 6f   TEMP triggers o
18870 6e 20 74 68 69 73 20 74 61 62 6c 65 2c 20 6d 6f  n this table, mo
18880 64 69 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f  dify the sqlite_
18890 74 65 6d 70 5f 6d 61 73 74 65 72 0a 20 20 2a 2a  temp_master.  **
188a0 20 74 61 62 6c 65 2e 20 44 6f 6e 27 74 20 64 6f   table. Don't do
188b0 20 74 68 69 73 20 69 66 20 74 68 65 20 74 61 62   this if the tab
188c0 6c 65 20 62 65 69 6e 67 20 41 4c 54 45 52 65 64  le being ALTERed
188d0 20 69 73 20 69 74 73 65 6c 66 20 6c 6f 63 61 74   is itself locat
188e0 65 64 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 74  ed in.  ** the t
188f0 65 6d 70 20 64 61 74 61 62 61 73 65 2e 0a 20 20  emp database..  
18900 2a 2f 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20  */.  if( iDb!=1 
18910 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a  ){.    Trigger *
18920 70 54 72 69 67 3b 0a 20 20 20 20 63 68 61 72 20  pTrig;.    char 
18930 2a 74 6d 70 20 3d 20 30 3b 0a 20 20 20 20 66 6f  *tmp = 0;.    fo
18940 72 28 20 70 54 72 69 67 3d 70 54 61 62 2d 3e 70  r( pTrig=pTab->p
18950 54 72 69 67 67 65 72 3b 20 70 54 72 69 67 3b 20  Trigger; pTrig; 
18960 70 54 72 69 67 3d 70 54 72 69 67 2d 3e 70 4e 65  pTrig=pTrig->pNe
18970 78 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  xt ){.      if( 
18980 70 54 72 69 67 2d 3e 69 44 62 3d 3d 31 20 29 7b  pTrig->iDb==1 ){
18990 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 54  .        if( !zT
189a0 65 6d 70 54 72 69 67 20 29 7b 0a 20 20 20 20 20  empTrig ){.     
189b0 20 20 20 20 20 7a 54 65 6d 70 54 72 69 67 20 3d       zTempTrig =
189c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
189d0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
189e0 74 79 70 65 20 3d 20 27 74 72 69 67 67 65 72 27  type = 'trigger'
189f0 20 41 4e 44 20 28 6e 61 6d 65 3d 25 51 22 2c 20   AND (name=%Q", 
18a00 70 54 72 69 67 2d 3e 6e 61 6d 65 29 3b 0a 20 20  pTrig->name);.  
18a10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18a20 20 20 20 20 20 20 20 74 6d 70 20 3d 20 7a 54 65         tmp = zTe
18a30 6d 70 54 72 69 67 3b 0a 20 20 20 20 20 20 20 20  mpTrig;.        
18a40 20 20 7a 54 65 6d 70 54 72 69 67 20 3d 20 73 71    zTempTrig = sq
18a50 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 73  lite3MPrintf("%s
18a60 20 4f 52 20 6e 61 6d 65 3d 25 51 22 2c 20 7a 54   OR name=%Q", zT
18a70 65 6d 70 54 72 69 67 2c 20 70 54 72 69 67 2d 3e  empTrig, pTrig->
18a80 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
18a90 20 73 71 6c 69 74 65 46 72 65 65 28 74 6d 70 29   sqliteFree(tmp)
18aa0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18ab0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
18ac0 28 20 7a 54 65 6d 70 54 72 69 67 20 29 7b 0a 20  ( zTempTrig ){. 
18ad0 20 20 20 20 20 74 6d 70 20 3d 20 7a 54 65 6d 70       tmp = zTemp
18ae0 54 72 69 67 3b 0a 20 20 20 20 20 20 7a 54 65 6d  Trig;.      zTem
18af0 70 54 72 69 67 20 3d 20 73 71 6c 69 74 65 33 4d  pTrig = sqlite3M
18b00 50 72 69 6e 74 66 28 22 25 73 29 22 2c 20 7a 54  Printf("%s)", zT
18b10 65 6d 70 54 72 69 67 29 3b 0a 20 20 20 20 20 20  empTrig);.      
18b20 73 71 6c 69 74 65 46 72 65 65 28 74 6d 70 29 3b  sqliteFree(tmp);
18b30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65  .      sqlite3Ne
18b40 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
18b50 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 55 50  , .          "UP
18b60 44 41 54 45 20 73 71 6c 69 74 65 5f 74 65 6d 70  DATE sqlite_temp
18b70 5f 6d 61 73 74 65 72 20 53 45 54 20 22 0a 20 20  _master SET ".  
18b80 20 20 20 20 20 20 20 20 20 20 20 20 22 73 71 6c              "sql
18b90 20 3d 20 73 71 6c 69 74 65 5f 61 6c 74 65 72 5f   = sqlite_alter_
18ba0 74 72 69 67 67 65 72 28 73 71 6c 2c 20 25 51 29  trigger(sql, %Q)
18bb0 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
18bc0 20 20 22 74 62 6c 5f 6e 61 6d 65 20 3d 20 25 51    "tbl_name = %Q
18bd0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
18be0 20 22 57 48 45 52 45 20 25 73 3b 22 2c 20 7a 4e   "WHERE %s;", zN
18bf0 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 7a 54 65 6d  ame, zName, zTem
18c00 70 54 72 69 67 29 3b 0a 20 20 20 20 7d 0a 20 20  pTrig);.    }.  
18c10 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  }.#endif..  /* D
18c20 72 6f 70 20 74 68 65 20 65 6c 65 6d 65 6e 74 73  rop the elements
18c30 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
18c40 79 20 73 63 68 65 6d 61 20 74 68 61 74 20 72 65  y schema that re
18c50 66 65 72 65 64 20 74 6f 20 74 68 65 20 74 61 62  fered to the tab
18c60 6c 65 0a 20 20 2a 2a 20 72 65 6e 61 6d 65 64 20  le.  ** renamed 
18c70 61 6e 64 20 6c 6f 61 64 20 74 68 65 20 6e 65 77  and load the new
18c80 20 76 65 72 73 69 6f 6e 73 20 66 72 6f 6d 20 74   versions from t
18c90 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
18ca0 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
18cb0 6e 45 72 72 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  nErr==0 ){.#ifnd
18cc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
18cd0 52 49 47 47 45 52 0a 20 20 20 20 54 72 69 67 67  RIGGER.    Trigg
18ce0 65 72 20 2a 70 54 72 69 67 3b 0a 20 20 20 20 66  er *pTrig;.    f
18cf0 6f 72 28 20 70 54 72 69 67 3d 70 54 61 62 2d 3e  or( pTrig=pTab->
18d00 70 54 72 69 67 67 65 72 3b 20 70 54 72 69 67 3b  pTrigger; pTrig;
18d10 20 70 54 72 69 67 3d 70 54 72 69 67 2d 3e 70 4e   pTrig=pTrig->pN
18d20 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ext ){.      ass
18d30 65 72 74 28 20 70 54 72 69 67 2d 3e 69 44 62 3d  ert( pTrig->iDb=
18d40 3d 69 44 62 20 7c 7c 20 70 54 72 69 67 2d 3e 69  =iDb || pTrig->i
18d50 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  Db==1 );.      s
18d60 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
18d70 20 4f 50 5f 44 72 6f 70 54 72 69 67 67 65 72 2c   OP_DropTrigger,
18d80 20 70 54 72 69 67 2d 3e 69 44 62 2c 20 30 2c 20   pTrig->iDb, 0, 
18d90 70 54 72 69 67 2d 3e 6e 61 6d 65 2c 20 30 29 3b  pTrig->name, 0);
18da0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
18db0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
18dc0 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65  (v, OP_DropTable
18dd0 2c 20 69 44 62 2c 20 30 2c 20 70 54 61 62 2d 3e  , iDb, 0, pTab->
18de0 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7a  zName, 0);.    z
18df0 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 4d  Where = sqlite3M
18e00 50 72 69 6e 74 66 28 22 74 62 6c 5f 6e 61 6d 65  Printf("tbl_name
18e10 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  =%Q", zName);.  
18e20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
18e30 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65  (v, OP_ParseSche
18e40 6d 61 2c 20 69 44 62 2c 20 30 2c 20 7a 57 68 65  ma, iDb, 0, zWhe
18e50 72 65 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b  re, P3_DYNAMIC);
18e60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18e70 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20  OMIT_TRIGGER.   
18e80 20 69 66 28 20 7a 54 65 6d 70 54 72 69 67 20 29   if( zTempTrig )
18e90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
18ea0 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72  dbeOp3(v, OP_Par
18eb0 73 65 53 63 68 65 6d 61 2c 20 31 2c 20 30 2c 20  seSchema, 1, 0, 
18ec0 7a 54 65 6d 70 54 72 69 67 2c 20 50 33 5f 44 59  zTempTrig, P3_DY
18ed0 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  NAMIC);.    }.  
18ee0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
18ef0 65 46 72 65 65 28 7a 54 65 6d 70 54 72 69 67 29  eFree(zTempTrig)
18f00 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 65 78  ;.#endif.  }..ex
18f10 69 74 5f 61 6c 74 65 72 5f 74 61 62 6c 65 3a 0a  it_alter_table:.
18f20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
18f30 44 65 6c 65 74 65 28 70 53 72 63 29 3b 0a 20 20  Delete(pSrc);.  
18f40 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
18f50 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a              );.}.#endif.