/ Hex Artifact Content
Login

Artifact f25e98306518b76190c526bf970ebcda60919674:


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 20 20 20    ROLLBACK.**   
02d0: 20 20 50 52 41 47 4d 41 0a 2a 2a 0a 2a 2a 20 24    PRAGMA.**.** $
02e0: 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20 31 2e  Id: build.c,v 1.
02f0: 31 36 37 20 32 30 30 34 2f 30 32 2f 31 33 20 31  167 2004/02/13 1
0300: 36 3a 32 32 3a 32 33 20 64 72 68 20 45 78 70 20  6:22:23 drh Exp 
0310: 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  $.*/.#include "s
0320: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
0330: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a  lude <ctype.h>..
0340: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0350: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
0360: 6e 20 61 20 6e 65 77 20 53 51 4c 20 73 74 61 74  n a new SQL stat
0370: 65 6d 65 6e 74 20 69 73 20 62 65 67 69 6e 6e 69  ement is beginni
0380: 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61 72 73  ng to.** be pars
0390: 65 64 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  ed.  Check to se
03a0: 65 20 69 66 20 74 68 65 20 73 63 68 65 6d 61 20  e if the schema 
03b0: 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
03c0: 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20   needs.** to be 
03d0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 53 51  read from the SQ
03e0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 61 6e 64 20  LITE_MASTER and 
03f0: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 4d 41 53 54  SQLITE_TEMP_MAST
0400: 45 52 20 74 61 62 6c 65 73 2e 0a 2a 2a 20 49 66  ER tables..** If
0410: 20 69 74 20 64 6f 65 73 2c 20 74 68 65 6e 20 72   it does, then r
0420: 65 61 64 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ead it..*/.void 
0430: 73 71 6c 69 74 65 42 65 67 69 6e 50 61 72 73 65  sqliteBeginParse
0440: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
0450: 69 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29  int explainFlag)
0460: 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  {.  sqlite *db =
0470: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
0480: 6e 74 20 69 3b 0a 20 20 70 50 61 72 73 65 2d 3e  nt i;.  pParse->
0490: 65 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61 69  explain = explai
04a0: 6e 46 6c 61 67 3b 0a 20 20 69 66 28 28 64 62 2d  nFlag;.  if((db-
04b0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
04c0: 49 6e 69 74 69 61 6c 69 7a 65 64 29 3d 3d 30 20  Initialized)==0 
04d0: 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  && pParse->initF
04e0: 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  lag==0 ){.    in
04f0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 49 6e 69  t rc = sqliteIni
0500: 74 28 64 62 2c 20 26 70 50 61 72 73 65 2d 3e 7a  t(db, &pParse->z
0510: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28  ErrMsg);.    if(
0520: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
0530: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
0540: 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 70  rc = rc;.      p
0550: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
0560: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
0570: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
0580: 2b 2b 29 7b 0a 20 20 20 20 44 62 43 6c 65 61 72  ++){.    DbClear
0590: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20  Property(db, i, 
05a0: 44 42 5f 4c 6f 63 6b 65 64 29 3b 0a 20 20 20 20  DB_Locked);.    
05b0: 69 66 28 20 21 64 62 2d 3e 61 44 62 5b 69 5d 2e  if( !db->aDb[i].
05c0: 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20  inTrans ){.     
05d0: 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79   DbClearProperty
05e0: 28 64 62 2c 20 69 2c 20 44 42 5f 43 6f 6f 6b 69  (db, i, DB_Cooki
05f0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
0600: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30  pParse->nVar = 0
0610: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
0620: 69 73 20 61 20 66 61 6b 65 20 63 61 6c 6c 62 61  is a fake callba
0630: 63 6b 20 70 72 6f 63 65 64 75 72 65 20 75 73 65  ck procedure use
0640: 64 20 77 68 65 6e 20 73 71 6c 69 74 65 5f 65 78  d when sqlite_ex
0650: 65 63 28 29 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b  ec() is.** invok
0660: 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63  ed with a NULL c
0670: 61 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 65 72 2e  allback pointer.
0680: 20 20 49 66 20 77 65 20 70 61 73 73 20 61 20 4e    If we pass a N
0690: 55 4c 4c 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  ULL callback.** 
06a0: 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 73 71 6c  pointer into sql
06b0: 69 74 65 56 64 62 65 45 78 65 63 28 29 20 69 74  iteVdbeExec() it
06c0: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 74 20   will return at 
06d0: 65 76 65 72 79 20 4f 50 5f 43 61 6c 6c 62 61 63  every OP_Callbac
06e0: 6b 2c 0a 2a 2a 20 77 68 69 63 68 20 77 65 20 64  k,.** which we d
06f0: 6f 20 6e 6f 74 20 77 61 6e 74 20 69 74 20 74 6f  o not want it to
0700: 20 64 6f 2e 20 20 53 6f 20 77 65 20 73 75 62 73   do.  So we subs
0710: 74 69 74 75 74 65 20 61 20 70 6f 69 6e 74 65 72  titute a pointer
0720: 20 74 6f 20 74 68 69 73 0a 2a 2a 20 70 72 6f 63   to this.** proc
0730: 65 64 75 72 65 20 69 6e 20 70 6c 61 63 65 20 6f  edure in place o
0740: 66 20 74 68 65 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  f the NULL..*/.s
0750: 74 61 74 69 63 20 69 6e 74 20 66 61 6b 65 43 61  tatic int fakeCa
0760: 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 4e 6f 74  llback(void *Not
0770: 55 73 65 64 2c 20 69 6e 74 20 6e 2c 20 63 68 61  Used, int n, cha
0780: 72 20 2a 2a 61 7a 31 2c 20 63 68 61 72 20 2a 2a  r **az1, char **
0790: 61 7a 32 29 7b 0a 20 20 72 65 74 75 72 6e 20 30  az2){.  return 0
07a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
07b0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
07c0: 64 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65  d after a single
07d0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68   SQL statement h
07e0: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65  as been.** parse
07f0: 64 20 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f  d and we want to
0800: 20 65 78 65 63 75 74 65 20 74 68 65 20 56 44 42   execute the VDB
0810: 45 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d  E code to implem
0820: 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20 73 74 61  ent .** that sta
0830: 74 65 6d 65 6e 74 2e 20 20 50 72 69 6f 72 20 61  tement.  Prior a
0840: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 73  ction routines s
0850: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
0860: 64 79 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65  dy.** constructe
0870: 64 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 64  d VDBE code to d
0880: 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68  o the work of th
0890: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
08a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
08b0: 20 6a 75 73 74 20 68 61 73 20 74 6f 20 65 78 65   just has to exe
08c0: 63 75 74 65 20 74 68 65 20 56 44 42 45 20 63 6f  cute the VDBE co
08d0: 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  de..**.** Note t
08e0: 68 61 74 20 69 66 20 61 6e 20 65 72 72 6f 72 20  hat if an error 
08f0: 6f 63 63 75 72 72 65 64 2c 20 69 74 20 6d 69 67  occurred, it mig
0900: 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
0910: 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63  hat.** no VDBE c
0920: 6f 64 65 20 77 61 73 20 67 65 6e 65 72 61 74 65  ode was generate
0930: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
0940: 65 45 78 65 63 28 50 61 72 73 65 20 2a 70 50 61  eExec(Parse *pPa
0950: 72 73 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  rse){.  int rc =
0960: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
0970: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
0980: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
0990: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
09a0: 3b 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62  ;.  int (*xCallb
09b0: 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  ack)(void*,int,c
09c0: 68 61 72 2a 2a 2c 63 68 61 72 2a 2a 29 3b 0a 0a  har**,char**);..
09d0: 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c    if( sqlite_mal
09e0: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
09f0: 75 72 6e 3b 0a 20 20 78 43 61 6c 6c 62 61 63 6b  urn;.  xCallback
0a00: 20 3d 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c   = pParse->xCall
0a10: 62 61 63 6b 3b 0a 20 20 69 66 28 20 78 43 61 6c  back;.  if( xCal
0a20: 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  lback==0 ){.    
0a30: 69 66 28 20 70 50 61 72 73 65 2d 3e 75 73 65 43  if( pParse->useC
0a40: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
0a50: 20 78 43 61 6c 6c 62 61 63 6b 20 3d 20 66 61 6b   xCallback = fak
0a60: 65 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d  eCallback;.    }
0a70: 65 6c 73 65 20 69 66 28 20 76 3d 3d 30 20 29 7b  else if( v==0 ){
0a80: 0a 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69 74  .      v = sqlit
0a90: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
0aa0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
0ab0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 48 61  beAddOp(v, OP_Ha
0ac0: 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  lt, 0, 0);.    }
0ad0: 0a 20 20 7d 0a 20 20 69 66 28 20 76 20 26 26 20  .  }.  if( v && 
0ae0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
0af0: 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74 72 61  ){.    FILE *tra
0b00: 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  ce = (db->flags 
0b10: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61  & SQLITE_VdbeTra
0b20: 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74 20  ce)!=0 ? stdout 
0b30: 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  : 0;.    sqliteV
0b40: 64 62 65 54 72 61 63 65 28 76 2c 20 74 72 61 63  dbeTrace(v, trac
0b50: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  e);.    sqliteVd
0b60: 62 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70  beMakeReady(v, p
0b70: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 78 43 61  Parse->nVar, xCa
0b80: 6c 6c 62 61 63 6b 2c 20 70 50 61 72 73 65 2d 3e  llback, pParse->
0b90: 70 41 72 67 2c 0a 20 20 20 20 20 20 20 20 20 20  pArg,.          
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
0bb0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29 3b 0a  arse->explain);.
0bc0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
0bd0: 75 73 65 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  useCallback ){. 
0be0: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
0bf0: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
0c00: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 56      rc = sqliteV
0c10: 64 62 65 4c 69 73 74 28 76 29 3b 0a 20 20 20 20  dbeList(v);.    
0c20: 20 20 20 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f      db->next_coo
0c30: 6b 69 65 20 3d 20 64 62 2d 3e 61 44 62 5b 30 5d  kie = db->aDb[0]
0c40: 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a  .schema_cookie;.
0c50: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
0c60: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 45       sqliteVdbeE
0c70: 78 65 63 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a  xec(v);.      }.
0c80: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
0c90: 65 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 76 2c  eVdbeFinalize(v,
0ca0: 20 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73   &pParse->zErrMs
0cb0: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
0cc0: 20 29 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b   ) pParse->nErr+
0cd0: 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  +;.      pParse-
0ce0: 3e 70 56 64 62 65 20 3d 20 30 3b 0a 20 20 20 20  >pVdbe = 0;.    
0cf0: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72    pParse->rc = r
0d00: 63 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  c;.      if( rc 
0d10: 29 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b  ) pParse->nErr++
0d20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
0d30: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
0d40: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 3f 20 53  pParse->nErr ? S
0d50: 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a 20 53 51  QLITE_ERROR : SQ
0d60: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
0d70: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c  .    pParse->col
0d80: 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20  NamesSet = 0;.  
0d90: 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 73 65  }else if( pParse
0da0: 2d 3e 75 73 65 43 61 6c 6c 62 61 63 6b 3d 3d 30  ->useCallback==0
0db0: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
0dc0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
0dd0: 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d  R;.  }.  pParse-
0de0: 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70 50 61  >nTab = 0;.  pPa
0df0: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20  rse->nMem = 0;. 
0e00: 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20   pParse->nSet = 
0e10: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 41 67  0;.  pParse->nAg
0e20: 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  g = 0;.  pParse-
0e30: 3e 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  >nVar = 0;.}../*
0e40: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
0e50: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
0e60: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
0e70: 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c  s .** a particul
0e80: 61 72 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ar database tabl
0e90: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
0ea0: 0a 2a 2a 20 6f 66 20 74 68 61 74 20 74 61 62 6c  .** of that tabl
0eb0: 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c  e and (optionall
0ec0: 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  y) the name of t
0ed0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  he database.** c
0ee0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
0ef0: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ble.  Return NUL
0f00: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
0f10: 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61  **.** If zDataba
0f20: 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74  se is 0, all dat
0f30: 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63  abases are searc
0f40: 68 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74  hed for the.** t
0f50: 61 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72  able and the fir
0f60: 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c  st matching tabl
0f70: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
0f80: 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  (No checking.** 
0f90: 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 74 61  for duplicate ta
0fa0: 62 6c 65 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e  ble names is don
0fb0: 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20  e.)  The search 
0fc0: 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50  order is.** TEMP
0fd0: 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49   first, then MAI
0fe0: 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69  N, then any auxi
0ff0: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20  liary databases 
1000: 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74  added.** using t
1010: 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e  he ATTACH comman
1020: 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  d..**.** See als
1030: 6f 20 73 71 6c 69 74 65 4c 6f 63 61 74 65 54 61  o sqliteLocateTa
1040: 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ble()..*/.Table 
1050: 2a 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65  *sqliteFindTable
1060: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e  (sqlite *db, con
1070: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
1080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
1090: 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20  abase){.  Table 
10a0: 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  *p = 0;.  int i;
10b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
10c0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
10d0: 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f   int j = (i<2) ?
10e0: 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53   i^1 : i;   /* S
10f0: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
1100: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66  e MAIN */.    if
1110: 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26  ( zDatabase!=0 &
1120: 26 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  & sqliteStrICmp(
1130: 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61  zDatabase, db->a
1140: 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63  Db[j].zName) ) c
1150: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d  ontinue;.    p =
1160: 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28   sqliteHashFind(
1170: 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62 6c 48  &db->aDb[j].tblH
1180: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c  ash, zName, strl
1190: 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20  en(zName)+1);.  
11a0: 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b    if( p ) break;
11b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
11c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
11d0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
11e0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
11f0: 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61  scribes .** a pa
1200: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
1210: 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68  e table given th
1220: 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68 61  e name.** of tha
1230: 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74  t table and (opt
1240: 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d  ionally) the nam
1250: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1260: 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20  e.** containing 
1270: 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
1280: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
1290: 6f 75 6e 64 2e 0a 2a 2a 20 41 6c 73 6f 20 6c 65  ound..** Also le
12a0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
12b0: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
12c0: 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
12d0: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
12e0: 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
12f0: 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 46 69 6e  ne and sqliteFin
1300: 64 54 61 62 6c 65 28 29 0a 2a 2a 20 69 73 20 74  dTable().** is t
1310: 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
1320: 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72   leaves an error
1330: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
1340: 73 65 2d 3e 7a 45 72 72 4d 73 67 0a 2a 2a 20 77  se->zErrMsg.** w
1350: 68 65 72 65 20 73 71 6c 69 74 65 46 69 6e 64 54  here sqliteFindT
1360: 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e  able() does not.
1370: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
1380: 65 4c 6f 63 61 74 65 54 61 62 6c 65 28 50 61 72  eLocateTable(Par
1390: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
13a0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63  t char *zName, c
13b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61 73  onst char *zDbas
13c0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
13d0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 46 69 6e  .  p = sqliteFin
13e0: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  dTable(pParse->d
13f0: 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65  b, zName, zDbase
1400: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
1410: 0a 20 20 20 20 69 66 28 20 7a 44 62 61 73 65 20  .    if( zDbase 
1420: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  ){.      sqliteE
1430: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1440: 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
1450: 25 73 2e 25 73 22 2c 20 7a 44 62 61 73 65 2c 20  %s.%s", zDbase, 
1460: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
1470: 65 20 69 66 28 20 73 71 6c 69 74 65 46 69 6e 64  e if( sqliteFind
1480: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
1490: 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29  , zName, 0)!=0 )
14a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 72  {.      sqliteEr
14b0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
14c0: 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 69 73 20  table \"%s\" is 
14d0: 6e 6f 74 20 69 6e 20 64 61 74 61 62 61 73 65 20  not in database 
14e0: 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20  \"%s\"",.       
14f0: 20 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29    zName, zDbase)
1500: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1510: 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
1520: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
1530: 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a  ch table: %s", z
1540: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
1550: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
1560: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
1570: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
1580: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
1590: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
15a0: 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e  ular index given
15b0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
15c0: 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  t index.** and t
15d0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
15e0: 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e  atabase that con
15f0: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e  tains the index.
1600: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
1610: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
1620: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
1630: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
1640: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
1650: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
1660: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
1670: 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20   matching index 
1680: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
1690: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
16a0: 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65  r duplicate inde
16b0: 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  x names is done.
16c0: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
16d0: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
16e0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
16f0: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
1700: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
1710: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
1720: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
1730: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
1740: 65 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74  eFindIndex(sqlit
1750: 65 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  e *db, const cha
1760: 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
1770: 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e  char *zDb){.  In
1780: 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e  dex *p = 0;.  in
1790: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
17a0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
17b0: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
17c0: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f  2) ? i^1 : i;  /
17d0: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
17e0: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
17f0: 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69   if( zDb && sqli
1800: 74 65 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64  teStrICmp(zDb, d
1810: 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29  b->aDb[j].zName)
1820: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1830: 20 70 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46   p = sqliteHashF
1840: 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e  ind(&db->aDb[j].
1850: 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  idxHash, zName, 
1860: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29  strlen(zName)+1)
1870: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72  ;.    if( p ) br
1880: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
1890: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n p;.}../*.** Re
18a0: 6d 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20 69  move the given i
18b0: 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e  ndex from the in
18c0: 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c 20  dex hash table, 
18d0: 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73 20  and free.** its 
18e0: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
18f0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64  s..**.** The ind
1900: 65 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ex is removed fr
1910: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1920: 68 61 73 68 20 74 61 62 6c 65 73 20 62 75 74 0a  hash tables but.
1930: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c  ** it is not unl
1940: 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 54  inked from the T
1950: 61 62 6c 65 20 74 68 61 74 20 69 74 20 69 6e 64  able that it ind
1960: 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69  exes..** Unlinki
1970: 6e 67 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c  ng from the Tabl
1980: 65 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 62  e must be done b
1990: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
19a0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
19b0: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c  c void sqliteDel
19c0: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 20  eteIndex(sqlite 
19d0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
19e0: 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 0a    Index *pOld;..
19f0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
1a00: 26 26 20 70 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29  && p->zName!=0 )
1a10: 3b 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74  ;.  pOld = sqlit
1a20: 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  eHashInsert(&db-
1a30: 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78  >aDb[p->iDb].idx
1a40: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a  Hash, p->zName,.
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a60: 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e            strlen
1a70: 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29  (p->zName)+1, 0)
1a80: 3b 0a 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20  ;.  if( pOld!=0 
1a90: 26 26 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20  && pOld!=p ){.  
1aa0: 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65    sqliteHashInse
1ab0: 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69  rt(&db->aDb[p->i
1ac0: 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 4f 6c  Db].idxHash, pOl
1ad0: 64 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  d->zName,.      
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1af0: 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d  trlen(pOld->zNam
1b00: 65 29 2b 31 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d  e)+1, pOld);.  }
1b10: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29  .  sqliteFree(p)
1b20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  ;.}../*.** Unlin
1b30: 6b 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65  k the given inde
1b40: 78 20 66 72 6f 6d 20 69 74 73 20 74 61 62 6c 65  x from its table
1b50: 2c 20 74 68 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a  , then remove.**
1b60: 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 20   the index from 
1b70: 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74  the index hash t
1b80: 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20 69 74  able and free it
1b90: 73 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75  s memory.** stru
1ba0: 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ctures..*/.void 
1bb0: 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44  sqliteUnlinkAndD
1bc0: 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74  eleteIndex(sqlit
1bd0: 65 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49  e *db, Index *pI
1be0: 6e 64 65 78 29 7b 0a 20 20 69 66 28 20 70 49 6e  ndex){.  if( pIn
1bf0: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
1c00: 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20  dex==pIndex ){. 
1c10: 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c     pIndex->pTabl
1c20: 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  e->pIndex = pInd
1c30: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c  ex->pNext;.  }el
1c40: 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  se{.    Index *p
1c50: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 49 6e 64  ;.    for(p=pInd
1c60: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
1c70: 65 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65 78  ex; p && p->pNex
1c80: 74 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e  t!=pIndex; p=p->
1c90: 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 69 66 28  pNext){}.    if(
1ca0: 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d   p && p->pNext==
1cb0: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
1cc0: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  p->pNext = pInde
1cd0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  x->pNext;.    }.
1ce0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 6c 65    }.  sqliteDele
1cf0: 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  teIndex(db, pInd
1d00: 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  ex);.}../*.** Er
1d10: 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69  ase all schema i
1d20: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
1d30: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
1d40: 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20  sh tables of.** 
1d50: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1d60: 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ion.  This routi
1d70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
1d80: 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a  reclaim memory.*
1d90: 2a 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f 6e  * before the con
1da0: 6e 65 63 74 69 6f 6e 20 63 6c 6f 73 65 73 2e 20  nection closes. 
1db0: 20 49 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c   It is also call
1dc0: 65 64 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ed during a roll
1dd0: 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65  back.** if there
1de0: 20 77 65 72 65 20 73 63 68 65 6d 61 20 63 68 61   were schema cha
1df0: 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65 20  nges during the 
1e00: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1e10: 2a 2a 20 49 66 20 69 44 62 3c 3d 30 20 74 68 65  ** If iDb<=0 the
1e20: 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65  n reset the inte
1e30: 72 6e 61 6c 20 73 63 68 65 6d 61 20 74 61 62 6c  rnal schema tabl
1e40: 65 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  es for all datab
1e50: 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20 49  ase.** files.  I
1e60: 66 20 69 44 62 3e 3d 32 20 74 68 65 6e 20 72 65  f iDb>=2 then re
1e70: 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  set the internal
1e80: 20 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c 79   schema for only
1e90: 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 66   the.** single f
1ea0: 69 6c 65 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a  ile indicated..*
1eb0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 52 65 73  /.void sqliteRes
1ec0: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
1ed0: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 69 6e 74  (sqlite *db, int
1ee0: 20 69 44 62 29 7b 0a 20 20 48 61 73 68 45 6c 65   iDb){.  HashEle
1ef0: 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68  m *pElem;.  Hash
1f00: 20 74 65 6d 70 31 3b 0a 20 20 48 61 73 68 20 74   temp1;.  Hash t
1f10: 65 6d 70 32 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  emp2;.  int i, j
1f20: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  ;..  assert( iDb
1f30: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
1f40: 44 62 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  Db );.  db->flag
1f50: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 69  s &= ~SQLITE_Ini
1f60: 74 69 61 6c 69 7a 65 64 3b 0a 20 20 66 6f 72 28  tialized;.  for(
1f70: 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44 62  i=iDb; i<db->nDb
1f80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a  ; i++){.    Db *
1f90: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
1fa0: 5d 3b 0a 20 20 20 20 74 65 6d 70 31 20 3d 20 70  ];.    temp1 = p
1fb0: 44 62 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 20  Db->tblHash;.   
1fc0: 20 74 65 6d 70 32 20 3d 20 70 44 62 2d 3e 74 72   temp2 = pDb->tr
1fd0: 69 67 48 61 73 68 3b 0a 20 20 20 20 73 71 6c 69  igHash;.    sqli
1fe0: 74 65 48 61 73 68 49 6e 69 74 28 26 70 44 62 2d  teHashInit(&pDb-
1ff0: 3e 74 72 69 67 48 61 73 68 2c 20 53 51 4c 49 54  >trigHash, SQLIT
2000: 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30  E_HASH_STRING, 0
2010: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73  );.    sqliteHas
2020: 68 43 6c 65 61 72 28 26 70 44 62 2d 3e 61 46 4b  hClear(&pDb->aFK
2030: 65 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 48  ey);.    sqliteH
2040: 61 73 68 43 6c 65 61 72 28 26 70 44 62 2d 3e 69  ashClear(&pDb->i
2050: 64 78 48 61 73 68 29 3b 0a 20 20 20 20 66 6f 72  dxHash);.    for
2060: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
2070: 68 46 69 72 73 74 28 26 74 65 6d 70 32 29 3b 20  hFirst(&temp2); 
2080: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
2090: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
20a0: 6d 29 29 7b 0a 20 20 20 20 20 20 54 72 69 67 67  m)){.      Trigg
20b0: 65 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20 73  er *pTrigger = s
20c0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
20d0: 6c 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lem);.      sqli
20e0: 74 65 44 65 6c 65 74 65 54 72 69 67 67 65 72 28  teDeleteTrigger(
20f0: 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 7d  pTrigger);.    }
2100: 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73 68 43  .    sqliteHashC
2110: 6c 65 61 72 28 26 74 65 6d 70 32 29 3b 0a 20 20  lear(&temp2);.  
2120: 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 69 74    sqliteHashInit
2130: 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20  (&pDb->tblHash, 
2140: 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49  SQLITE_HASH_STRI
2150: 4e 47 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28  NG, 0);.    for(
2160: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
2170: 46 69 72 73 74 28 26 74 65 6d 70 31 29 3b 20 70  First(&temp1); p
2180: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
2190: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
21a0: 29 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  )){.      Table 
21b0: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
21c0: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
21d0: 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74       sqliteDelet
21e0: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  eTable(db, pTab)
21f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2200: 74 65 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d  teHashClear(&tem
2210: 70 31 29 3b 0a 20 20 20 20 44 62 43 6c 65 61 72  p1);.    DbClear
2220: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20  Property(db, i, 
2230: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
2240: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3e 30 20  ;.    if( iDb>0 
2250: 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20  ) return;.  }.  
2260: 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20 29  assert( iDb==0 )
2270: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
2280: 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43   ~SQLITE_InternC
2290: 68 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20 49 66  hanges;..  /* If
22a0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
22b0: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
22c0: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 73  tabase files has
22d0: 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20   been closed,.  
22e0: 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74  ** then remove t
22f0: 68 65 6e 20 66 72 6f 6d 20 74 68 65 20 61 75 78  hen from the aux
2300: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
2310: 6c 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74  list.  We take t
2320: 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e  he.  ** opportun
2330: 69 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68  ity to do this h
2340: 65 72 65 20 73 69 6e 63 65 20 77 65 20 68 61 76  ere since we hav
2350: 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61  e just deleted a
2360: 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73  ll of the.  ** s
2370: 63 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65  chema hash table
2380: 73 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20  s and therefore 
2390: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d  do not have to m
23a0: 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a  ake any changes.
23b0: 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74    ** to any of t
23c0: 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
23d0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  /.  for(i=0; i<d
23e0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
23f0: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
2400: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
2410: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
2420: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
2430: 20 70 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44   pDb->pAux && pD
2440: 62 2d 3e 78 46 72 65 65 41 75 78 20 29 20 70 44  b->xFreeAux ) pD
2450: 62 2d 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d  b->xFreeAux(pDb-
2460: 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44  >pAux);.      pD
2470: 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20  b->pAux = 0;.   
2480: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a   }.  }.  for(i=j
2490: 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =2; i<db->nDb; i
24a0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
24b0: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
24c0: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
24d0: 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20  Db->pBt==0 ){.  
24e0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
24f0: 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db->zName);.    
2500: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30    pDb->zName = 0
2510: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
2520: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2530: 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  j<i ){.      db-
2540: 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44  >aDb[j] = db->aD
2550: 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b[i];.    }.    
2560: 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  j++;.  }.  memse
2570: 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30  t(&db->aDb[j], 0
2580: 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69  , (db->nDb-j)*si
2590: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29  zeof(db->aDb[j])
25a0: 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a  );.  db->nDb = j
25b0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c  ;.  if( db->nDb<
25c0: 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64  =2 && db->aDb!=d
25d0: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a  b->aDbStatic ){.
25e0: 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61      memcpy(db->a
25f0: 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44  DbStatic, db->aD
2600: 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b, 2*sizeof(db->
2610: 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71  aDb[0]));.    sq
2620: 6c 69 74 65 46 72 65 65 28 64 62 2d 3e 61 44 62  liteFree(db->aDb
2630: 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d  );.    db->aDb =
2640: 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a   db->aDbStatic;.
2650: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
2660: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2670: 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 20 72  led whenever a r
2680: 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20  ollback occurs. 
2690: 20 49 66 20 74 68 65 72 65 20 77 65 72 65 0a 2a   If there were.*
26a0: 2a 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  * schema changes
26b0: 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e   during the tran
26c0: 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65  saction, then we
26d0: 20 68 61 76 65 20 74 6f 20 72 65 73 65 74 20 74   have to reset t
26e0: 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68  he.** internal h
26f0: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 72  ash tables and r
2700: 65 6c 6f 61 64 20 74 68 65 6d 20 66 72 6f 6d 20  eload them from 
2710: 64 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  disk..*/.void sq
2720: 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 49 6e 74 65  liteRollbackInte
2730: 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69  rnalChanges(sqli
2740: 74 65 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64  te *db){.  if( d
2750: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
2760: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20  E_InternChanges 
2770: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 52 65 73  ){.    sqliteRes
2780: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
2790: 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  (db, 0);.  }.}..
27a0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
27b0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
27c0: 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72  n a commit occur
27d0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
27e0: 65 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  eCommitInternalC
27f0: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20 2a 64  hanges(sqlite *d
2800: 62 29 7b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d  b){.  db->aDb[0]
2810: 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d  .schema_cookie =
2820: 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65   db->next_cookie
2830: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
2840: 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43   ~SQLITE_InternC
2850: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
2860: 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f   Remove the memo
2870: 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ry data structur
2880: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
2890: 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  th the given.** 
28a0: 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67  Table.  No chang
28b0: 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64  es are made to d
28c0: 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74  isk by this rout
28d0: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ine..**.** This 
28e0: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c  routine just del
28f0: 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74  etes the data st
2900: 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65  ructure.  It doe
2910: 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20  s not unlink.** 
2920: 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73  the table data s
2930: 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
2940: 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 4e  e hash table.  N
2950: 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d 6f 76  or does it remov
2960: 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79  e.** foreign key
2970: 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74  s from the sqlit
2980: 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62  e.aFKey hash tab
2990: 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73  le.  But it does
29a0: 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f   destroy.** memo
29b0: 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66  ry structures of
29c0: 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64   the indices and
29d0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73   foreign keys as
29e0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a  sociated with .*
29f0: 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  * the table..**.
2a00: 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73 6f 63  ** Indices assoc
2a10: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
2a20: 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e 6b 65  able are unlinke
2a30: 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62 22 0a  d from the "db".
2a40: 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ** data structur
2a50: 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e 20 20  e if db!=NULL.  
2a60: 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64  If db==NULL, ind
2a70: 69 63 65 73 20 61 74 74 61 63 68 65 64 20 74 6f  ices attached to
2a80: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 61 72  .** the table ar
2a90: 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74 20 69  e deleted, but i
2aa0: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 65  t is assumed the
2ab0: 79 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  y have already b
2ac0: 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e  een.** unlinked.
2ad0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44  .*/.void sqliteD
2ae0: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
2af0: 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54  e *db, Table *pT
2b00: 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  able){.  int i;.
2b10: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c    Index *pIndex,
2b20: 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20   *pNext;.  FKey 
2b30: 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b  *pFKey, *pNextFK
2b40: 65 79 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 6c  ey;..  if( pTabl
2b50: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  e==0 ) return;..
2b60: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
2b70: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
2b80: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
2b90: 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49  le.  */.  for(pI
2ba0: 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70  ndex = pTable->p
2bb0: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
2bc0: 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20  Index=pNext){.  
2bd0: 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78    pNext = pIndex
2be0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73  ->pNext;.    ass
2bf0: 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 69 44 62  ert( pIndex->iDb
2c00: 3d 3d 70 54 61 62 6c 65 2d 3e 69 44 62 20 7c 7c  ==pTable->iDb ||
2c10: 20 28 70 54 61 62 6c 65 2d 3e 69 44 62 3d 3d 30   (pTable->iDb==0
2c20: 20 26 26 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d   && pIndex->iDb=
2c30: 3d 31 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  =1) );.    sqlit
2c40: 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c  eDeleteIndex(db,
2c50: 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20   pIndex);.  }.. 
2c60: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 66   /* Delete all f
2c70: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f  oreign keys asso
2c80: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
2c90: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6b 65 79   table.  The key
2ca0: 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61  s.  ** should ha
2cb0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
2cc0: 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68  unlinked from th
2cd0: 65 20 64 62 2d 3e 61 46 4b 65 79 20 68 61 73 68  e db->aFKey hash
2ce0: 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 66   table .  */.  f
2cf0: 6f 72 28 70 46 4b 65 79 3d 70 54 61 62 6c 65 2d  or(pFKey=pTable-
2d00: 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70  >pFKey; pFKey; p
2d10: 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79 29 7b  FKey=pNextFKey){
2d20: 0a 20 20 20 20 70 4e 65 78 74 46 4b 65 79 20 3d  .    pNextFKey =
2d30: 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
2d40: 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  m;.    assert( p
2d50: 54 61 62 6c 65 2d 3e 69 44 62 3c 64 62 2d 3e 6e  Table->iDb<db->n
2d60: 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Db );.    assert
2d70: 28 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64  ( sqliteHashFind
2d80: 28 26 64 62 2d 3e 61 44 62 5b 70 54 61 62 6c 65  (&db->aDb[pTable
2d90: 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 0a 20 20  ->iDb].aFKey,.  
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db0: 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e           pFKey->
2dc0: 7a 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46 4b 65  zTo, strlen(pFKe
2dd0: 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65  y->zTo)+1)!=pFKe
2de0: 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  y );.    sqliteF
2df0: 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 7d 0a  ree(pFKey);.  }.
2e00: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65  .  /* Delete the
2e10: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
2e20: 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20   itself..  */.  
2e30: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c  for(i=0; i<pTabl
2e40: 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  e->nCol; i++){. 
2e50: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54     sqliteFree(pT
2e60: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  able->aCol[i].zN
2e70: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
2e80: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f  Free(pTable->aCo
2e90: 6c 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20  l[i].zDflt);.   
2ea0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
2eb0: 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70  le->aCol[i].zTyp
2ec0: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
2ed0: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e 61  Free(pTable->zNa
2ee0: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  me);.  sqliteFre
2ef0: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b  e(pTable->aCol);
2f00: 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44  .  sqliteSelectD
2f10: 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53  elete(pTable->pS
2f20: 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
2f30: 46 72 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d 0a  Free(pTable);.}.
2f40: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68  ./*.** Unlink th
2f50: 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72  e given table fr
2f60: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
2f70: 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74  es and the delet
2f80: 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73  e the.** table s
2f90: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6c  tructure with al
2fa0: 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e  l its indices an
2fb0: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a  d foreign keys..
2fc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2fd0: 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65  qliteUnlinkAndDe
2fe0: 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65  leteTable(sqlite
2ff0: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b   *db, Table *p){
3000: 0a 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a  .  Table *pOld;.
3010: 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46    FKey *pF1, *pF
3020: 32 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d 3e  2;.  int i = p->
3030: 69 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  iDb;.  assert( d
3040: 62 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d  b!=0 );.  pOld =
3050: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72   sqliteHashInser
3060: 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 74 62  t(&db->aDb[i].tb
3070: 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  lHash, p->zName,
3080: 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65   strlen(p->zName
3090: 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  )+1, 0);.  asser
30a0: 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f  t( pOld==0 || pO
30b0: 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 6f 72 28 70  ld==p );.  for(p
30c0: 46 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31  F1=p->pFKey; pF1
30d0: 3b 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74  ; pF1=pF1->pNext
30e0: 46 72 6f 6d 29 7b 0a 20 20 20 20 69 6e 74 20 6e  From){.    int n
30f0: 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 31 2d  To = strlen(pF1-
3100: 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 70  >zTo) + 1;.    p
3110: 46 32 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46  F2 = sqliteHashF
3120: 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e  ind(&db->aDb[i].
3130: 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c  aFKey, pF1->zTo,
3140: 20 6e 54 6f 29 3b 0a 20 20 20 20 69 66 28 20 70   nTo);.    if( p
3150: 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20  F2==pF1 ){.     
3160: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72   sqliteHashInser
3170: 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 61 46  t(&db->aDb[i].aF
3180: 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e  Key, pF1->zTo, n
3190: 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f  To, pF1->pNextTo
31a0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
31b0: 20 20 20 20 77 68 69 6c 65 28 20 70 46 32 20 26      while( pF2 &
31c0: 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 21 3d  & pF2->pNextTo!=
31d0: 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32 2d 3e  pF1 ){ pF2=pF2->
31e0: 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20 20 20  pNextTo; }.     
31f0: 20 69 66 28 20 70 46 32 20 29 7b 0a 20 20 20 20   if( pF2 ){.    
3200: 20 20 20 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f      pF2->pNextTo
3210: 20 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b   = pF1->pNextTo;
3220: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3230: 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74   }.  sqliteDelet
3240: 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 7d  eTable(db, p);.}
3250: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
3260: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
3270: 75 73 65 72 20 74 61 62 6c 65 20 6f 72 20 69 6e  user table or in
3280: 64 65 78 20 66 72 6f 6d 20 61 20 74 6f 6b 65 6e  dex from a token
3290: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
32a0: 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 20 69   hold the name i
32b0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
32c0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
32d0: 6e 64 20 6d 75 73 74 0a 2a 2a 20 62 65 20 66 72  nd must.** be fr
32e0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
32f0: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
3300: 63 68 61 72 20 2a 73 71 6c 69 74 65 54 61 62 6c  char *sqliteTabl
3310: 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54  eNameFromToken(T
3320: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
3330: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71  char *zName = sq
3340: 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e 61 6d  liteStrNDup(pNam
3350: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
3360: 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65  .  sqliteDequote
3370: 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  (zName);.  retur
3380: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zName;.}../*.*
3390: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
33a0: 74 6f 20 6f 70 65 6e 20 74 68 65 20 61 70 70 72  to open the appr
33b0: 6f 70 72 69 61 74 65 20 6d 61 73 74 65 72 20 74  opriate master t
33c0: 61 62 6c 65 2e 20 20 54 68 65 20 74 61 62 6c 65  able.  The table
33d0: 0a 2a 2a 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20  .** opened will 
33e0: 62 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  be SQLITE_MASTER
33f0: 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20   for persistent 
3400: 74 61 62 6c 65 73 20 61 6e 64 20 0a 2a 2a 20 53  tables and .** S
3410: 51 4c 49 54 45 5f 54 45 4d 50 5f 4d 41 53 54 45  QLITE_TEMP_MASTE
3420: 52 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  R for temporary 
3430: 74 61 62 6c 65 73 2e 20 20 54 68 65 20 74 61 62  tables.  The tab
3440: 6c 65 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  le is opened.** 
3450: 6f 6e 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a  on cursor 0..*/.
3460: 76 6f 69 64 20 73 71 6c 69 74 65 4f 70 65 6e 4d  void sqliteOpenM
3470: 61 73 74 65 72 54 61 62 6c 65 28 56 64 62 65 20  asterTable(Vdbe 
3480: 2a 76 2c 20 69 6e 74 20 69 73 54 65 6d 70 29 7b  *v, int isTemp){
3490: 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64  .  sqliteVdbeAdd
34a0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
34b0: 2c 20 69 73 54 65 6d 70 2c 20 30 29 3b 0a 20 20  , isTemp, 0);.  
34c0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
34d0: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
34e0: 20 30 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   0, 2);.}../*.**
34f0: 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74   Begin construct
3500: 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ing a new table 
3510: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
3520: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
3530: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
3540: 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f  of several actio
3550: 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20  n routines that 
3560: 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65  get called in re
3570: 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43  sponse.** to a C
3580: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
3590: 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69  ement.  In parti
35a0: 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74  cular, this rout
35b0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  ine is called.**
35c0: 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f   after seeing to
35d0: 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e  kens "CREATE" an
35e0: 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68  d "TABLE" and th
35f0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54  e table name.  T
3600: 68 65 0a 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b  he.** pStart tok
3610: 65 6e 20 69 73 20 74 68 65 20 43 52 45 41 54 45  en is the CREATE
3620: 20 61 6e 64 20 70 4e 61 6d 65 20 69 73 20 74 68   and pName is th
3630: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54  e table name.  T
3640: 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61  he isTemp.** fla
3650: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
3660: 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65   table should be
3670: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
3680: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
3690: 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61  e.** file instea
36a0: 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e  d of in the main
36b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
36c0: 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
36d0: 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68  y the case.** wh
36e0: 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72  en the "TEMP" or
36f0: 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79   "TEMPORARY" key
3700: 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62  word occurs in b
3710: 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45  etween.** CREATE
3720: 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a   and TABLE..**.*
3730: 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * The new table 
3740: 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61  record is initia
3750: 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e  lized and put in
3760: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
3770: 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f  le..** As more o
3780: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
3790: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  LE statement is 
37a0: 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e  parsed, addition
37b0: 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75  al action.** rou
37c0: 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61  tines will be ca
37d0: 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65  lled to add more
37e0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
37f0: 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20  this record..** 
3800: 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
3810: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
3820: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71  tatement, the sq
3830: 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 29 20 72  liteEndTable() r
3840: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
3850: 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  led to complete 
3860: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  the construction
3870: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
3880: 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69  e record..*/.voi
3890: 64 20 73 71 6c 69 74 65 53 74 61 72 74 54 61 62  d sqliteStartTab
38a0: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
38b0: 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72  rse,   /* Parser
38c0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
38d0: 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f  ken *pStart,   /
38e0: 2a 20 54 68 65 20 22 43 52 45 41 54 45 22 20 74  * The "CREATE" t
38f0: 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  oken */.  Token 
3900: 2a 70 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61  *pName,    /* Na
3910: 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20 76  me of table or v
3920: 69 65 77 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  iew to create */
3930: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
3940: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
3950: 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61  his is a TEMP ta
3960: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ble */.  int isV
3970: 69 65 77 20 20 20 20 20 20 20 2f 2a 20 54 72 75  iew       /* Tru
3980: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
3990: 49 45 57 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  IEW */.){.  Tabl
39a0: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49 6e 64  e *pTable;.  Ind
39b0: 65 78 20 2a 70 49 64 78 3b 0a 20 20 63 68 61 72  ex *pIdx;.  char
39c0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74   *zName;.  sqlit
39d0: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
39e0: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
39f0: 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 70 50 61   int iDb;..  pPa
3a00: 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e  rse->sFirstToken
3a10: 20 3d 20 2a 70 53 74 61 72 74 3b 0a 20 20 7a 4e   = *pStart;.  zN
3a20: 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  ame = sqliteTabl
3a30: 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  eNameFromToken(p
3a40: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
3a50: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
3a60: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 44    if( pParse->iD
3a70: 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20  b==1 ) isTemp = 
3a80: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
3a90: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
3aa0: 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28  TION.  assert( (
3ab0: 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54  isTemp & 1)==isT
3ac0: 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69  emp );.  {.    i
3ad0: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 68 61  nt code;.    cha
3ae0: 72 20 2a 7a 44 62 20 3d 20 69 73 54 65 6d 70 20  r *zDb = isTemp 
3af0: 3f 20 22 74 65 6d 70 22 20 3a 20 22 6d 61 69 6e  ? "temp" : "main
3b00: 22 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ";.    if( sqlit
3b10: 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  eAuthCheck(pPars
3b20: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
3b30: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
3b40: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
3b50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  ){.      sqliteF
3b60: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
3b70: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
3b80: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
3b90: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 65  {.      if( isTe
3ba0: 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  mp ){.        co
3bb0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
3bc0: 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  TE_TEMP_VIEW;.  
3bd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3be0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
3bf0: 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20  _CREATE_VIEW;.  
3c00: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
3c10: 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 65 6d  .      if( isTem
3c20: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
3c30: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
3c40: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  E_TEMP_TABLE;.  
3c50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3c60: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
3c70: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20  _CREATE_TABLE;. 
3c80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
3c90: 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43   if( sqliteAuthC
3ca0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
3cb0: 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  e, zName, 0, zDb
3cc0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
3cd0: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
3ce0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
3cf0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 0a 0a  }.  }.#endif. ..
3d00: 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 72 79 69    /* Before tryi
3d10: 6e 67 20 74 6f 20 63 72 65 61 74 65 20 61 20 74  ng to create a t
3d20: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
3d30: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74  make sure the Bt
3d40: 72 65 65 20 66 6f 72 0a 20 20 2a 2a 20 68 6f 6c  ree for.  ** hol
3d50: 64 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74  ding temporary t
3d60: 61 62 6c 65 73 20 69 73 20 6f 70 65 6e 2e 0a 20  ables is open.. 
3d70: 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70   */.  if( isTemp
3d80: 20 26 26 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70   && db->aDb[1].p
3d90: 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65  Bt==0 && !pParse
3da0: 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
3db0: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
3dc0: 42 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c  BtreeFactory(db,
3dd0: 20 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53   0, 0, MAX_PAGES
3de0: 2c 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  , &db->aDb[1].pB
3df0: 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
3e00: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3e10: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
3e20: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
3e30: 4d 73 67 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  Msg, "unable to 
3e40: 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
3e50: 20 64 61 74 61 62 61 73 65 20 22 0a 20 20 20 20   database ".    
3e60: 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74      "file for st
3e70: 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20  oring temporary 
3e80: 74 61 62 6c 65 73 22 2c 20 28 63 68 61 72 2a 29  tables", (char*)
3e90: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
3ea0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
3eb0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
3ec0: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
3ed0: 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  & SQLITE_InTrans
3ee0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
3ef0: 71 6c 69 74 65 42 74 72 65 65 42 65 67 69 6e 54  qliteBtreeBeginT
3f00: 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e  rans(db->aDb[1].
3f10: 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pBt);.      if( 
3f20: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
3f30: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53  .        sqliteS
3f40: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
3f50: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e 61  e->zErrMsg, "una
3f60: 62 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72 69  ble to get a wri
3f70: 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20  te lock on ".   
3f80: 20 20 20 20 20 20 20 22 74 68 65 20 74 65 6d 70         "the temp
3f90: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 66  orary database f
3fa0: 69 6c 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ile", 0);.      
3fb0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
3fc0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
3fd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3fe0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
3ff0: 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c  ure the new tabl
4000: 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20  e name does not 
4010: 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20  collide with an 
4020: 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e  existing.  ** in
4030: 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d  dex or table nam
4040: 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72  e.  Issue an err
4050: 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20 69 74  or message if it
4060: 20 64 6f 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   does..  **.  **
4070: 20 49 66 20 77 65 20 61 72 65 20 72 65 2d 72 65   If we are re-re
4080: 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
4090: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65  _master table be
40a0: 63 61 75 73 65 20 6f 66 20 61 20 73 63 68 65 6d  cause of a schem
40b0: 61 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20 61 6e  a.  ** change an
40c0: 64 20 61 20 6e 65 77 20 70 65 72 6d 61 6e 65 6e  d a new permanen
40d0: 74 20 74 61 62 6c 65 20 69 73 20 66 6f 75 6e 64  t table is found
40e0: 20 77 68 6f 73 65 20 6e 61 6d 65 20 63 6f 6c 6c   whose name coll
40f0: 69 64 65 73 20 77 69 74 68 0a 20 20 2a 2a 20 61  ides with.  ** a
4100: 6e 20 65 78 69 73 74 69 6e 67 20 74 65 6d 70 6f  n existing tempo
4110: 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 61 74  rary table, that
4120: 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   is not an error
4130: 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 6c 65 20  ..  */.  pTable 
4140: 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c  = sqliteFindTabl
4150: 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b  e(db, zName, 0);
4160: 0a 20 20 69 44 62 20 3d 20 69 73 54 65 6d 70 20  .  iDb = isTemp 
4170: 3f 20 31 20 3a 20 70 50 61 72 73 65 2d 3e 69 44  ? 1 : pParse->iD
4180: 62 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 21  b;.  if( pTable!
4190: 3d 30 20 26 26 20 28 70 54 61 62 6c 65 2d 3e 69  =0 && (pTable->i
41a0: 44 62 3d 3d 69 44 62 20 7c 7c 20 21 70 50 61 72  Db==iDb || !pPar
41b0: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 29 20 29 7b  se->initFlag) ){
41c0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53  .    sqliteSetNS
41d0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
41e0: 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22  ErrMsg, "table "
41f0: 2c 20 30 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70  , 0, pName->z, p
4200: 4e 61 6d 65 2d 3e 6e 2c 0a 20 20 20 20 20 20 20  Name->n,.       
4210: 20 22 20 61 6c 72 65 61 64 79 20 65 78 69 73 74   " already exist
4220: 73 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  s", 0, 0);.    s
4230: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
4240: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
4250: 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
4260: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 49 64  ;.  }.  if( (pId
4270: 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e  x = sqliteFindIn
4280: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  dex(db, zName, 0
4290: 29 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20  ))!=0 &&.       
42a0: 20 20 20 28 70 49 64 78 2d 3e 69 44 62 3d 3d 30     (pIdx->iDb==0
42b0: 20 7c 7c 20 21 70 50 61 72 73 65 2d 3e 69 6e 69   || !pParse->ini
42c0: 74 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 73 71  tFlag) ){.    sq
42d0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
42e0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
42f0: 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
4300: 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64  y an index named
4310: 20 22 2c 20 0a 20 20 20 20 20 20 20 7a 4e 61 6d   ", .       zNam
4320: 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
4330: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
4340: 6d 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  me);.    pParse-
4350: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74  >nErr++;.    ret
4360: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  urn;.  }.  pTabl
4370: 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  e = sqliteMalloc
4380: 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  ( sizeof(Table) 
4390: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
43a0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
43b0: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
43c0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
43d0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
43e0: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
43f0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  nCol = 0;.  pTab
4400: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->aCol = 0;.  
4410: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20  pTable->iPKey = 
4420: 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49  -1;.  pTable->pI
4430: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54 61 62  ndex = 0;.  pTab
4440: 6c 65 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20  le->iDb = iDb;. 
4450: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65   if( pParse->pNe
4460: 77 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65 44  wTable ) sqliteD
4470: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
4480: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
4490: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  );.  pParse->pNe
44a0: 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  wTable = pTable;
44b0: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
44c0: 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65  erating the code
44d0: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72   that will inser
44e0: 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f  t the table reco
44f0: 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65  rd into.  ** the
4500: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
4510: 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70  able.  Note in p
4520: 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20 77  articular that w
4530: 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a  e must go ahead.
4540: 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74    ** and allocat
4550: 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  e the record num
4560: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
4570: 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65  e entry now.  Be
4580: 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52  fore any.  ** PR
4590: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
45a0: 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65  QUE keywords are
45b0: 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20   parsed.  Those 
45c0: 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61  keywords will ca
45d0: 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  use.  ** indices
45e0: 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 61   to be created a
45f0: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  nd the table rec
4600: 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65  ord must come be
4610: 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69  fore the .  ** i
4620: 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20  ndices.  Hence, 
4630: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
4640: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
4650: 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
4660: 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f  d.  ** now..  */
4670: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
4680: 69 6e 69 74 46 6c 61 67 20 26 26 20 28 76 20 3d  initFlag && (v =
4690: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
46a0: 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20  Parse))!=0 ){.  
46b0: 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69    sqliteBeginWri
46c0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
46d0: 73 65 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a  se, 0, isTemp);.
46e0: 20 20 20 20 69 66 28 20 21 69 73 54 65 6d 70 20      if( !isTemp 
46f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
4700: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
4710: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 66 69 6c 65  nteger, db->file
4720: 5f 66 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20  _format, 0);.   
4730: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4740: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  Op(v, OP_SetCook
4750: 69 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d  ie, 0, 1);.    }
4760: 0a 20 20 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d  .    sqliteOpenM
4770: 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69 73  asterTable(v, is
4780: 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Temp);.    sqlit
4790: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
47a0: 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29  _NewRecno, 0, 0)
47b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
47c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
47d0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
47e0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
47f0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
4800: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
4810: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e  ddOp(v, OP_PutIn
4820: 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  tKey, 0, 0);.  }
4830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
4840: 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68  new column to th
4850: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
4860: 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
4870: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
4880: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
4890: 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f   routine once fo
48a0: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65  r each column de
48b0: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  claration.** in 
48c0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
48d0: 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74  tatement.  sqlit
48e0: 65 53 74 61 72 74 54 61 62 6c 65 28 29 20 67 65  eStartTable() ge
48f0: 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72  ts called.** fir
4900: 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73  st to get things
4910: 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68   going.  Then th
4920: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
4930: 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a  lled for each.**
4940: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64   column..*/.void
4950: 20 73 71 6c 69 74 65 41 64 64 43 6f 6c 75 6d 6e   sqliteAddColumn
4960: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
4970: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
4980: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
4990: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20   i;.  char *z = 
49a0: 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  0;.  Column *pCo
49b0: 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  l;.  if( (p = pP
49c0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
49d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
49e0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
49f0: 28 26 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70  (&z, pName->z, p
4a00: 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 69  Name->n, 0);.  i
4a10: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
4a20: 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74  ;.  sqliteDequot
4a30: 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  e(z);.  for(i=0;
4a40: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
4a50: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
4a60: 53 74 72 49 43 6d 70 28 7a 2c 20 70 2d 3e 61 43  StrICmp(z, p->aC
4a70: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ol[i].zName)==0 
4a80: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
4a90: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
4aa0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 64 75 70 6c  ->zErrMsg, "dupl
4ab0: 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  icate column nam
4ac0: 65 3a 20 22 2c 20 7a 2c 20 28 63 68 61 72 2a 29  e: ", z, (char*)
4ad0: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
4ae0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
4af0: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
4b00: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
4b10: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d   }.  }.  if( (p-
4b20: 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20  >nCol & 0x7)==0 
4b30: 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61  ){.    Column *a
4b40: 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  New;.    aNew = 
4b50: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70  sqliteRealloc( p
4b60: 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c  ->aCol, (p->nCol
4b70: 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43  +8)*sizeof(p->aC
4b80: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  ol[0]));.    if(
4b90: 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   aNew==0 ) retur
4ba0: 6e 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d  n;.    p->aCol =
4bb0: 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f   aNew;.  }.  pCo
4bc0: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
4bd0: 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nCol];.  memset(
4be0: 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCol, 0, sizeof(
4bf0: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
4c00: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b  pCol->zName = z;
4c10: 0a 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64  .  pCol->sortOrd
4c20: 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e  er = SQLITE_SO_N
4c30: 55 4d 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b  UM;.  p->nCol++;
4c40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
4c50: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
4c60: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
4c70: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
4c80: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
4c90: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
4ca0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e  statement.  A "N
4cb0: 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
4cc0: 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  int has.** been 
4cd0: 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  seen on a column
4ce0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
4cf0: 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c  sets the notNull
4d00: 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20   flag on.** the 
4d10: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
4d20: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
4d30: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
4d40: 69 74 65 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61  iteAddNotNull(Pa
4d50: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
4d60: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
4d70: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
4d80: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
4d90: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
4da0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
4db0: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66   p->nCol-1;.  if
4dc0: 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c  ( i>=0 ) p->aCol
4dd0: 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e  [i].notNull = on
4de0: 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Error;.}../*.** 
4df0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4e00: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
4e10: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
4e20: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
4e30: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
4e40: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
4e50: 20 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b    The pFirst tok
4e60: 65 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  en is the first.
4e70: 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ** token in the 
4e80: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65  sequence of toke
4e90: 6e 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ns that describe
4ea0: 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65   the type of the
4eb0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  .** column curre
4ec0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
4ed0: 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74  ruction.   pLast
4ee0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b   is the last tok
4ef0: 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71  en.** in the seq
4f00: 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73  uence.  Use this
4f10: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
4f20: 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69  construct a stri
4f30: 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61  ng.** that conta
4f40: 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65  ins the typename
4f50: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
4f60: 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74  nd store that st
4f70: 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65  ring.** in zType
4f80: 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/ .void sqlit
4f90: 65 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50  eAddColumnType(P
4fa0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
4fb0: 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b  ken *pFirst, Tok
4fc0: 65 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20 54 61  en *pLast){.  Ta
4fd0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 2c  ble *p;.  int i,
4fe0: 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63   j;.  int n;.  c
4ff0: 68 61 72 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20 20  har *z, **pz;.  
5000: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
5010: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
5020: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
5030: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
5040: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20  ->nCol-1;.  if( 
5050: 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  i<0 ) return;.  
5060: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
5070: 69 5d 3b 0a 20 20 70 7a 20 3d 20 26 70 43 6f 6c  i];.  pz = &pCol
5080: 2d 3e 7a 54 79 70 65 3b 0a 20 20 6e 20 3d 20 70  ->zType;.  n = p
5090: 4c 61 73 74 2d 3e 6e 20 2b 20 41 64 64 72 28 70  Last->n + Addr(p
50a0: 4c 61 73 74 2d 3e 7a 29 20 2d 20 41 64 64 72 28  Last->z) - Addr(
50b0: 70 46 69 72 73 74 2d 3e 7a 29 3b 0a 20 20 73 71  pFirst->z);.  sq
50c0: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70  liteSetNString(p
50d0: 7a 2c 20 70 46 69 72 73 74 2d 3e 7a 2c 20 6e 2c  z, pFirst->z, n,
50e0: 20 30 29 3b 0a 20 20 7a 20 3d 20 2a 70 7a 3b 0a   0);.  z = *pz;.
50f0: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
5100: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  urn;.  for(i=j=0
5110: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
5120: 20 20 69 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b 0a    int c = z[i];.
5130: 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65 28      if( isspace(
5140: 63 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  c) ) continue;. 
5150: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20     z[j++] = c;. 
5160: 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20   }.  z[j] = 0;. 
5170: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
5180: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
5190: 29 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 6f 72  ){.    pCol->sor
51a0: 74 4f 72 64 65 72 20 3d 20 73 71 6c 69 74 65 43  tOrder = sqliteC
51b0: 6f 6c 6c 61 74 65 54 79 70 65 28 7a 2c 20 6e 29  ollateType(z, n)
51c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
51d0: 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d  Col->sortOrder =
51e0: 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a   SQLITE_SO_NUM;.
51f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
5200: 20 67 69 76 65 6e 20 74 6f 6b 65 6e 20 69 73 20   given token is 
5210: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
5220: 65 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 63  e for the last c
5230: 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 0a 2a  olumn added to.*
5240: 2a 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  * the table curr
5250: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
5260: 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 22 6d  truction.  If "m
5270: 69 6e 75 73 46 6c 61 67 22 20 69 73 20 74 72 75  inusFlag" is tru
5280: 65 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74  e, it.** means t
5290: 68 65 20 76 61 6c 75 65 20 74 6f 6b 65 6e 20 77  he value token w
52a0: 61 73 20 70 72 65 63 65 64 65 64 20 62 79 20 61  as preceded by a
52b0: 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a   minus sign..**.
52c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
52d0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
52e0: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
52f0: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
5300: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
5310: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
5320: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
5330: 74 65 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  teAddDefaultValu
5340: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
5350: 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20 69 6e   Token *pVal, in
5360: 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20  t minusFlag){.  
5370: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
5380: 69 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b 0a  i;.  char **pz;.
5390: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
53a0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
53b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
53c0: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66   p->nCol-1;.  if
53d0: 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  ( i<0 ) return;.
53e0: 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b    pz = &p->aCol[
53f0: 69 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69 66 28 20  i].zDflt;.  if( 
5400: 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20  minusFlag ){.   
5410: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
5420: 67 28 70 7a 2c 20 22 2d 22 2c 20 31 2c 20 70 56  g(pz, "-", 1, pV
5430: 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20  al->z, pVal->n, 
5440: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
5450: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
5460: 67 28 70 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70  g(pz, pVal->z, p
5470: 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 0a  Val->n, 0);.  }.
5480: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
5490: 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  *pz);.}../*.** D
54a0: 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49  esignate the PRI
54b0: 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65  MARY KEY for the
54c0: 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69   table.  pList i
54d0: 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65  s a list of name
54e0: 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73  s .** of columns
54f0: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70   that form the p
5500: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
5510: 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74  pList is NULL, t
5520: 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20  hen the.** most 
5530: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63  recently added c
5540: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
5550: 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72  le is the primar
5560: 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  y key..**.** A t
5570: 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74  able can have at
5580: 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72   most one primar
5590: 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74  y key.  If the t
55a0: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
55b0: 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65  .** a primary ke
55c0: 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74  y (and this is t
55d0: 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72  he second primar
55e0: 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61  y key) then crea
55f0: 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a  te an.** error..
5600: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49  **.** If the PRI
5610: 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61  MARY KEY is on a
5620: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77   single column w
5630: 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73  hose datatype is
5640: 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65   INTEGER,.** the
5650: 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f  n we will try to
5660: 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e   use that column
5670: 20 61 73 20 74 68 65 20 72 6f 77 20 69 64 2e 20   as the row id. 
5680: 20 28 45 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a 20   (Exception:.** 
5690: 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f  For backwards co
56a0: 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68  mpatibility with
56b0: 20 6f 6c 64 65 72 20 64 61 74 61 62 61 73 65 73   older databases
56c0: 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  , do not do this
56d0: 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20  .** if the file 
56e0: 66 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e 20 6e  format version n
56f0: 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68  umber is less th
5700: 61 6e 20 31 2e 29 20 20 53 65 74 20 74 68 65 20  an 1.)  Set the 
5710: 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66  Table.iPKey.** f
5720: 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c  ield of the tabl
5730: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
5740: 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69  tion to be the i
5750: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49  ndex of the.** I
5760: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
5770: 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c  EY column.  Tabl
5780: 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74  e.iPKey is set t
5790: 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73  o -1 if there is
57a0: 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50  .** no INTEGER P
57b0: 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a  RIMARY KEY..**.*
57c0: 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20  * If the key is 
57d0: 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50  not an INTEGER P
57e0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e  RIMARY KEY, then
57f0: 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65   create a unique
5800: 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68  .** index for th
5810: 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78  e key.  No index
5820: 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20   is created for 
5830: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
5840: 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  KEYs..*/.void sq
5850: 6c 69 74 65 41 64 64 50 72 69 6d 61 72 79 4b 65  liteAddPrimaryKe
5860: 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
5870: 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20   IdList *pList, 
5880: 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20  int onError){.  
5890: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50  Table *pTab = pP
58a0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
58b0: 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d  .  char *zType =
58c0: 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d   0;.  int iCol =
58d0: 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70 54   -1, i;.  if( pT
58e0: 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 69  ab==0 ) goto pri
58f0: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
5900: 20 69 66 28 20 70 54 61 62 2d 3e 68 61 73 50 72   if( pTab->hasPr
5910: 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  imKey ){.    sql
5920: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
5930: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
5940: 74 61 62 6c 65 20 5c 22 22 2c 20 70 54 61 62 2d  table \"", pTab-
5950: 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  >zName, .       
5960: 20 22 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68   "\" has more th
5970: 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b  an one primary k
5980: 65 79 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ey", (char*)0);.
5990: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
59a0: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69  ++;.    goto pri
59b0: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
59c0: 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73 50 72   }.  pTab->hasPr
59d0: 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66 28  imKey = 1;.  if(
59e0: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
59f0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43   iCol = pTab->nC
5a00: 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62  ol - 1;.    pTab
5a10: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50  ->aCol[iCol].isP
5a20: 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65  rimKey = 1;.  }e
5a30: 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
5a40: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
5a50: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  i++){.      for(
5a60: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
5a70: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
5a80: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
5a90: 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73  liteStrICmp(pLis
5aa0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70  t->a[i].zName, p
5ab0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
5ac0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  zName)==0 ) brea
5ad0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5ae0: 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e   if( iCol<pTab->
5af0: 6e 43 6f 6c 20 29 20 70 54 61 62 2d 3e 61 43 6f  nCol ) pTab->aCo
5b00: 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65  l[iCol].isPrimKe
5b10: 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 1;.    }.   
5b20: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3e   if( pList->nId>
5b30: 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20  1 ) iCol = -1;. 
5b40: 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30   }.  if( iCol>=0
5b50: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
5b60: 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  Col ){.    zType
5b70: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
5b80: 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20  ol].zType;.  }. 
5b90: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
5ba0: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 31 20  >file_format>=1 
5bb0: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 7a  && .           z
5bc0: 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 53 74  Type && sqliteSt
5bd0: 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e  rICmp(zType, "IN
5be0: 54 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20  TEGER")==0 ){.  
5bf0: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
5c00: 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e  iCol;.    pTab->
5c10: 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f  keyConf = onErro
5c20: 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  r;.  }else{.    
5c30: 73 71 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65  sqliteCreateInde
5c40: 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  x(pParse, 0, 0, 
5c50: 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20  pList, onError, 
5c60: 30 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73 74  0, 0);.    pList
5c70: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61   = 0;.  }..prima
5c80: 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73  ry_key_exit:.  s
5c90: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
5ca0: 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  e(pList);.  retu
5cb0: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rn;.}../*.** Ret
5cc0: 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
5cd0: 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 74 79  ate collating ty
5ce0: 70 65 20 67 69 76 65 6e 20 61 20 74 79 70 65 20  pe given a type 
5cf0: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  name..**.** The 
5d00: 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 69  collation type i
5d10: 73 20 74 65 78 74 20 28 53 51 4c 49 54 45 5f 53  s text (SQLITE_S
5d20: 4f 5f 54 45 58 54 29 20 69 66 20 74 68 65 20 74  O_TEXT) if the t
5d30: 79 70 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f 6e 74  ype.** name cont
5d40: 61 69 6e 73 20 74 68 65 20 63 68 61 72 61 63 74  ains the charact
5d50: 65 72 20 73 74 72 65 61 6d 20 22 74 65 78 74 22  er stream "text"
5d60: 20 6f 72 20 22 62 6c 6f 62 22 20 6f 72 0a 2a 2a   or "blob" or.**
5d70: 20 22 63 6c 6f 62 22 2e 20 20 41 6e 79 20 6f 74   "clob".  Any ot
5d80: 68 65 72 20 74 79 70 65 20 6e 61 6d 65 20 69 73  her type name is
5d90: 20 63 6f 6c 6c 61 74 65 64 20 61 73 20 6e 75 6d   collated as num
5da0: 65 72 69 63 0a 2a 2a 20 28 53 51 4c 49 54 45 5f  eric.** (SQLITE_
5db0: 53 4f 5f 4e 55 4d 29 2e 0a 2a 2f 0a 69 6e 74 20  SO_NUM)..*/.int 
5dc0: 73 71 6c 69 74 65 43 6f 6c 6c 61 74 65 54 79 70  sqliteCollateTyp
5dd0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  e(const char *zT
5de0: 79 70 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b  ype, int nType){
5df0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5e00: 69 3d 30 3b 20 69 3c 6e 54 79 70 65 2d 31 3b 20  i=0; i<nType-1; 
5e10: 69 2b 2b 29 7b 0a 20 20 20 20 73 77 69 74 63 68  i++){.    switch
5e20: 28 20 7a 54 79 70 65 5b 69 5d 20 29 7b 0a 20 20  ( zType[i] ){.  
5e30: 20 20 20 20 63 61 73 65 20 27 62 27 3a 0a 20 20      case 'b':.  
5e40: 20 20 20 20 63 61 73 65 20 27 42 27 3a 20 7b 0a      case 'B': {.
5e50: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 54          if( i<nT
5e60: 79 70 65 2d 33 20 26 26 20 73 71 6c 69 74 65 53  ype-3 && sqliteS
5e70: 74 72 4e 49 43 6d 70 28 26 7a 54 79 70 65 5b 69  trNICmp(&zType[i
5e80: 5d 2c 22 62 6c 6f 62 22 2c 34 29 3d 3d 30 20 29  ],"blob",4)==0 )
5e90: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
5ea0: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58  rn SQLITE_SO_TEX
5eb0: 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
5ec0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5ed0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 27    }.      case '
5ee0: 63 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20 27  c':.      case '
5ef0: 43 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  C': {.        if
5f00: 28 20 69 3c 6e 54 79 70 65 2d 33 20 26 26 20 28  ( i<nType-3 && (
5f10: 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 26  sqliteStrNICmp(&
5f20: 7a 54 79 70 65 5b 69 5d 2c 22 63 68 61 72 22 2c  zType[i],"char",
5f30: 34 29 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20  4)==0 ||.       
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f50: 20 20 20 20 73 71 6c 69 74 65 53 74 72 4e 49 43      sqliteStrNIC
5f60: 6d 70 28 26 7a 54 79 70 65 5b 69 5d 2c 22 63 6c  mp(&zType[i],"cl
5f70: 6f 62 22 2c 34 29 3d 3d 30 29 0a 20 20 20 20 20  ob",4)==0).     
5f80: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
5f90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f  return SQLITE_SO
5fa0: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 20 20 7d  _TEXT;.        }
5fb0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5fc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
5fd0: 73 65 20 27 78 27 3a 0a 20 20 20 20 20 20 63 61  se 'x':.      ca
5fe0: 73 65 20 27 58 27 3a 20 7b 0a 20 20 20 20 20 20  se 'X': {.      
5ff0: 20 20 69 66 28 20 69 3e 3d 32 20 26 26 20 73 71    if( i>=2 && sq
6000: 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 26 7a 54  liteStrNICmp(&zT
6010: 79 70 65 5b 69 2d 32 5d 2c 22 74 65 78 74 22 2c  ype[i-2],"text",
6020: 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  4)==0 ){.       
6030: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6040: 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 20 20  _SO_TEXT;.      
6050: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
6060: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
6070: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
6080: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6090: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
60a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f  eturn SQLITE_SO_
60b0: 4e 55 4d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  NUM;.}../*.** Th
60c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
60d0: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
60e0: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
60f0: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
6100: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
6110: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
6120: 41 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75  A "COLLATE" clau
6130: 73 65 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73  se has.** been s
6140: 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e  een on a column.
6150: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
6160: 65 74 73 20 74 68 65 20 43 6f 6c 75 6d 6e 2e 73  ets the Column.s
6170: 6f 72 74 4f 72 64 65 72 20 6f 6e 0a 2a 2a 20 74  ortOrder on.** t
6180: 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e  he column curren
6190: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
61a0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
61b0: 73 71 6c 69 74 65 41 64 64 43 6f 6c 6c 61 74 65  sqliteAddCollate
61c0: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
61d0: 73 65 2c 20 69 6e 74 20 63 6f 6c 6c 54 79 70 65  se, int collType
61e0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
61f0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70   int i;.  if( (p
6200: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
6210: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
6220: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
6230: 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29  -1;.  if( i>=0 )
6240: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 73 6f 72 74   p->aCol[i].sort
6250: 4f 72 64 65 72 20 3d 20 63 6f 6c 6c 54 79 70 65  Order = collType
6260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 65 20  ;.}../*.** Come 
6270: 75 70 20 77 69 74 68 20 61 20 6e 65 77 20 72 61  up with a new ra
6280: 6e 64 6f 6d 20 76 61 6c 75 65 20 66 6f 72 20 74  ndom value for t
6290: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
62a0: 2e 20 20 4d 61 6b 65 20 73 75 72 65 0a 2a 2a 20  .  Make sure.** 
62b0: 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69 73  the new value is
62c0: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
62d0: 74 68 65 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54  the old..**.** T
62e0: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
62f0: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
6300: 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73  rmine when the s
6310: 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a  chema for the.**
6320: 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
6330: 73 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73  s.  After each s
6340: 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68  chema change, th
6350: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a  e cookie value.*
6360: 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e  * changes.  When
6370: 20 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74   a process first
6380: 20 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d   reads the schem
6390: 61 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65  a it records the
63a0: 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65  .** cookie.  The
63b0: 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65  reafter, wheneve
63c0: 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63  r it goes to acc
63d0: 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
63e0: 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74  ,.** it checks t
63f0: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b  he cookie to mak
6400: 65 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d  e sure the schem
6410: 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65  a has not change
6420: 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61  d.** since it wa
6430: 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a  s last read..**.
6440: 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20  ** This plan is 
6450: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62  not completely b
6460: 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74  ullet-proof.  It
6470: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
6480: 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74  .** the schema t
6490: 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c  o change multipl
64a0: 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20  e times and for 
64b0: 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65  the cookie to be
64c0: 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20  .** set back to 
64d0: 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75  prior value.  Bu
64e0: 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  t schema changes
64f0: 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a   are infrequent.
6500: 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61  ** and the proba
6510: 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e  bility of hittin
6520: 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69  g the same cooki
6530: 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a  e value is only.
6540: 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32  ** 1 chance in 2
6550: 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73  ^32.  So we're s
6560: 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76  afe enough..*/.v
6570: 6f 69 64 20 73 71 6c 69 74 65 43 68 61 6e 67 65  oid sqliteChange
6580: 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 20 2a 64  Cookie(sqlite *d
6590: 62 2c 20 56 64 62 65 20 2a 76 29 7b 0a 20 20 69  b, Vdbe *v){.  i
65a0: 66 28 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b  f( db->next_cook
65b0: 69 65 3d 3d 64 62 2d 3e 61 44 62 5b 30 5d 2e 73  ie==db->aDb[0].s
65c0: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 29 7b 0a  chema_cookie ){.
65d0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
65e0: 72 20 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 52  r r;.    sqliteR
65f0: 61 6e 64 6f 6d 6e 65 73 73 28 31 2c 20 26 72 29  andomness(1, &r)
6600: 3b 0a 20 20 20 20 64 62 2d 3e 6e 65 78 74 5f 63  ;.    db->next_c
6610: 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 61 44 62 5b  ookie = db->aDb[
6620: 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  0].schema_cookie
6630: 20 2b 20 72 20 2b 20 31 3b 0a 20 20 20 20 64 62   + r + 1;.    db
6640: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
6650: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
6660: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
6670: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
6680: 65 72 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f  er, db->next_coo
6690: 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  kie, 0);.    sql
66a0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
66b0: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c  OP_SetCookie, 0,
66c0: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
66d0: 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75  * Measure the nu
66e0: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
66f0: 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74  rs needed to out
6700: 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  put the given.**
6710: 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68   identifier.  Th
6720: 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
6730: 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71  d includes any q
6740: 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75  uotes used.** bu
6750: 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75  t does not inclu
6760: 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d  de the null term
6770: 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  inator..*/.stati
6780: 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74  c int identLengt
6790: 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  h(const char *z)
67a0: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  {.  int n;.  int
67b0: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 30 3b 0a   needQuote = 0;.
67c0: 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e    for(n=0; *z; n
67d0: 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, z++){.    if
67e0: 28 20 2a 7a 3d 3d 27 5c 27 27 20 29 7b 20 6e 2b  ( *z=='\'' ){ n+
67f0: 2b 3b 20 6e 65 65 64 51 75 6f 74 65 3d 31 3b 20  +; needQuote=1; 
6800: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
6810: 20 2b 20 6e 65 65 64 51 75 6f 74 65 2a 32 3b 0a   + needQuote*2;.
6820: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
6830: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74  n identifier ont
6840: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
6850: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20   given string.  
6860: 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61  Add.** quote cha
6870: 72 61 63 74 65 72 73 20 61 73 20 6e 65 65 64 65  racters as neede
6880: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
6890: 64 20 69 64 65 6e 74 50 75 74 28 63 68 61 72 20  d identPut(char 
68a0: 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63  *z, int *pIdx, c
68b0: 68 61 72 20 2a 7a 49 64 65 6e 74 29 7b 0a 20 20  har *zIdent){.  
68c0: 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75  int i, j, needQu
68d0: 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78  ote;.  i = *pIdx
68e0: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
68f0: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
6900: 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a    if( !isalnum(z
6910: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
6920: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
6930: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
6940: 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a  uote =  zIdent[j
6950: 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28  ]!=0 || isdigit(
6960: 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20  zIdent[0]).     
6970: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
6980: 73 71 6c 69 74 65 4b 65 79 77 6f 72 64 43 6f 64  sqliteKeywordCod
6990: 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b  e(zIdent, j)!=TK
69a0: 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64 51  _ID;.  if( needQ
69b0: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
69c0: 27 5c 27 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  '\'';.  for(j=0;
69d0: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
69e0: 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a  {.    z[i++] = z
69f0: 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66  Ident[j];.    if
6a00: 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 5c 27  ( zIdent[j]=='\'
6a10: 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27  ' ) z[i++] = '\'
6a20: 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65  ';.  }.  if( nee
6a30: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
6a40: 3d 20 27 5c 27 27 3b 0a 20 20 7a 5b 69 5d 20 3d  = '\'';.  z[i] =
6a50: 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b   0;.  *pIdx = i;
6a60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
6a70: 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  te a CREATE TABL
6a80: 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72  E statement appr
6a90: 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
6aa0: 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20  given.** table. 
6ab0: 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20   Memory to hold 
6ac0: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  the text of the 
6ad0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74  statement is obt
6ae0: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71  ained.** from sq
6af0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
6b00: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
6b10: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
6b20: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
6b30: 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61  c char *createTa
6b40: 62 6c 65 53 74 6d 74 28 54 61 62 6c 65 20 2a 70  bleStmt(Table *p
6b50: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e  ){.  int i, k, n
6b60: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b  ;.  char *zStmt;
6b70: 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a  .  char *zSep, *
6b80: 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20  zSep2, *zEnd;.  
6b90: 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  n = 0;.  for(i=0
6ba0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
6bb0: 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e  ){.    n += iden
6bc0: 74 4c 65 6e 67 74 68 28 70 2d 3e 61 43 6f 6c 5b  tLength(p->aCol[
6bd0: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
6be0: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
6bf0: 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  h(p->zName);.  i
6c00: 66 28 20 6e 3c 34 30 20 29 7b 0a 20 20 20 20 7a  f( n<40 ){.    z
6c10: 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53  Sep = "";.    zS
6c20: 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a  ep2 = ",";.    z
6c30: 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c  End = ")";.  }el
6c40: 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  se{.    zSep = "
6c50: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32  \n  ";.    zSep2
6c60: 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20   = ",\n  ";.    
6c70: 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20  zEnd = "\n)";.  
6c80: 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a  }.  n += 35 + 6*
6c90: 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74  p->nCol;.  zStmt
6ca0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
6cb0: 61 77 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a  aw( n );.  if( z
6cc0: 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  Stmt==0 ) return
6cd0: 20 30 3b 0a 20 20 73 74 72 63 70 79 28 7a 53 74   0;.  strcpy(zSt
6ce0: 6d 74 2c 20 70 2d 3e 69 44 62 3d 3d 31 20 3f 20  mt, p->iDb==1 ? 
6cf0: 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42  "CREATE TEMP TAB
6d00: 4c 45 20 22 20 3a 20 22 43 52 45 41 54 45 20 54  LE " : "CREATE T
6d10: 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73  ABLE ");.  k = s
6d20: 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20  trlen(zStmt);.  
6d30: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
6d40: 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  &k, p->zName);. 
6d50: 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28   zStmt[k++] = '(
6d60: 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ';.  for(i=0; i<
6d70: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
6d80: 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74     strcpy(&zStmt
6d90: 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20  [k], zSep);.    
6da0: 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74  k += strlen(&zSt
6db0: 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70  mt[k]);.    zSep
6dc0: 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64   = zSep2;.    id
6dd0: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
6de0: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  , p->aCol[i].zNa
6df0: 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 74 72 63 70  me);.  }.  strcp
6e00: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e  y(&zStmt[k], zEn
6e10: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74  d);.  return zSt
6e20: 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  mt;.}../*.** Thi
6e30: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
6e40: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
6e50: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
6e60: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
6e70: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
6e80: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
6e90: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
6ea0: 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63  re that other ac
6eb0: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61  tion routines ha
6ec0: 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67  ve been building
6ed0: 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
6ee0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  the internal has
6ef0: 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69  h tables, assumi
6f00: 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76  ng no errors hav
6f10: 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a  e.** occurred..*
6f20: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f  *.** An entry fo
6f30: 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d  r the table is m
6f40: 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ade in the maste
6f50: 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c  r table on disk,
6f60: 0a 2a 2a 20 75 6e 6c 65 73 73 20 74 68 69 73 20  .** unless this 
6f70: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
6f80: 61 62 6c 65 20 6f 72 20 69 6e 69 74 46 6c 61 67  able or initFlag
6f90: 3d 3d 31 2e 20 20 57 68 65 6e 20 69 6e 69 74 46  ==1.  When initF
6fa0: 6c 61 67 3d 3d 31 2c 0a 2a 2a 20 69 74 20 6d 65  lag==1,.** it me
6fb0: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
6fc0: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
6fd0: 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75  ster table becau
6fe0: 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f  se we just.** co
6ff0: 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64  nnected to the d
7000: 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75  atabase or becau
7010: 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  se the sqlite_ma
7020: 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a  ster table has.*
7030: 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67  * recently chang
7040: 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79  es, so the entry
7050: 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
7060: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
7070: 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f  n.** the sqlite_
7080: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57  master table.  W
7090: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
70a0: 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e   create it again
70b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
70c0: 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20  Select argument 
70d0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
70e0: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
70f0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63  routine.** was c
7100: 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
7110: 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  a table generate
7120: 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52  d from a .** "CR
7130: 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41  EATE TABLE ... A
7140: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74  S SELECT ..." st
7150: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f  atement.  The co
7160: 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a  lumn names of.**
7170: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77   the new table w
7180: 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65  ill match the re
7190: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
71a0: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
71b0: 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 50  sqliteEndTable(P
71c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
71d0: 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65 6c 65 63  ken *pEnd, Selec
71e0: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
71f0: 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74  able *p;.  sqlit
7200: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
7210: 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64  db;..  if( (pEnd
7220: 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d  ==0 && pSelect==
7230: 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  0) || pParse->nE
7240: 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c  rr || sqlite_mal
7250: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
7260: 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  urn;.  p = pPars
7270: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
7280: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
7290: 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  n;..  /* If the 
72a0: 74 61 62 6c 65 20 69 73 20 67 65 6e 65 72 61 74  table is generat
72b0: 65 64 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54  ed from a SELECT
72c0: 2c 20 74 68 65 6e 20 63 6f 6e 73 74 72 75 63 74  , then construct
72d0: 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 20 6f   the.  ** list o
72e0: 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68  f columns and th
72f0: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 74 61  e text of the ta
7300: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
7310: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 54  pSelect ){.    T
7320: 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 20 3d 20  able *pSelTab = 
7330: 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f  sqliteResultSetO
7340: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
7350: 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  0, pSelect);.   
7360: 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20   if( pSelTab==0 
7370: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 61 73  ) return;.    as
7380: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30  sert( p->aCol==0
7390: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 20   );.    p->nCol 
73a0: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
73b0: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70  .    p->aCol = p
73c0: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
73d0: 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
73e0: 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  = 0;.    pSelTab
73f0: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
7400: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
7410: 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20  e(0, pSelTab);. 
7420: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
7430: 69 6e 69 74 46 6c 61 67 20 69 73 20 31 20 69 74  initFlag is 1 it
7440: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
7450: 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66  ading the SQL of
7460: 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69  f the.  ** "sqli
7470: 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73  te_master" or "s
7480: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
7490: 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  r" table on the 
74a0: 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f  disk..  ** So do
74b0: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
74c0: 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45  e disk again.  E
74d0: 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20  xtract the root 
74e0: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
74f0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66   for the table f
7500: 72 6f 6d 20 74 68 65 20 70 50 61 72 73 65 2d 3e  rom the pParse->
7510: 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20  newTnum field.  
7520: 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72  (The page number
7530: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76  .  ** should hav
7540: 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65  e been put there
7550: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70   by the sqliteOp
7560: 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20  enCb routine.). 
7570: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
7580: 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20  ->initFlag ){.  
7590: 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 70 50 61 72    p->tnum = pPar
75a0: 73 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d  se->newTnum;.  }
75b0: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e  ..  /* If not in
75c0: 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e  itializing, then
75d0: 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64   create a record
75e0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
75f0: 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53  le.  ** in the S
7600: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
7610: 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  le of the databa
7620: 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64 20  se.  The record 
7630: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
7640: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65 6e  the new table en
7650: 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  try should alrea
7660: 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74 61  dy be on the sta
7670: 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ck..  **.  ** If
7680: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f   this is a TEMPO
7690: 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74  RARY table, writ
76a0: 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f  e the entry into
76b0: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20   the auxiliary. 
76c0: 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64   ** file instead
76d0: 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   of into the mai
76e0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
76f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
7700: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b  rse->initFlag ){
7710: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
7720: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20 76 20  Vdbe *v;..    v 
7730: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
7740: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
7750: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
7760: 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65      if( p->pSele
7770: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ct==0 ){.      /
7780: 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c  * A regular tabl
7790: 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
77a0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
77b0: 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 30 2c  _CreateTable, 0,
77c0: 20 70 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20   p->iDb);.      
77d0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
77e0: 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20  P3(v, -1, (char 
77f0: 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50  *)&p->tnum, P3_P
7800: 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d 65 6c  OINTER);.    }el
7810: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76  se{.      /* A v
7820: 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  iew */.      sql
7830: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
7840: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30  OP_Integer, 0, 0
7850: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  );.    }.    p->
7860: 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 73 71  tnum = 0;.    sq
7870: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7880: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
7890: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
78a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
78b0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  g, 0, 0);.    if
78c0: 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ( p->pSelect==0 
78d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
78e0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
78f0: 31 2c 20 22 74 61 62 6c 65 22 2c 20 50 33 5f 53  1, "table", P3_S
7900: 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 65 6c 73  TATIC);.    }els
7910: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  e{.      sqliteV
7920: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
7930: 31 2c 20 22 76 69 65 77 22 2c 20 50 33 5f 53 54  1, "view", P3_ST
7940: 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ATIC);.    }.   
7950: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7960: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
7970: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
7980: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
7990: 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33  -1, p->zName, P3
79a0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
79b0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
79c0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
79d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
79e0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
79f0: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54   p->zName, P3_ST
7a00: 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
7a10: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
7a20: 5f 44 75 70 2c 20 34 2c 20 30 29 3b 0a 20 20 20  _Dup, 4, 0);.   
7a30: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7a40: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
7a50: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53  , 0);.    if( pS
7a60: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63  elect ){.      c
7a70: 68 61 72 20 2a 7a 20 3d 20 63 72 65 61 74 65 54  har *z = createT
7a80: 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20 20 20  ableStmt(p);.   
7a90: 20 20 20 6e 20 3d 20 7a 20 3f 20 73 74 72 6c 65     n = z ? strle
7aa0: 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 20 20 20 20  n(z) : 0;.      
7ab0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
7ac0: 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b  P3(v, -1, z, n);
7ad0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
7ae0: 65 28 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(z);.    }else{
7af0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
7b00: 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  End!=0 );.      
7b10: 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a  n = Addr(pEnd->z
7b20: 29 20 2d 20 41 64 64 72 28 70 50 61 72 73 65 2d  ) - Addr(pParse-
7b30: 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 29 20  >sFirstToken.z) 
7b40: 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  + 1;.      sqlit
7b50: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
7b60: 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 73 46 69   -1, pParse->sFi
7b70: 72 73 74 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a  rstToken.z, n);.
7b80: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7b90: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7ba0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30  MakeRecord, 5, 0
7bb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
7bc0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
7bd0: 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20  IntKey, 0, 0);. 
7be0: 20 20 20 69 66 28 20 21 70 2d 3e 69 44 62 20 29     if( !p->iDb )
7bf0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43 68  {.      sqliteCh
7c00: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
7c10: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
7c20: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
7c30: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
7c40: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
7c50: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7c60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7c70: 49 6e 74 65 67 65 72 2c 20 70 2d 3e 69 44 62 2c  Integer, p->iDb,
7c80: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
7c90: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
7ca0: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 30  _OpenWrite, 1, 0
7cb0: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
7cc0: 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20  >nTab = 2;.     
7cd0: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50   sqliteSelect(pP
7ce0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 53  arse, pSelect, S
7cf0: 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30 2c 20  RT_Table, 1, 0, 
7d00: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
7d10: 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
7d20: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
7d30: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
7d40: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65  the table to the
7d50: 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
7d60: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
7d70: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
7d80: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
7d90: 70 6c 61 69 6e 3d 3d 30 20 26 26 20 70 50 61 72  plain==0 && pPar
7da0: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
7db0: 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a     Table *pOld;.
7dc0: 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b      FKey *pFKey;
7dd0: 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  .    pOld = sqli
7de0: 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  teHashInsert(&db
7df0: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 74 62  ->aDb[p->iDb].tb
7e00: 6c 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20  lHash, .        
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e20: 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74      p->zName, st
7e30: 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31  rlen(p->zName)+1
7e40: 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  , p);.    if( pO
7e50: 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ld ){.      asse
7e60: 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20  rt( p==pOld );  
7e70: 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
7e80: 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64  ave failed insid
7e90: 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a  e HashInsert() *
7ea0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  /.      return;.
7eb0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 46      }.    for(pF
7ec0: 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46  Key=p->pFKey; pF
7ed0: 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79  Key; pFKey=pFKey
7ee0: 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20  ->pNextFrom){.  
7ef0: 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74      int nTo = st
7f00: 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29  rlen(pFKey->zTo)
7f10: 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 4b 65   + 1;.      pFKe
7f20: 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c  y->pNextTo = sql
7f30: 69 74 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d  iteHashFind(&db-
7f40: 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61 46 4b  >aDb[p->iDb].aFK
7f50: 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20  ey, pFKey->zTo, 
7f60: 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nTo);.      sqli
7f70: 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  teHashInsert(&db
7f80: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61 46  ->aDb[p->iDb].aF
7f90: 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c  Key, pFKey->zTo,
7fa0: 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20   nTo, pFKey);.  
7fb0: 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
7fc0: 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20  pNewTable = 0;. 
7fd0: 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b     db->nTable++;
7fe0: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
7ff0: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
8000: 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f  hanges;.  }.}../
8010: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20  *.** The parser 
8020: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
8030: 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ne in order to c
8040: 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57  reate a new VIEW
8050: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43  .*/.void sqliteC
8060: 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72  reateView(.  Par
8070: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
8080: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
8090: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
80a0: 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f  n *pBegin,     /
80b0: 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
80c0: 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
80d0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
80e0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
80f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
8100: 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
8110: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
8120: 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  w */.  Select *p
8130: 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53  Select,   /* A S
8140: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
8150: 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
8160: 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f   the new view */
8170: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 20 20  .  int isTemp   
8180: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f        /* TRUE fo
8190: 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69  r a TEMPORARY vi
81a0: 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ew */.){.  Table
81b0: 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20   *p;.  int n;.  
81c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
81d0: 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44   Token sEnd;.  D
81e0: 62 46 69 78 65 72 20 73 46 69 78 3b 0a 0a 20 20  bFixer sFix;..  
81f0: 73 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c 65  sqliteStartTable
8200: 28 70 50 61 72 73 65 2c 20 70 42 65 67 69 6e 2c  (pParse, pBegin,
8210: 20 70 4e 61 6d 65 2c 20 69 73 54 65 6d 70 2c 20   pName, isTemp, 
8220: 31 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  1);.  p = pParse
8230: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
8240: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73  f( p==0 || pPars
8250: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73  e->nErr ){.    s
8260: 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74  qliteSelectDelet
8270: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  e(pSelect);.    
8280: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
8290: 28 20 73 71 6c 69 74 65 46 69 78 49 6e 69 74 28  ( sqliteFixInit(
82a0: 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 70  &sFix, pParse, p
82b0: 2d 3e 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70  ->iDb, "view", p
82c0: 4e 61 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c  Name).    && sql
82d0: 69 74 65 46 69 78 53 65 6c 65 63 74 28 26 73 46  iteFixSelect(&sF
82e0: 69 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29  ix, pSelect).  )
82f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65  {.    sqliteSele
8300: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
8310: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
8320: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20   }..  /* Make a 
8330: 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69  copy of the enti
8340: 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  re SELECT statem
8350: 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
8360: 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20   the view..  ** 
8370: 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20  This will force 
8380: 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b  all the Expr.tok
8390: 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62  en.z values to b
83a0: 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20  e dynamically.  
83b0: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74  ** allocated rat
83c0: 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74  her than point t
83d0: 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  o the input stri
83e0: 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73  ng - which means
83f0: 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20   that.  ** they 
8400: 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74  will persist aft
8410: 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  er the current s
8420: 71 6c 69 74 65 5f 65 78 65 63 28 29 20 63 61 6c  qlite_exec() cal
8430: 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a  l returns..  */.
8440: 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73    p->pSelect = s
8450: 71 6c 69 74 65 53 65 6c 65 63 74 44 75 70 28 70  qliteSelectDup(p
8460: 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74  Select);.  sqlit
8470: 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  eSelectDelete(pS
8480: 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 21 70  elect);.  if( !p
8490: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20  Parse->initFlag 
84a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 69 65  ){.    sqliteVie
84b0: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
84c0: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a  pParse, p);.  }.
84d0: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
84e0: 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41   end of the CREA
84f0: 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e  TE VIEW statemen
8500: 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f  t.  Make sEnd po
8510: 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  int to.  ** the 
8520: 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64  end..  */.  sEnd
8530: 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74   = pParse->sLast
8540: 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e  Token;.  if( sEn
8550: 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e  d.z[0]!=0 && sEn
8560: 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20  d.z[0]!=';' ){. 
8570: 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e     sEnd.z += sEn
8580: 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e  d.n;.  }.  sEnd.
8590: 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 28 69  n = 0;.  n = ((i
85a0: 6e 74 29 73 45 6e 64 2e 7a 29 20 2d 20 28 69 6e  nt)sEnd.z) - (in
85b0: 74 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a  t)pBegin->z;.  z
85c0: 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20   = pBegin->z;.  
85d0: 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a  while( n>0 && (z
85e0: 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73  [n-1]==';' || is
85f0: 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29  space(z[n-1])) )
8600: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e  { n--; }.  sEnd.
8610: 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73  z = &z[n-1];.  s
8620: 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a  End.n = 1;..  /*
8630: 20 55 73 65 20 73 71 6c 69 74 65 45 6e 64 54 61   Use sqliteEndTa
8640: 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68 65  ble() to add the
8650: 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c   view to the SQL
8660: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
8670: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 45 6e 64 54   */.  sqliteEndT
8680: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 26 73 45  able(pParse, &sE
8690: 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  nd, 0);.  return
86a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54  ;.}../*.** The T
86b0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70  able structure p
86c0: 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20  Table is really 
86d0: 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e  a VIEW.  Fill in
86e0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a   the names of.**
86f0: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
8700: 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20  the view in the 
8710: 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65  pTable structure
8720: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
8730: 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72  mber.** of error
8740: 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  s.  If an error 
8750: 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e  is seen leave an
8760: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
8770: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
8780: 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
8790: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
87a0: 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
87b0: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
87c0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  {.  ExprList *pE
87d0: 4c 69 73 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  List;.  Select *
87e0: 70 53 65 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70  pSel;.  Table *p
87f0: 53 65 6c 54 61 62 3b 0a 20 20 69 6e 74 20 6e 45  SelTab;.  int nE
8800: 72 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  rr = 0;..  asser
8810: 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 20 20  t( pTable );..  
8820: 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43  /* A positive nC
8830: 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c  ol means the col
8840: 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74  umns names for t
8850: 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a  his view are.  *
8860: 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e  * already known.
8870: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
8880: 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74  le->nCol>0 ) ret
8890: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e  urn 0;..  /* A n
88a0: 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20  egative nCol is 
88b0: 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72  a special marker
88c0: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65   meaning that we
88d0: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20   are currently. 
88e0: 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f   ** trying to co
88f0: 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e  mpute the column
8900: 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65   names.  If we e
8910: 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  nter this routin
8920: 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65  e with.  ** a ne
8930: 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20  gative nCol, it 
8940: 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72  means two or mor
8950: 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c  e views form a l
8960: 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  oop, like this:.
8970: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52    **.  **     CR
8980: 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53  EATE VIEW one AS
8990: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
89a0: 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  wo;.  **     CRE
89b0: 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20  ATE VIEW two AS 
89c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e  SELECT * FROM on
89d0: 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74  e;.  **.  ** Act
89e0: 75 61 6c 6c 79 2c 20 74 68 69 73 20 65 72 72 6f  ually, this erro
89f0: 72 20 69 73 20 63 61 75 67 68 74 20 70 72 65 76  r is caught prev
8a00: 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20 74 68  iously and so th
8a10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
8a20: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77  .  ** should alw
8a30: 61 79 73 20 66 61 69 6c 2e 20 20 42 75 74 20 77  ays fail.  But w
8a40: 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 69 74 20  e will leave it 
8a50: 69 6e 20 70 6c 61 63 65 20 6a 75 73 74 20 74 6f  in place just to
8a60: 20 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20   be safe..  */. 
8a70: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
8a80: 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  l<0 ){.    sqlit
8a90: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
8aa0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 76 69  se->zErrMsg, "vi
8ab0: 65 77 20 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  ew ", pTable->zN
8ac0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 22 20  ame,.         " 
8ad0: 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65  is circularly de
8ae0: 66 69 6e 65 64 22 2c 20 28 63 68 61 72 2a 29 30  fined", (char*)0
8af0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
8b00: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
8b10: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 1;.  }..  /* I
8b20: 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
8b30: 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e  r, it means we n
8b40: 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
8b50: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a  he table names..
8b60: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
8b70: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29  Table->pSelect )
8b80: 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c  ; /* If nCol==0,
8b90: 20 74 68 65 6e 20 70 54 61 62 6c 65 20 6d 75 73   then pTable mus
8ba0: 74 20 62 65 20 61 20 56 49 45 57 20 2a 2f 0a 20  t be a VIEW */. 
8bb0: 20 70 53 65 6c 20 3d 20 70 54 61 62 6c 65 2d 3e   pSel = pTable->
8bc0: 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e  pSelect;..  /* N
8bd0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c  ote that the cal
8be0: 6c 20 74 6f 20 73 71 6c 69 74 65 52 65 73 75 6c  l to sqliteResul
8bf0: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77  tSetOfSelect() w
8c00: 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20  ill expand any. 
8c10: 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73   ** "*" elements
8c20: 20 69 6e 20 74 68 69 73 20 6c 69 73 74 2e 20 20   in this list.  
8c30: 42 75 74 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  But we will need
8c40: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
8c50: 6c 69 73 74 0a 20 20 2a 2a 20 62 61 63 6b 20 74  list.  ** back t
8c60: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
8c70: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 66 74  onfiguration aft
8c80: 65 72 77 61 72 64 73 2c 20 73 6f 20 77 65 20 73  erwards, so we s
8c90: 61 76 65 20 61 20 63 6f 70 79 20 6f 66 0a 20 20  ave a copy of.  
8ca0: 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** the original 
8cb0: 69 6e 20 70 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a  in pEList..  */.
8cc0: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 2d    pEList = pSel-
8cd0: 3e 70 45 4c 69 73 74 3b 0a 20 20 70 53 65 6c 2d  >pEList;.  pSel-
8ce0: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
8cf0: 45 78 70 72 4c 69 73 74 44 75 70 28 70 45 4c 69  ExprListDup(pELi
8d00: 73 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 2d  st);.  if( pSel-
8d10: 3e 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  >pEList==0 ){.  
8d20: 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d    pSel->pEList =
8d30: 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 72 65 74   pEList;.    ret
8d40: 75 72 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  urn 1;  /* Mallo
8d50: 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a  c failed */.  }.
8d60: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
8d70: 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d   -1;.  pSelTab =
8d80: 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74   sqliteResultSet
8d90: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
8da0: 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 69 66 28   0, pSel);.  if(
8db0: 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20   pSelTab ){.    
8dc0: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
8dd0: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70  aCol==0 );.    p
8de0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53  Table->nCol = pS
8df0: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
8e00: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
8e10: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
8e20: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
8e30: 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61   = 0;.    pSelTa
8e40: 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
8e50: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
8e60: 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a  le(0, pSelTab);.
8e70: 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74      DbSetPropert
8e80: 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  y(pParse->db, pT
8e90: 61 62 6c 65 2d 3e 69 44 62 2c 20 44 42 5f 55 6e  able->iDb, DB_Un
8ea0: 72 65 73 65 74 56 69 65 77 73 29 3b 0a 20 20 7d  resetViews);.  }
8eb0: 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 6c 65  else{.    pTable
8ec0: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
8ed0: 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71  nErr++;.  }.  sq
8ee0: 6c 69 74 65 53 65 6c 65 63 74 55 6e 62 69 6e 64  liteSelectUnbind
8ef0: 28 70 53 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65  (pSel);.  sqlite
8f00: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
8f10: 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sel->pEList);.  
8f20: 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70  pSel->pEList = p
8f30: 45 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e 20  EList;.  return 
8f40: 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  nErr;  .}../*.**
8f50: 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
8f60: 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68 65  n names from the
8f70: 20 56 49 45 57 20 70 54 61 62 6c 65 2e 0a 2a 2a   VIEW pTable..**
8f80: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8f90: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
8fa0: 76 65 72 20 61 6e 79 20 6f 74 68 65 72 20 74 61  ver any other ta
8fb0: 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 6d  ble or view is m
8fc0: 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 54 68 65 20  odified..** The 
8fd0: 76 69 65 77 20 70 61 73 73 65 64 20 69 6e 74 6f  view passed into
8fe0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
8ff0: 67 68 74 20 64 65 70 65 6e 64 20 64 69 72 65 63  ght depend direc
9000: 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c  tly or indirectl
9010: 79 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 64 69  y.** on the modi
9020: 66 69 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  fied or deleted 
9030: 74 61 62 6c 65 20 73 6f 20 77 65 20 6e 65 65 64  table so we need
9040: 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 6f 6c   to clear the ol
9050: 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d 65  d column.** name
9060: 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 77  s so that they w
9070: 69 6c 6c 20 62 65 20 72 65 63 6f 6d 70 75 74 65  ill be recompute
9080: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
9090: 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
90a0: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62  tColumnNames(Tab
90b0: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69  le *pTable){.  i
90c0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62  nt i;.  if( pTab
90d0: 6c 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 2d  le==0 || pTable-
90e0: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 72 65  >pSelect==0 ) re
90f0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 54 61 62  turn;.  if( pTab
9100: 6c 65 2d 3e 6e 43 6f 6c 3d 3d 30 20 29 20 72 65  le->nCol==0 ) re
9110: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
9120: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
9130: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
9140: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
9150: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[i].zName);.  
9160: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
9170: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66  ble->aCol[i].zDf
9180: 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  lt);.    sqliteF
9190: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
91a0: 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a  [i].zType);.  }.
91b0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
91c0: 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70 54  ble->aCol);.  pT
91d0: 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  able->aCol = 0;.
91e0: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
91f0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   0;.}../*.** Cle
9200: 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
9210: 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56  mes from every V
9220: 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20  IEW in database 
9230: 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  idx..*/.static v
9240: 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
9250: 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 20 2a 64  setAll(sqlite *d
9260: 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48  b, int idx){.  H
9270: 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66  ashElem *i;.  if
9280: 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79  ( !DbHasProperty
9290: 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
92a0: 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74  esetViews) ) ret
92b0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c  urn;.  for(i=sql
92c0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
92d0: 2d 3e 61 44 62 5b 69 64 78 5d 2e 74 62 6c 48 61  ->aDb[idx].tblHa
92e0: 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65  sh); i; i=sqlite
92f0: 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
9300: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
9310: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
9320: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
9330: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
9340: 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65    sqliteViewRese
9350: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61  tColumnNames(pTa
9360: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
9370: 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
9380: 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
9390: 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 0a 2f 2a  setViews);.}../*
93a0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65  .** Given a toke
93b0: 6e 2c 20 6c 6f 6f 6b 20 75 70 20 61 20 74 61 62  n, look up a tab
93c0: 6c 65 20 77 69 74 68 20 74 68 61 74 20 6e 61 6d  le with that nam
93d0: 65 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64  e.  If not found
93e0: 2c 20 6c 65 61 76 65 0a 2a 2a 20 61 6e 20 65 72  , leave.** an er
93f0: 72 6f 72 20 66 6f 72 20 74 68 65 20 70 61 72 73  ror for the pars
9400: 65 72 20 74 6f 20 66 69 6e 64 20 61 6e 64 20 72  er to find and r
9410: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 54  eturn NULL..*/.T
9420: 61 62 6c 65 20 2a 73 71 6c 69 74 65 54 61 62 6c  able *sqliteTabl
9430: 65 46 72 6f 6d 54 6f 6b 65 6e 28 50 61 72 73 65  eFromToken(Parse
9440: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
9450: 2a 70 54 6f 6b 29 7b 0a 20 20 63 68 61 72 20 2a  *pTok){.  char *
9460: 7a 4e 61 6d 65 3b 0a 20 20 54 61 62 6c 65 20 2a  zName;.  Table *
9470: 70 54 61 62 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  pTab;.  zName = 
9480: 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46  sqliteTableNameF
9490: 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29 3b 0a  romToken(pTok);.
94a0: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
94b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 54 61   return 0;.  pTa
94c0: 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61  b = sqliteFindTa
94d0: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
94e0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c  zName, 0);.  sql
94f0: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
9500: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
9510: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53  .    sqliteSetNS
9520: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
9530: 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68  ErrMsg, "no such
9540: 20 74 61 62 6c 65 3a 20 22 2c 20 30 2c 20 0a 20   table: ", 0, . 
9550: 20 20 20 20 20 20 20 70 54 6f 6b 2d 3e 7a 2c 20         pTok->z, 
9560: 70 54 6f 6b 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  pTok->n, 0);.   
9570: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
9580: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54  .  }.  return pT
9590: 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ab;.}../*.** Thi
95a0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
95b0: 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  led to do the wo
95c0: 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42  rk of a DROP TAB
95d0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
95e0: 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61   pName is the na
95f0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
9600: 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a  to be dropped..*
9610: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 72 6f  /.void sqliteDro
9620: 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
9630: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
9640: 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b  me, int isView){
9650: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
9660: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
9670: 6e 74 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74  nt base;.  sqlit
9680: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
9690: 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
96a0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
96b0: 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c  rr || sqlite_mal
96c0: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
96d0: 75 72 6e 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20  urn;.  pTable = 
96e0: 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54  sqliteTableFromT
96f0: 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 4e 61  oken(pParse, pNa
9700: 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  me);.  if( pTabl
9710: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
9720: 20 69 44 62 20 3d 20 70 54 61 62 6c 65 2d 3e 69   iDb = pTable->i
9730: 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  Db;.  assert( iD
9740: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
9750: 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  nDb );.#ifndef S
9760: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
9770: 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
9780: 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63   int code;.    c
9790: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
97a0: 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70  = SCHEMA_TABLE(p
97b0: 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 20 20 20  Table->iDb);.   
97c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
97d0: 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62 6c   = db->aDb[pTabl
97e0: 65 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  e->iDb].zName;. 
97f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74     if( sqliteAut
9800: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
9810: 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54  QLITE_DELETE, zT
9820: 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20  ab, 0, zDb)){.  
9830: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
9840: 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
9850: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44   ){.      if( iD
9860: 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
9870: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
9880: 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  OP_TEMP_VIEW;.  
9890: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
98a0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
98b0: 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20  _DROP_VIEW;.    
98c0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
98d0: 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20       if( iDb==1 
98e0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
98f0: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
9900: 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
9910: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
9920: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
9930: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
9940: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
9950: 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70  qliteAuthCheck(p
9960: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61  Parse, code, pTa
9970: 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a  ble->zName, 0, z
9980: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Db) ){.      ret
9990: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
99a0: 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65  f( sqliteAuthChe
99b0: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
99c0: 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 6c 65  E_DELETE, pTable
99d0: 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  ->zName, 0, zDb)
99e0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
99f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
9a00: 69 66 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  if.  if( pTable-
9a10: 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
9a20: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
9a30: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
9a40: 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61  g, "table ", pTa
9a50: 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20  ble->zName, .   
9a60: 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20 62 65      " may not be
9a70: 20 64 72 6f 70 70 65 64 22 2c 20 28 63 68 61 72   dropped", (char
9a80: 2a 29 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  *)0);.    pParse
9a90: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
9aa0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
9ab0: 69 73 56 69 65 77 20 26 26 20 70 54 61 62 6c 65  isView && pTable
9ac0: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
9ad0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
9ae0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
9af0: 72 4d 73 67 2c 20 22 75 73 65 20 44 52 4f 50 20  rMsg, "use DROP 
9b00: 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20  TABLE to delete 
9b10: 74 61 62 6c 65 20 22 2c 0a 20 20 20 20 20 20 70  table ",.      p
9b20: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 28 63  Table->zName, (c
9b30: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 70 50 61  har*)0);.    pPa
9b40: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
9b50: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
9b60: 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54  f( !isView && pT
9b70: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 7b  able->pSelect ){
9b80: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
9b90: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
9ba0: 72 72 4d 73 67 2c 20 22 75 73 65 20 44 52 4f 50  rrMsg, "use DROP
9bb0: 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20   VIEW to delete 
9bc0: 76 69 65 77 20 22 2c 0a 20 20 20 20 20 20 70 54  view ",.      pT
9bd0: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 28 63 68  able->zName, (ch
9be0: 61 72 2a 29 30 29 3b 0a 20 20 20 20 70 50 61 72  ar*)0);.    pPar
9bf0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
9c00: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
9c10: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
9c20: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61  to remove the ta
9c30: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  ble from the mas
9c40: 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ter table.  ** o
9c50: 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76  n disk..  */.  v
9c60: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
9c70: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
9c80: 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  v ){.    static 
9c90: 56 64 62 65 4f 70 20 64 72 6f 70 54 61 62 6c 65  VdbeOp dropTable
9ca0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f  [] = {.      { O
9cb0: 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c  P_Rewind,     0,
9cc0: 20 41 44 44 52 28 38 29 2c 20 20 30 7d 2c 0a 20   ADDR(8),  0},. 
9cd0: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
9ce0: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
9cf0: 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20     0}, /* 1 */. 
9d00: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f       { OP_MemSto
9d10: 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20  re,   1, 1,     
9d20: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
9d30: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c  P_MemLoad,    1,
9d40: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   0,        0}, /
9d50: 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 3 */.      { O
9d60: 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c  P_Column,     0,
9d70: 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   2,        0},. 
9d80: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20       { OP_Ne,   
9d90: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 37 29        0, ADDR(7)
9da0: 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ,  0},.      { O
9db0: 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c  P_Delete,     0,
9dc0: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
9dd0: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20       { OP_Next, 
9de0: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 33 29        0, ADDR(3)
9df0: 2c 20 20 30 7d 2c 20 2f 2a 20 37 20 2a 2f 0a 20  ,  0}, /* 7 */. 
9e00: 20 20 20 7d 3b 0a 20 20 20 20 49 6e 64 65 78 20     };.    Index 
9e10: 2a 70 49 64 78 3b 0a 20 20 20 20 54 72 69 67 67  *pIdx;.    Trigg
9e20: 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20  er *pTrigger;.  
9e30: 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69    sqliteBeginWri
9e40: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
9e50: 73 65 2c 20 30 2c 20 70 54 61 62 6c 65 2d 3e 69  se, 0, pTable->i
9e60: 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f  Db);..    /* Dro
9e70: 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61  p all triggers a
9e80: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
9e90: 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
9ea0: 72 6f 70 70 65 64 20 2a 2f 0a 20 20 20 20 70 54  ropped */.    pT
9eb0: 72 69 67 67 65 72 20 3d 20 70 54 61 62 6c 65 2d  rigger = pTable-
9ec0: 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 77  >pTrigger;.    w
9ed0: 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29  hile( pTrigger )
9ee0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9ef0: 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d 70  pTrigger->iDb==p
9f00: 54 61 62 6c 65 2d 3e 69 44 62 20 7c 7c 20 70 54  Table->iDb || pT
9f10: 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d 31 20 29  rigger->iDb==1 )
9f20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 72  ;.      sqliteDr
9f30: 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61  opTriggerPtr(pPa
9f40: 72 73 65 2c 20 70 54 72 69 67 67 65 72 2c 20 31  rse, pTrigger, 1
9f50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
9f60: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
9f70: 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72          pTrigger
9f80: 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65   = pTrigger->pNe
9f90: 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  xt;.      }else{
9fa0: 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65  .        pTrigge
9fb0: 72 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54 72 69  r = pTable->pTri
9fc0: 67 67 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gger;.      }.  
9fd0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70    }..    /* Drop
9fe0: 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54   all SQLITE_MAST
9ff0: 45 52 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ER entries that 
a000: 72 65 66 65 72 20 74 6f 20 74 68 65 20 74 61 62  refer to the tab
a010: 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  le */.    sqlite
a020: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
a030: 76 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b  v, pTable->iDb);
a040: 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69  .    base = sqli
a050: 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
a060: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f  v, ArraySize(dro
a070: 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54 61 62  pTable), dropTab
a080: 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  le);.    sqliteV
a090: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62  dbeChangeP3(v, b
a0a0: 61 73 65 2b 31 2c 20 70 54 61 62 6c 65 2d 3e 7a  ase+1, pTable->z
a0b0: 4e 61 6d 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  Name, 0);..    /
a0c0: 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54  * Drop all SQLIT
a0d0: 45 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20 65 6e  E_TEMP_MASTER en
a0e0: 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72  tries that refer
a0f0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   to the table */
a100: 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d  .    if( pTable-
a110: 3e 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20  >iDb!=1 ){.     
a120: 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65   sqliteOpenMaste
a130: 72 54 61 62 6c 65 28 76 2c 20 31 29 3b 0a 20 20  rTable(v, 1);.  
a140: 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74      base = sqlit
a150: 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  eVdbeAddOpList(v
a160: 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70  , ArraySize(drop
a170: 54 61 62 6c 65 29 2c 20 64 72 6f 70 54 61 62 6c  Table), dropTabl
a180: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
a190: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
a1a0: 62 61 73 65 2b 31 2c 20 70 54 61 62 6c 65 2d 3e  base+1, pTable->
a1b0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d  zName, 0);.    }
a1c0: 0a 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  ..    if( pTable
a1d0: 2d 3e 69 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20  ->iDb==0 ){.    
a1e0: 20 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f    sqliteChangeCo
a1f0: 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a 20 20 20  okie(db, v);.   
a200: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62   }.    sqliteVdb
a210: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
a220: 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  se, 0, 0);.    i
a230: 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20  f( !isView ){.  
a240: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
a250: 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  dOp(v, OP_Destro
a260: 79 2c 20 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 2c  y, pTable->tnum,
a270: 20 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 20   pTable->iDb);. 
a280: 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
a290: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49  able->pIndex; pI
a2a0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
a2b0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 73  Next){.        s
a2c0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
a2d0: 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49  , OP_Destroy, pI
a2e0: 64 78 2d 3e 74 6e 75 6d 2c 20 70 49 64 78 2d 3e  dx->tnum, pIdx->
a2f0: 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iDb);.      }.  
a300: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 45 6e    }.    sqliteEn
a310: 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
a320: 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20  pParse);.  }..  
a330: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e  /* Delete the in
a340: 2d 6d 65 6d 6f 72 79 20 64 65 73 63 72 69 70 74  -memory descript
a350: 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
a360: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65  ..  **.  ** Exce
a370: 70 74 69 6f 6e 3a 20 69 66 20 74 68 65 20 53 51  ption: if the SQ
a380: 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 67 61  L statement bega
a390: 6e 20 77 69 74 68 20 74 68 65 20 45 58 50 4c 41  n with the EXPLA
a3a0: 49 4e 20 6b 65 79 77 6f 72 64 2c 0a 20 20 2a 2a  IN keyword,.  **
a3b0: 20 74 68 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73   then no changes
a3c0: 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65 2e   should be made.
a3d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
a3e0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
a3f0: 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b      sqliteUnlink
a400: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 64  AndDeleteTable(d
a410: 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20  b, pTable);.    
a420: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
a430: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
a440: 73 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56  s;.  }.  sqliteV
a450: 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20  iewResetAll(db, 
a460: 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  iDb);.}../*.** T
a470: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 73  his routine cons
a480: 74 72 75 63 74 73 20 61 20 50 33 20 73 74 72 69  tructs a P3 stri
a490: 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ng suitable for 
a4a0: 61 6e 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79  an OP_MakeIdxKey
a4b0: 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 6e 64 20 61  .** opcode and a
a4c0: 64 64 73 20 74 68 61 74 20 50 33 20 73 74 72 69  dds that P3 stri
a4d0: 6e 67 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72  ng to the most r
a4e0: 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64  ecently inserted
a4f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20   instruction.** 
a500: 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  in the virtual m
a510: 61 63 68 69 6e 65 2e 20 20 54 68 65 20 50 33 20  achine.  The P3 
a520: 73 74 72 69 6e 67 20 63 6f 6e 73 69 73 74 73 20  string consists 
a530: 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72  of a single char
a540: 61 63 74 65 72 0a 2a 2a 20 66 6f 72 20 65 61 63  acter.** for eac
a550: 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  h column in the 
a560: 69 6e 64 65 78 20 70 49 64 78 20 6f 66 20 74 61  index pIdx of ta
a570: 62 6c 65 20 70 54 61 62 2e 20 20 49 66 20 74 68  ble pTab.  If th
a580: 65 20 63 6f 6c 75 6d 6e 20 75 73 65 73 0a 2a 2a  e column uses.**
a590: 20 61 20 6e 75 6d 65 72 69 63 20 73 6f 72 74 20   a numeric sort 
a5a0: 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68 65 20  order, then the 
a5b0: 50 33 20 73 74 72 69 6e 67 20 63 68 61 72 61 63  P3 string charac
a5c0: 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ter correspondin
a5d0: 67 20 74 6f 0a 2a 2a 20 74 68 61 74 20 63 6f 6c  g to.** that col
a5e0: 75 6d 6e 20 69 73 20 27 6e 27 2e 20 20 49 66 20  umn is 'n'.  If 
a5f0: 74 68 65 20 63 6f 6c 75 6d 6e 20 75 73 65 73 20  the column uses 
a600: 61 20 74 65 78 74 20 73 6f 72 74 20 6f 72 64 65  a text sort orde
a610: 72 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 50  r, then the.** P
a620: 33 20 73 74 72 69 6e 67 20 69 73 20 27 74 27 2e  3 string is 't'.
a630: 20 20 53 65 65 20 74 68 65 20 4f 50 5f 4d 61 6b    See the OP_Mak
a640: 65 49 64 78 4b 65 79 20 6f 70 63 6f 64 65 20 64  eIdxKey opcode d
a650: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72  ocumentation for
a660: 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  .** additional i
a670: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 65 65  nformation.  See
a680: 20 61 6c 73 6f 20 74 68 65 20 73 71 6c 69 74 65   also the sqlite
a690: 41 64 64 4b 65 79 54 79 70 65 28 29 20 72 6f 75  AddKeyType() rou
a6a0: 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tine..*/.void sq
a6b0: 6c 69 74 65 41 64 64 49 64 78 4b 65 79 54 79 70  liteAddIdxKeyTyp
a6c0: 65 28 56 64 62 65 20 2a 76 2c 20 49 6e 64 65 78  e(Vdbe *v, Index
a6d0: 20 2a 70 49 64 78 29 7b 0a 20 20 63 68 61 72 20   *pIdx){.  char 
a6e0: 2a 7a 54 79 70 65 3b 0a 20 20 54 61 62 6c 65 20  *zType;.  Table 
a6f0: 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20  *pTab;.  int i, 
a700: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  n;.  assert( pId
a710: 78 21 3d 30 20 26 26 20 70 49 64 78 2d 3e 70 54  x!=0 && pIdx->pT
a720: 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 70 54 61  able!=0 );.  pTa
a730: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
a740: 3b 0a 20 20 6e 20 3d 20 70 49 64 78 2d 3e 6e 43  ;.  n = pIdx->nC
a750: 6f 6c 75 6d 6e 3b 0a 20 20 7a 54 79 70 65 20 3d  olumn;.  zType =
a760: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
a770: 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a  ( n+1 );.  if( z
a780: 54 79 70 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Type==0 ) return
a790: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
a7a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
a7b0: 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43  iCol = pIdx->aiC
a7c0: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73  olumn[i];.    as
a7d0: 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26  sert( iCol>=0 &&
a7e0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
a7f0: 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61   );.    if( (pTa
a800: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 6f  b->aCol[iCol].so
a810: 72 74 4f 72 64 65 72 20 26 20 53 51 4c 49 54 45  rtOrder & SQLITE
a820: 5f 53 4f 5f 54 59 50 45 4d 41 53 4b 29 3d 3d 53  _SO_TYPEMASK)==S
a830: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 29 7b  QLITE_SO_TEXT ){
a840: 0a 20 20 20 20 20 20 7a 54 79 70 65 5b 69 5d 20  .      zType[i] 
a850: 3d 20 27 74 27 3b 0a 20 20 20 20 7d 65 6c 73 65  = 't';.    }else
a860: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 5b 69 5d  {.      zType[i]
a870: 20 3d 20 27 6e 27 3b 0a 20 20 20 20 7d 0a 20 20   = 'n';.    }.  
a880: 7d 0a 20 20 7a 54 79 70 65 5b 6e 5d 20 3d 20 30  }.  zType[n] = 0
a890: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 43 68  ;.  sqliteVdbeCh
a8a0: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 54  angeP3(v, -1, zT
a8b0: 79 70 65 2c 20 6e 29 3b 0a 20 20 73 71 6c 69 74  ype, n);.  sqlit
a8c0: 65 46 72 65 65 28 7a 54 79 70 65 29 3b 0a 7d 0a  eFree(zType);.}.
a8d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
a8e0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
a8f0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f   create a new fo
a900: 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65  reign key on the
a910: 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e   table.** curren
a920: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
a930: 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f  uction.  pFromCo
a940: 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  l determines whi
a950: 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  ch columns.** in
a960: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
a970: 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  le point to the 
a980: 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66  foreign key.  If
a990: 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65   pFromCol==0 the
a9a0: 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65  n.** connect the
a9b0: 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74   key to the last
a9c0: 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64   column inserted
a9d0: 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61  .  pTo is the na
a9e0: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62  me of.** the tab
a9f0: 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20  le referred to. 
aa00: 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73   pToCol is a lis
aa10: 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  t of tables in t
aa20: 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20  he other.** pTo 
aa30: 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66  table that the f
aa40: 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74  oreign key point
aa50: 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e  s to.  flags con
aa60: 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66  tains all.** inf
aa70: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
aa80: 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f  he conflict reso
aa90: 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
aaa0: 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69  s specified.** i
aab0: 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c  n the ON DELETE,
aac0: 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f   ON UPDATE and O
aad0: 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73  N INSERT clauses
aae0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20  ..**.** An FKey 
aaf0: 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
ab00: 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74  ated and added t
ab10: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
ab20: 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63  ently.** under c
ab30: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74  onstruction in t
ab40: 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  he pParse->pNewT
ab50: 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65  able field.  The
ab60: 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20   new FKey.** is 
ab70: 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20  not linked into 
ab80: 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69  db->aFKey at thi
ab90: 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64  s point - that d
aba0: 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a  oes not happen.*
abb0: 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 45 6e  * until sqliteEn
abc0: 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  dTable()..**.** 
abd0: 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  The foreign key 
abe0: 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44  is set for IMMED
abf0: 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e  IATE processing.
ac00: 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63    A subsequent c
ac10: 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  all.** to sqlite
ac20: 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
ac30: 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  ) might change t
ac40: 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e  his to DEFERRED.
ac50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43  .*/.void sqliteC
ac60: 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28  reateForeignKey(
ac70: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
ac80: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
ac90: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
aca0: 49 64 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c  IdList *pFromCol
acb0: 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ,    /* Columns 
acc0: 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68  in this table th
acd0: 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65  at point to othe
ace0: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b  r table */.  Tok
acf0: 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20  en *pTo,        
ad00: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
ad10: 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
ad20: 20 20 49 64 4c 69 73 74 20 2a 70 54 6f 43 6f 6c    IdList *pToCol
ad30: 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ,      /* Column
ad40: 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74  s in the other t
ad50: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  able */.  int fl
ad60: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
ad70: 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
ad80: 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
ad90: 2e 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  . */.){.  Table 
ada0: 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  *p = pParse->pNe
adb0: 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42  wTable;.  int nB
adc0: 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  yte;.  int i;.  
add0: 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72  int nCol;.  char
ade0: 20 2a 7a 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b   *z;.  FKey *pFK
adf0: 65 79 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ey = 0;..  asser
ae00: 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69  t( pTo!=0 );.  i
ae10: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73  f( p==0 || pPars
ae20: 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 66  e->nErr ) goto f
ae30: 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72  k_end;.  if( pFr
ae40: 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
ae50: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43  int iCol = p->nC
ae60: 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43  ol-1;.    if( iC
ae70: 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65  ol<0 ) goto fk_e
ae80: 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43  nd;.    if( pToC
ae90: 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 49  ol && pToCol->nI
aea0: 64 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  d!=1 ){.      sq
aeb0: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
aec0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
aed0: 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e   "foreign key on
aee0: 20 22 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20   ", -1,.        
aef0: 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a   p->aCol[iCol].z
af00: 4e 61 6d 65 2c 20 2d 31 2c 20 0a 20 20 20 20 20  Name, -1, .     
af10: 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66      " should ref
af20: 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20  erence only one 
af30: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
af40: 22 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20  ", -1,.         
af50: 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 2c 20  pTo->z, pTo->n, 
af60: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
af70: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
af80: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
af90: 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b   }.    nCol = 1;
afa0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f  .  }else if( pTo
afb0: 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
afc0: 49 64 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 49  Id!=pFromCol->nI
afd0: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  d ){.    sqliteS
afe0: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
aff0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20 20 20  ->zErrMsg, .    
b000: 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63      "number of c
b010: 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67  olumns in foreig
b020: 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d  n key does not m
b030: 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20  atch the number 
b040: 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f  of ".        "co
b050: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66  lumns in the ref
b060: 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 2c 20  erenced table", 
b070: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 70  (char*)0);.    p
b080: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
b090: 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
b0a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
b0b0: 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 49  l = pFromCol->nI
b0c0: 64 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  d;.  }.  nByte =
b0d0: 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20   sizeof(*pFKey) 
b0e0: 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46  + nCol*sizeof(pF
b0f0: 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20  Key->aCol[0]) + 
b100: 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66  pTo->n + 1;.  if
b110: 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
b120: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f  for(i=0; i<pToCo
b130: 6c 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  l->nId; i++){.  
b140: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72      nByte += str
b150: 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  len(pToCol->a[i]
b160: 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20  .zName) + 1;.   
b170: 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d   }.  }.  pFKey =
b180: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e   sqliteMalloc( n
b190: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46  Byte );.  if( pF
b1a0: 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b  Key==0 ) goto fk
b1b0: 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70  _end;.  pFKey->p
b1c0: 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65  From = p;.  pFKe
b1d0: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70  y->pNextFrom = p
b1e0: 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28  ->pFKey;.  z = (
b1f0: 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b  char*)&pFKey[1];
b200: 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d  .  pFKey->aCol =
b210: 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70   (struct sColMap
b220: 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65  *)z;.  z += size
b230: 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61  of(struct sColMa
b240: 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79  p)*nCol;.  pFKey
b250: 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d  ->zTo = z;.  mem
b260: 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70  cpy(z, pTo->z, p
b270: 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d  To->n);.  z[pTo-
b280: 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20  >n] = 0;.  z += 
b290: 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65  pTo->n+1;.  pFKe
b2a0: 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a  y->pNextTo = 0;.
b2b0: 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20    pFKey->nCol = 
b2c0: 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f  nCol;.  if( pFro
b2d0: 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70  mCol==0 ){.    p
b2e0: 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46  FKey->aCol[0].iF
b2f0: 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  rom = p->nCol-1;
b300: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
b310: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
b320: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ++){.      int j
b330: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
b340: 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29   j<p->nCol; j++)
b350: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
b360: 6c 69 74 65 53 74 72 49 43 6d 70 28 70 2d 3e 61  liteStrICmp(p->a
b370: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46  Col[j].zName, pF
b380: 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
b390: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
b3a0: 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
b3b0: 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20  i].iFrom = j;.  
b3c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b3d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
b3e0: 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d  .      if( j>=p-
b3f0: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
b400: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
b410: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
b420: 67 2c 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75  g, "unknown colu
b430: 6d 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  mn \"", .       
b440: 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69     pFromCol->a[i
b450: 5d 2e 7a 4e 61 6d 65 2c 20 22 5c 22 20 69 6e 20  ].zName, "\" in 
b460: 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
b470: 6e 69 74 69 6f 6e 22 2c 20 28 63 68 61 72 2a 29  nition", (char*)
b480: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  0);.        pPar
b490: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
b4a0: 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
b4b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b4c0: 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20   }.  if( pToCol 
b4d0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
b4e0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
b4f0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
b500: 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  en(pToCol->a[i].
b510: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46  zName);.      pF
b520: 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
b530: 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d  l = z;.      mem
b540: 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61  cpy(z, pToCol->a
b550: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  [i].zName, n);. 
b560: 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20       z[n] = 0;. 
b570: 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20       z += n+1;. 
b580: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
b590: 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30  ->isDeferred = 0
b5a0: 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74  ;.  pFKey->delet
b5b0: 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20  eConf = flags & 
b5c0: 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75  0xff;.  pFKey->u
b5d0: 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61  pdateConf = (fla
b5e0: 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66  gs >> 8 ) & 0xff
b5f0: 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72  ;.  pFKey->inser
b600: 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e  tConf = (flags >
b610: 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a  > 16 ) & 0xff;..
b620: 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f    /* Link the fo
b630: 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65  reign key to the
b640: 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61   table as the la
b650: 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  st step..  */.  
b660: 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79  p->pFKey = pFKey
b670: 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a  ;.  pFKey = 0;..
b680: 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  fk_end:.  sqlite
b690: 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 73  Free(pFKey);.  s
b6a0: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
b6b0: 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73  e(pFromCol);.  s
b6c0: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
b6d0: 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a  e(pToCol);.}../*
b6e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
b6f0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
b700: 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  an INITIALLY IMM
b710: 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41  EDIATE or INITIA
b720: 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20  LLY DEFERRED.** 
b730: 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61  clause is seen a
b740: 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65  s part of a fore
b750: 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
b760: 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72  on.  The isDefer
b770: 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  red.** parameter
b780: 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41   is 1 for INITIA
b790: 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64  LLY DEFERRED and
b7a0: 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   0 for INITIALLY
b7b0: 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54   IMMEDIATE..** T
b7c0: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
b7d0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
b7e0: 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e   created foreign
b7f0: 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64   key is adjusted
b800: 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  .** accordingly.
b810: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44  .*/.void sqliteD
b820: 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50  eferForeignKey(P
b830: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
b840: 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 20  t isDeferred){. 
b850: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
b860: 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69  FKey *pFKey;.  i
b870: 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73  f( (pTab = pPars
b880: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
b890: 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61   || (pFKey = pTa
b8a0: 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72  b->pFKey)==0 ) r
b8b0: 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e  eturn;.  pFKey->
b8c0: 69 73 44 65 66 65 72 72 65 64 20 3d 20 69 73 44  isDeferred = isD
b8d0: 65 66 65 72 72 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  eferred;.}../*.*
b8e0: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69  * Create a new i
b8f0: 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20  ndex for an SQL 
b900: 74 61 62 6c 65 2e 20 20 70 49 6e 64 65 78 20 69  table.  pIndex i
b910: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
b920: 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20  e index .** and 
b930: 70 54 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61  pTable is the na
b940: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
b950: 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
b960: 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c  dexed.  Both wil
b970: 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f  l .** be NULL fo
b980: 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  r a primary key 
b990: 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  or an index that
b9a0: 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20 73   is created to s
b9b0: 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51  atisfy a.** UNIQ
b9c0: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
b9d0: 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49  If pTable and pI
b9e0: 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75  ndex are NULL, u
b9f0: 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
ba00: 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74  able.** as the t
ba10: 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
ba20: 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  ed.  pParse->pNe
ba30: 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c  wTable is a tabl
ba40: 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72  e that is.** cur
ba50: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
ba60: 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43 52  structed by a CR
ba70: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
ba80: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  ment..**.** pLis
ba90: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63  t is a list of c
baa0: 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
bab0: 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c  exed.  pList wil
bac0: 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69  l be NULL if thi
bad0: 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72  s.** is a primar
bae0: 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d  y key or unique-
baf0: 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68  constraint on th
bb00: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f  e most recent co
bb10: 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f  lumn added.** to
bb20: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
bb30: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
bb40: 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f  ruction.  .*/.vo
bb50: 69 64 20 73 71 6c 69 74 65 43 72 65 61 74 65 49  id sqliteCreateI
bb60: 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
bb70: 50 61 72 73 65 2c 20 20 20 2f 2a 20 41 6c 6c 20  Parse,   /* All 
bb80: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
bb90: 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a  t this parse */.
bba0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
bbb0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
bbc0: 65 20 69 6e 64 65 78 2e 20 20 4d 61 79 20 62 65  e index.  May be
bbd0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69   NULL */.  SrcLi
bbe0: 73 74 20 2a 70 54 61 62 6c 65 2c 20 2f 2a 20 4e  st *pTable, /* N
bbf0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
bc00: 20 74 6f 20 69 6e 64 65 78 2e 20 20 55 73 65 20   to index.  Use 
bc10: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
bc20: 65 20 69 66 20 30 20 2a 2f 0a 20 20 49 64 4c 69  e if 0 */.  IdLi
bc30: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
bc40: 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  A list of column
bc50: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
bc60: 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
bc70: 2c 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72  ,     /* OE_Abor
bc80: 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45  t, OE_Ignore, OE
bc90: 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f  _Replace, or OE_
bca0: 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  None */.  Token 
bcb0: 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68  *pStart,   /* Th
bcc0: 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
bcd0: 68 61 74 20 62 65 67 69 6e 73 20 61 20 43 52 45  hat begins a CRE
bce0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
bcf0: 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
bd00: 70 45 6e 64 20 20 20 20 20 20 2f 2a 20 54 68 65  pEnd      /* The
bd10: 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73   ")" that closes
bd20: 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
bd30: 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29  X statement */.)
bd40: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
bd50: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
bd60: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
bd70: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
bd80: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
bd90: 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a  o be created */.
bda0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
bdb0: 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  0;.  int i, j;. 
bdc0: 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20   Token nullId;  
bdd0: 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20    /* Fake token 
bde0: 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20  for an empty ID 
bdf0: 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46 69 78 65  list */.  DbFixe
be00: 72 20 73 46 69 78 3b 20 20 20 20 2f 2a 20 46 6f  r sFix;    /* Fo
be10: 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61  r assigning data
be20: 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54  base names to pT
be30: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  able */.  int is
be40: 54 65 6d 70 3b 20 20 20 20 20 20 2f 2a 20 54 72  Temp;      /* Tr
be50: 75 65 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ue for a tempora
be60: 72 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 73 71  ry index */.  sq
be70: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
be80: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50  e->db;..  if( pP
be90: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
bea0: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
beb0: 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  ed ) goto exit_c
bec0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69  reate_index;.  i
bed0: 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  f( pParse->initF
bee0: 6c 61 67 20 0a 20 20 20 20 20 26 26 20 73 71 6c  lag .     && sql
bef0: 69 74 65 46 69 78 49 6e 69 74 28 26 73 46 69 78  iteFixInit(&sFix
bf00: 2c 20 70 50 61 72 73 65 2c 20 70 50 61 72 73 65  , pParse, pParse
bf10: 2d 3e 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20  ->iDb, "index", 
bf20: 70 4e 61 6d 65 29 0a 20 20 20 20 20 26 26 20 73  pName).     && s
bf30: 71 6c 69 74 65 46 69 78 53 72 63 4c 69 73 74 28  qliteFixSrcList(
bf40: 26 73 46 69 78 2c 20 70 54 61 62 6c 65 29 0a 20  &sFix, pTable). 
bf50: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
bf60: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
bf70: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
bf80: 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68  ind the table th
bf90: 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
bfa0: 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72  xed.  Return ear
bfb0: 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ly if not found.
bfc0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
bfd0: 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  le!=0 ){.    ass
bfe0: 65 72 74 28 20 70 4e 61 6d 65 21 3d 30 20 29 3b  ert( pName!=0 );
bff0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
c000: 62 6c 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ble->nSrc==1 );.
c010: 20 20 20 20 70 54 61 62 20 3d 20 20 73 71 6c 69      pTab =  sqli
c020: 74 65 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28  teSrcListLookup(
c030: 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 3b  pParse, pTable);
c040: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
c050: 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29  sert( pName==0 )
c060: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70 50  ;.    pTab =  pP
c070: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
c080: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 3d  .  }.  if( pTab=
c090: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
c0a0: 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  rr ) goto exit_c
c0b0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69  reate_index;.  i
c0c0: 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c  f( pTab->readOnl
c0d0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  y ){.    sqliteS
c0e0: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
c0f0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c  ->zErrMsg, "tabl
c100: 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  e ", pTab->zName
c110: 2c 0a 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f  ,.      " may no
c120: 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 28  t be indexed", (
c130: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 70 50  char*)0);.    pP
c140: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
c150: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
c160: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
c170: 69 66 28 20 70 54 61 62 2d 3e 69 44 62 3e 3d 32  if( pTab->iDb>=2
c180: 20 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74   && pParse->init
c190: 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Flag==0 ){.    s
c1a0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
c1b0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
c1c0: 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d   "table ", pTab-
c1d0: 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 22  >zName, .      "
c1e0: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 69 6e   may not have in
c1f0: 64 69 63 65 73 20 61 64 64 65 64 22 2c 20 28 63  dices added", (c
c200: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 70 50 61  har*)0);.    pPa
c210: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
c220: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
c230: 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  e_index;.  }.  i
c240: 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
c250: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
c260: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
c270: 3e 7a 45 72 72 4d 73 67 2c 20 22 76 69 65 77 73  >zErrMsg, "views
c280: 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
c290: 78 65 64 22 2c 20 28 63 68 61 72 2a 29 30 29 3b  xed", (char*)0);
c2a0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
c2b0: 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  r++;.    goto ex
c2c0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
c2d0: 0a 20 20 7d 0a 20 20 69 73 54 65 6d 70 20 3d 20  .  }.  isTemp = 
c2e0: 70 54 61 62 2d 3e 69 44 62 3d 3d 31 3b 0a 0a 20  pTab->iDb==1;.. 
c2f0: 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
c300: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
c310: 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  dex.  Make sure 
c320: 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72  there is not alr
c330: 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a  eady another.  *
c340: 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
c350: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
c360: 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ame.  .  **.  **
c370: 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20   Exception:  If 
c380: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
c390: 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d  he names of perm
c3a0: 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72  anent indices fr
c3b0: 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  om the.  ** sqli
c3c0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
c3d0: 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74  (because some ot
c3e0: 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e  her process chan
c3f0: 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20  ged the schema) 
c400: 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20  and.  ** one of 
c410: 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  the index names 
c420: 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68  collides with th
c430: 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70  e name of a temp
c440: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20  orary table or. 
c450: 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20   ** index, then 
c460: 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
c470: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73   to process this
c480: 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a   index..  **.  *
c490: 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74  * If pName==0 it
c4a0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61   means that we a
c4b0: 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20  re.  ** dealing 
c4c0: 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b  with a primary k
c4d0: 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ey or UNIQUE con
c4e0: 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76  straint.  We hav
c4f0: 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a  e to invent our.
c500: 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20    ** own name.. 
c510: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20   */.  if( pName 
c520: 26 26 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74  && !pParse->init
c530: 46 6c 61 67 20 29 7b 0a 20 20 20 20 49 6e 64 65  Flag ){.    Inde
c540: 78 20 2a 70 49 53 61 6d 65 4e 61 6d 65 3b 20 20  x *pISameName;  
c550: 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 69 6e 64    /* Another ind
c560: 65 78 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ex with the same
c570: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54 61 62   name */.    Tab
c580: 6c 65 20 2a 70 54 53 61 6d 65 4e 61 6d 65 3b 20  le *pTSameName; 
c590: 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 77 69     /* A table wi
c5a0: 74 68 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  th same name as 
c5b0: 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
c5c0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53   zName = sqliteS
c5d0: 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c  trNDup(pName->z,
c5e0: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
c5f0: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67  if( zName==0 ) g
c600: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
c610: 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 28  index;.    if( (
c620: 70 49 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c  pISameName = sql
c630: 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  iteFindIndex(db,
c640: 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 29   zName, 0))!=0 )
c650: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  {.      sqliteSe
c660: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
c670: 3e 7a 45 72 72 4d 73 67 2c 20 22 69 6e 64 65 78  >zErrMsg, "index
c680: 20 22 2c 20 7a 4e 61 6d 65 2c 20 0a 20 20 20 20   ", zName, .    
c690: 20 20 20 20 20 22 20 61 6c 72 65 61 64 79 20 65       " already e
c6a0: 78 69 73 74 73 22 2c 20 28 63 68 61 72 2a 29 30  xists", (char*)0
c6b0: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
c6c0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 67  >nErr++;.      g
c6d0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
c6e0: 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
c6f0: 20 69 66 28 20 28 70 54 53 61 6d 65 4e 61 6d 65   if( (pTSameName
c700: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62   = sqliteFindTab
c710: 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  le(db, zName, 0)
c720: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=0 ){.      sq
c730: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
c740: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
c750: 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
c760: 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  y a table named 
c770: 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  ",.         zNam
c780: 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
c790: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
c7a0: 2b 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  ++;.      goto e
c7b0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
c7c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
c7d0: 69 66 28 20 70 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( pName==0 ){.
c7e0: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30      char zBuf[30
c7f0: 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ];.    int n;.  
c800: 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a    Index *pLoop;.
c810: 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54      for(pLoop=pT
c820: 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b  ab->pIndex, n=1;
c830: 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
c840: 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29  oop->pNext, n++)
c850: 7b 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  {}.    sprintf(z
c860: 42 75 66 2c 22 25 64 29 22 2c 6e 29 3b 0a 20 20  Buf,"%d)",n);.  
c870: 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20    zName = 0;.   
c880: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
c890: 28 26 7a 4e 61 6d 65 2c 20 22 28 22 2c 20 70 54  (&zName, "(", pT
c8a0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 20 61 75 74  ab->zName, " aut
c8b0: 6f 69 6e 64 65 78 20 22 2c 20 7a 42 75 66 2c 20  oindex ", zBuf, 
c8c0: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 69  (char*)0);.    i
c8d0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
c8e0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
c8f0: 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ndex;.  }else{. 
c900: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
c910: 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e  eStrNDup(pName->
c920: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
c930: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
c940: 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  r authorization 
c950: 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  to create an ind
c960: 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ex..  */.#ifndef
c970: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
c980: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
c990: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
c9a0: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61  Db = db->aDb[pTa
c9b0: 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 0a  b->iDb].zName;..
c9c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
c9d0: 2d 3e 69 44 62 3d 3d 70 50 61 72 73 65 2d 3e 69  ->iDb==pParse->i
c9e0: 44 62 20 7c 7c 20 69 73 54 65 6d 70 20 29 3b 0a  Db || isTemp );.
c9f0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75      if( sqliteAu
ca00: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
ca10: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
ca20: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65  CHEMA_TABLE(isTe
ca30: 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  mp), 0, zDb) ){.
ca40: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
ca50: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
ca60: 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49    }.    i = SQLI
ca70: 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b  TE_CREATE_INDEX;
ca80: 0a 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20  .    if( isTemp 
ca90: 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ) i = SQLITE_CRE
caa0: 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ATE_TEMP_INDEX;.
cab0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75      if( sqliteAu
cac0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
cad0: 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i, zName, pTab->
cae0: 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
caf0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
cb00: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
cb10: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
cb20: 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
cb30: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
cb40: 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
cb50: 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
cb60: 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
cb70: 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   of the last col
cb80: 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  umn added to the
cb90: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
cba0: 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  struction..  ** 
cbb0: 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65  So create a fake
cbc0: 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74   list to simulat
cbd0: 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69  e this..  */.  i
cbe0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
cbf0: 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54     nullId.z = pT
cc00: 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
cc10: 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col-1].zName;.  
cc20: 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72    nullId.n = str
cc30: 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20  len(nullId.z);. 
cc40: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
cc50: 65 49 64 4c 69 73 74 41 70 70 65 6e 64 28 30 2c  eIdListAppend(0,
cc60: 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69   &nullId);.    i
cc70: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f  f( pList==0 ) go
cc80: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
cc90: 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ndex;.  }..  /* 
cca0: 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  ** Allocate t
ccb0: 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  he index structu
ccc0: 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64  re. .  */.  pInd
ccd0: 65 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ex = sqliteMallo
cce0: 63 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29  c( sizeof(Index)
ccf0: 20 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   + strlen(zName)
cd00: 20 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20   + 1 +.         
cd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
cd20: 69 7a 65 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74  izeof(int)*pList
cd30: 2d 3e 6e 49 64 20 29 3b 0a 20 20 69 66 28 20 70  ->nId );.  if( p
cd40: 49 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20  Index==0 ) goto 
cd50: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
cd60: 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  x;.  pIndex->aiC
cd70: 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70  olumn = (int*)&p
cd80: 49 6e 64 65 78 5b 31 5d 3b 0a 20 20 70 49 6e 64  Index[1];.  pInd
cd90: 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61  ex->zName = (cha
cda0: 72 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f  r*)&pIndex->aiCo
cdb0: 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d  lumn[pList->nId]
cdc0: 3b 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64 65  ;.  strcpy(pInde
cdd0: 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  x->zName, zName)
cde0: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  ;.  pIndex->pTab
cdf0: 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e  le = pTab;.  pIn
ce00: 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70  dex->nColumn = p
ce10: 4c 69 73 74 2d 3e 6e 49 64 3b 0a 20 20 70 49 6e  List->nId;.  pIn
ce20: 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f  dex->onError = o
ce30: 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78  nError;.  pIndex
ce40: 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e  ->autoIndex = pN
ce50: 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78  ame==0;.  pIndex
ce60: 2d 3e 69 44 62 20 3d 20 69 73 54 65 6d 70 20 3f  ->iDb = isTemp ?
ce70: 20 31 20 3a 20 70 50 61 72 73 65 2d 3e 69 44 62   1 : pParse->iDb
ce80: 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65  ;..  /* Scan the
ce90: 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
cea0: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62  lumns of the tab
ceb0: 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
cec0: 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74   and.  ** load t
ced0: 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65  he column indice
cee0: 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78  s into the Index
cef0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 70   structure.  Rep
cf00: 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a  ort an error.  *
cf10: 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  * if any column 
cf20: 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  is not found..  
cf30: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
cf40: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
cf50: 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
cf60: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
cf70: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
cf80: 69 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73 74  iteStrICmp(pList
cf90: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[i].zName, pT
cfa0: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
cfb0: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
cfc0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d     }.    if( j>=
cfd0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
cfe0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
cff0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
d000: 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20  rMsg, "table ", 
d010: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20  pTab->zName, .  
d020: 20 20 20 20 20 20 22 20 68 61 73 20 6e 6f 20 63        " has no c
d030: 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 22 2c 20 70  olumn named ", p
d040: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
d050: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
d060: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
d070: 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  +;.      sqliteF
d080: 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20  ree(pIndex);.   
d090: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
d0a0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
d0b0: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  .    pIndex->aiC
d0c0: 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20  olumn[i] = j;.  
d0d0: 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  }..  /* Link the
d0e0: 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63   new Index struc
d0f0: 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c  ture to its tabl
d100: 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68  e and to the oth
d110: 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  er.  ** in-memor
d120: 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  y database struc
d130: 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69  tures. .  */.  i
d140: 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  f( !pParse->expl
d150: 61 69 6e 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ain ){.    Index
d160: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c   *p;.    p = sql
d170: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
d180: 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69  b->aDb[pIndex->i
d190: 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 0a 20 20  Db].idxHash, .  
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1b0: 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
d1c0: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e  Name, strlen(pIn
d1d0: 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70  dex->zName)+1, p
d1e0: 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
d1f0: 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
d200: 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20  t( p==pIndex ); 
d210: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
d220: 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
d230: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
d240: 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 67  pIndex);.      g
d250: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
d260: 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
d270: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
d280: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
d290: 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68  es;.  }..  /* Wh
d2a0: 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64  en adding an ind
d2b0: 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ex to the list o
d2c0: 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20  f indices for a 
d2d0: 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a  table, make.  **
d2e0: 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65   sure all indice
d2f0: 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70  s labeled OE_Rep
d300: 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20  lace come after 
d310: 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65  all those labele
d320: 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65  d.  ** OE_Ignore
d330: 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
d340: 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72  sary for the cor
d350: 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  rect operation o
d360: 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e  f UPDATE.  ** an
d370: 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20  d INSERT..  */. 
d380: 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45   if( onError!=OE
d390: 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62  _Replace || pTab
d3a0: 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20  ->pIndex==0.    
d3b0: 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64     || pTab->pInd
d3c0: 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
d3d0: 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 70 49  Replace){.    pI
d3e0: 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54  ndex->pNext = pT
d3f0: 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
d400: 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70  pTab->pIndex = p
d410: 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Index;.  }else{.
d420: 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65      Index *pOthe
d430: 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  r = pTab->pIndex
d440: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74  ;.    while( pOt
d450: 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f  her->pNext && pO
d460: 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45  ther->pNext->onE
d470: 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
d480: 20 29 7b 0a 20 20 20 20 20 20 70 4f 74 68 65 72   ){.      pOther
d490: 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
d4a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
d4b0: 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68  ex->pNext = pOth
d4c0: 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 70  er->pNext;.    p
d4d0: 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Other->pNext = p
d4e0: 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Index;.  }..  /*
d4f0: 20 49 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67   If the initFlag
d500: 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77   is 1 it means w
d510: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
d520: 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20  e SQL off the.  
d530: 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65  ** "sqlite_maste
d540: 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  r" table on the 
d550: 64 69 73 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f 74  disk.  So do not
d560: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69   write to the di
d570: 73 6b 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 20  sk.  ** again.  
d580: 45 78 74 72 61 63 74 20 74 68 65 20 74 61 62 6c  Extract the tabl
d590: 65 20 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68  e number from th
d5a0: 65 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75  e pParse->newTnu
d5b0: 6d 20 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20  m field..  */.  
d5c0: 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74  if( pParse->init
d5d0: 46 6c 61 67 20 26 26 20 70 54 61 62 6c 65 21 3d  Flag && pTable!=
d5e0: 30 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  0 ){.    pIndex-
d5f0: 3e 74 6e 75 6d 20 3d 20 70 50 61 72 73 65 2d 3e  >tnum = pParse->
d600: 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20  newTnum;.  }..  
d610: 2f 2a 20 49 66 20 74 68 65 20 69 6e 69 74 46 6c  /* If the initFl
d620: 61 67 20 69 73 20 30 20 74 68 65 6e 20 63 72 65  ag is 0 then cre
d630: 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  ate the index on
d640: 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a   disk.  This.  *
d650: 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69  * involves writi
d660: 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  ng the index int
d670: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  o the master tab
d680: 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69  le and filling i
d690: 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  n the.  ** index
d6a0: 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
d6b0: 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73  t table contents
d6c0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
d6d0: 69 6e 69 74 46 6c 61 67 20 69 73 20 30 20 77 68  initFlag is 0 wh
d6e0: 65 6e 20 74 68 65 20 75 73 65 72 20 66 69 72 73  en the user firs
d6f0: 74 20 65 6e 74 65 72 73 20 61 20 43 52 45 41 54  t enters a CREAT
d700: 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f  E INDEX .  ** co
d710: 6d 6d 61 6e 64 2e 20 20 54 68 65 20 69 6e 69 74  mmand.  The init
d720: 46 6c 61 67 20 69 73 20 31 20 77 68 65 6e 20 61  Flag is 1 when a
d730: 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
d740: 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52  ned and .  ** CR
d750: 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
d760: 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f  ments are read o
d770: 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ut of the master
d780: 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a   table.  In.  **
d790: 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65   the latter case
d7a0: 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61   the index alrea
d7b0: 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73  dy exists on dis
d7c0: 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68 79 0a  k, which is why.
d7d0: 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61    ** we don't wa
d7e0: 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 69  nt to recreate i
d7f0: 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  t..  **.  ** If 
d800: 70 54 61 62 6c 65 3d 3d 30 20 69 74 20 6d 65 61  pTable==0 it mea
d810: 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  ns this index is
d820: 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61 20   generated as a 
d830: 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a  primary key.  **
d840: 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
d850: 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54  raint of a CREAT
d860: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
d870: 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61  t.  Since the ta
d880: 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73  ble.  ** has jus
d890: 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  t been created, 
d8a0: 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  it contains no d
d8b0: 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ata and the inde
d8c0: 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  x initialization
d8d0: 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62  .  ** step can b
d8e0: 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  e skipped..  */.
d8f0: 20 20 65 6c 73 65 20 69 66 28 20 70 50 61 72 73    else if( pPars
d900: 65 2d 3e 69 6e 69 74 46 6c 61 67 3d 3d 30 20 29  e->initFlag==0 )
d910: 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
d920: 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 69 6e   Vdbe *v;.    in
d930: 74 20 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a 20 20  t lbl1, lbl2;.  
d940: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
d950: 20 61 64 64 72 3b 0a 0a 20 20 20 20 76 20 3d 20   addr;..    v = 
d960: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
d970: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
d980: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
d990: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
d9a0: 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20    if( pTable!=0 
d9b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42  ){.      sqliteB
d9c0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
d9d0: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 73  on(pParse, 0, is
d9e0: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
d9f0: 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  iteOpenMasterTab
da00: 6c 65 28 76 2c 20 69 73 54 65 6d 70 29 3b 0a 20  le(v, isTemp);. 
da10: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
da20: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
da30: 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a  ewRecno, 0, 0);.
da40: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
da50: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
da60: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
da70: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
da80: 76 2c 20 2d 31 2c 20 22 69 6e 64 65 78 22 2c 20  v, -1, "index", 
da90: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
daa0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
dab0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
dac0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
dad0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
dae0: 31 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  1, pIndex->zName
daf0: 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d  , strlen(pIndex-
db00: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73 71  >zName));.    sq
db10: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
db20: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
db30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
db40: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
db50: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33   pTab->zName, P3
db60: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 61 64  _STATIC);.    ad
db70: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
db80: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74  ddOp(v, OP_Creat
db90: 65 49 6e 64 65 78 2c 20 30 2c 20 69 73 54 65 6d  eIndex, 0, isTem
dba0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  p);.    sqliteVd
dbb0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
dbc0: 64 72 2c 20 28 63 68 61 72 2a 29 26 70 49 6e 64  dr, (char*)&pInd
dbd0: 65 78 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49  ex->tnum, P3_POI
dbe0: 4e 54 45 52 29 3b 0a 20 20 20 20 70 49 6e 64 65  NTER);.    pInde
dbf0: 78 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20  x->tnum = 0;.   
dc00: 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20   if( pTable ){. 
dc10: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
dc20: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
dc30: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
dc40: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
dc50: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 73 54 65  OP_Integer, isTe
dc60: 6d 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  mp, 0);.      sq
dc70: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
dc80: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31   OP_OpenWrite, 1
dc90: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
dca0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62  addr = sqliteVdb
dcb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
dcc0: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
dcd0: 69 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45  if( pStart && pE
dce0: 6e 64 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  nd ){.      n = 
dcf0: 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20  Addr(pEnd->z) - 
dd00: 41 64 64 72 28 70 53 74 61 72 74 2d 3e 7a 29 20  Addr(pStart->z) 
dd10: 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  + 1;.      sqlit
dd20: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
dd30: 20 61 64 64 72 2c 20 70 53 74 61 72 74 2d 3e 7a   addr, pStart->z
dd40: 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
dd50: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
dd60: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
dd70: 2c 20 35 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 5, 0);.    sql
dd80: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
dd90: 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c  OP_PutIntKey, 0,
dda0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61   0);.    if( pTa
ddb0: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ble ){.      sql
ddc0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
ddd0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62  OP_Integer, pTab
dde0: 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20  ->iDb, 0);.     
ddf0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
de00: 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
de10: 20 32 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b   2, pTab->tnum);
de20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
de30: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
de40: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33   pTab->zName, P3
de50: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
de60: 6c 62 6c 32 20 3d 20 73 71 6c 69 74 65 56 64 62  lbl2 = sqliteVdb
de70: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
de80: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
de90: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
dea0: 64 2c 20 32 2c 20 6c 62 6c 32 29 3b 0a 20 20 20  d, 2, lbl2);.   
deb0: 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65     lbl1 = sqlite
dec0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ded0: 52 65 63 6e 6f 2c 20 32 2c 20 30 29 3b 0a 20 20  Recno, 2, 0);.  
dee0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
def0: 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Index->nColumn; 
df00: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
df10: 74 20 69 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d  t iCol = pIndex-
df20: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
df30: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
df40: 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 29 7b 0a 20  iPKey==iCol ){. 
df50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56           sqliteV
df60: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
df70: 75 70 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20  up, i, 0);.     
df80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
df90: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
dfa0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
dfb0: 2c 20 32 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  , 2, iCol);.    
dfc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
dfd0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
dfe0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 49 64  dOp(v, OP_MakeId
dff0: 78 4b 65 79 2c 20 70 49 6e 64 65 78 2d 3e 6e 43  xKey, pIndex->nC
e000: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
e010: 20 69 66 28 20 64 62 2d 3e 66 69 6c 65 5f 66 6f   if( db->file_fo
e020: 72 6d 61 74 3e 3d 34 20 29 20 73 71 6c 69 74 65  rmat>=4 ) sqlite
e030: 41 64 64 49 64 78 4b 65 79 54 79 70 65 28 76 2c  AddIdxKeyType(v,
e040: 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20   pIndex);.      
e050: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
e060: 76 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20 31 2c  v, OP_IdxPut, 1,
e070: 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
e080: 21 3d 4f 45 5f 4e 6f 6e 65 29 3b 0a 20 20 20 20  !=OE_None);.    
e090: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
e0a0: 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 69 6e 64  geP3(v, -1, "ind
e0b0: 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65  exed columns are
e0c0: 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33   not unique", P3
e0d0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
e0e0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
e0f0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c  v, OP_Next, 2, l
e100: 62 6c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  bl1);.      sqli
e110: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
e120: 65 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20  el(v, lbl2);.   
e130: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
e140: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
e150: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 0);.      sql
e160: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
e170: 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b  OP_Close, 1, 0);
e180: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
e190: 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20  Table!=0 ){.    
e1a0: 20 20 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b    if( !isTemp ){
e1b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 43  .        sqliteC
e1c0: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20  hangeCookie(db, 
e1d0: 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  v);.      }.    
e1e0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
e1f0: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  p(v, OP_Close, 0
e200: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
e210: 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  teEndWriteOperat
e220: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ion(pParse);.   
e230: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65   }.  }..  /* Cle
e240: 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69  an up before exi
e250: 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65  ting */.exit_cre
e260: 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c  ate_index:.  sql
e270: 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28  iteIdListDelete(
e280: 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  pList);.  sqlite
e290: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54  SrcListDelete(pT
e2a0: 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  able);.  sqliteF
e2b0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  ree(zName);.  re
e2c0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
e2d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
e2e0: 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e   drop an existin
e2f0: 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20  g named index.  
e300: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
e310: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44  implements the D
e320: 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ROP INDEX statem
e330: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
e340: 69 74 65 44 72 6f 70 49 6e 64 65 78 28 50 61 72  iteDropIndex(Par
e350: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
e360: 69 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49  ist *pName){.  I
e370: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
e380: 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
e390: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
e3a0: 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  db;..  if( pPars
e3b0: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
e3c0: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
e3d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
e3e0: 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
e3f0: 3d 31 20 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d  =1 );.  pIndex =
e400: 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78   sqliteFindIndex
e410: 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  (db, pName->a[0]
e420: 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
e430: 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
e440: 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20    if( pIndex==0 
e450: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72  ){.    sqliteErr
e460: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
e470: 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53  o such index: %S
e480: 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  ", pName, 0);.  
e490: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
e4a0: 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
e4b0: 28 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e  ( pIndex->autoIn
e4c0: 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dex ){.    sqlit
e4d0: 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
e4e0: 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61  , "index associa
e4f0: 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20  ted with UNIQUE 
e500: 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d  ".      "or PRIM
e510: 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
e520: 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f  nt cannot be dro
e530: 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67  pped", 0);.    g
e540: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
e550: 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dex;.  }.  if( p
e560: 49 6e 64 65 78 2d 3e 69 44 62 3e 31 20 29 7b 0a  Index->iDb>1 ){.
e570: 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
e580: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
e590: 6f 74 20 61 6c 74 65 72 20 73 63 68 65 6d 61 20  ot alter schema 
e5a0: 6f 66 20 61 74 74 61 63 68 65 64 20 22 0a 20 20  of attached ".  
e5b0: 20 20 20 20 20 22 64 61 74 61 62 61 73 65 73 22       "databases"
e5c0: 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  , 0);.    goto e
e5d0: 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
e5e0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
e5f0: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
e600: 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
e610: 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  t code = SQLITE_
e620: 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  DROP_INDEX;.    
e630: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
e640: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20  ndex->pTable;.  
e650: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
e660: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e 64  b = db->aDb[pInd
e670: 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  ex->iDb].zName;.
e680: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e690: 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
e6a0: 42 4c 45 28 70 49 6e 64 65 78 2d 3e 69 44 62 29  BLE(pIndex->iDb)
e6b0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
e6c0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
e6d0: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
e6e0: 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29   zTab, 0, zDb) )
e6f0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
e700: 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
e710: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 64    }.    if( pInd
e720: 65 78 2d 3e 69 44 62 20 29 20 63 6f 64 65 20 3d  ex->iDb ) code =
e730: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
e740: 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
e750: 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b   sqliteAuthCheck
e760: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
e770: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54  Index->zName, pT
e780: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  ab->zName, zDb) 
e790: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
e7a0: 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
e7b0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
e7c0: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
e7d0: 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
e7e0: 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d  e index and from
e7f0: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
e800: 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74  e */.  v = sqlit
e810: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
e820: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
e830: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64   static VdbeOp d
e840: 72 6f 70 49 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20  ropIndex[] = {. 
e850: 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64       { OP_Rewind
e860: 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29  ,     0, ADDR(9)
e870: 2c 20 30 7d 2c 20 0a 20 20 20 20 20 20 7b 20 4f  , 0}, .      { O
e880: 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c  P_String,     0,
e890: 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a   0,       0}, /*
e8a0: 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   1 */.      { OP
e8b0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20  _MemStore,   1, 
e8c0: 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  1,       0},.   
e8d0: 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c     { OP_MemLoad,
e8e0: 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20      1, 0,       
e8f0: 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20  0}, /* 3 */.    
e900: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20    { OP_Column,  
e910: 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20 30     0, 1,       0
e920: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 45 71  },.      { OP_Eq
e930: 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41 44 44  ,         0, ADD
e940: 52 28 38 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20  R(8), 0},.      
e950: 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20  { OP_Next,      
e960: 20 30 2c 20 41 44 44 52 28 33 29 2c 20 30 7d 2c   0, ADDR(3), 0},
e970: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f  .      { OP_Goto
e980: 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28  ,       0, ADDR(
e990: 39 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  9), 0},.      { 
e9a0: 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30  OP_Delete,     0
e9b0: 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f  , 0,       0}, /
e9c0: 2a 20 38 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  * 8 */.    };.  
e9d0: 20 20 69 6e 74 20 62 61 73 65 3b 0a 0a 20 20 20    int base;..   
e9e0: 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74   sqliteBeginWrit
e9f0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
ea00: 65 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 69 44  e, 0, pIndex->iD
ea10: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 70  b);.    sqliteOp
ea20: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c  enMasterTable(v,
ea30: 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20   pIndex->iDb);. 
ea40: 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65     base = sqlite
ea50: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
ea60: 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70 49   ArraySize(dropI
ea70: 6e 64 65 78 29 2c 20 64 72 6f 70 49 6e 64 65 78  ndex), dropIndex
ea80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
ea90: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73  eChangeP3(v, bas
eaa0: 65 2b 31 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  e+1, pIndex->zNa
eab0: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  me, 0);.    if( 
eac0: 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 30 20 29  pIndex->iDb==0 )
ead0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43 68  {.      sqliteCh
eae0: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
eaf0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
eb00: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
eb10: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
eb20: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
eb30: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72  ddOp(v, OP_Destr
eb40: 6f 79 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  oy, pIndex->tnum
eb50: 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a  , pIndex->iDb);.
eb60: 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69      sqliteEndWri
eb70: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
eb80: 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  se);.  }..  /* D
eb90: 65 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  elete the in-mem
eba0: 6f 72 79 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ory description 
ebb0: 6f 66 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  of this index.. 
ebc0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
ebd0: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
ebe0: 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e    sqliteUnlinkAn
ebf0: 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c  dDeleteIndex(db,
ec00: 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 64 62   pIndex);.    db
ec10: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
ec20: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
ec30: 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  .  }..exit_drop_
ec40: 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 53  index:.  sqliteS
ec50: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61  rcListDelete(pNa
ec60: 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  me);.}../*.** Ap
ec70: 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65  pend a new eleme
ec80: 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  nt to the given 
ec90: 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  IdList.  Create 
eca0: 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a  a new IdList if.
ecb0: 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a  ** need be..**.*
ecc0: 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69  * A new IdList i
ecd0: 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
ece0: 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  ULL if malloc() 
ecf0: 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74  fails..*/.IdList
ed00: 20 2a 73 71 6c 69 74 65 49 64 4c 69 73 74 41 70   *sqliteIdListAp
ed10: 70 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69  pend(IdList *pLi
ed20: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
ed30: 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  n){.  if( pList=
ed40: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
ed50: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
ed60: 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29  sizeof(IdList) )
ed70: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
ed80: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
ed90: 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
eda0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
edb0: 70 4c 69 73 74 2d 3e 6e 49 64 3e 3d 70 4c 69 73  pList->nId>=pLis
edc0: 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  t->nAlloc ){.   
edd0: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
ede0: 74 65 6d 20 2a 61 3b 0a 20 20 20 20 70 4c 69 73  tem *a;.    pLis
edf0: 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4c 69 73  t->nAlloc = pLis
ee00: 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b  t->nAlloc*2 + 5;
ee10: 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52  .    a = sqliteR
ee20: 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c  ealloc(pList->a,
ee30: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73   pList->nAlloc*s
ee40: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
ee50: 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 3d  ]) );.    if( a=
ee60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
ee70: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  teIdListDelete(p
ee80: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
ee90: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
eea0: 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20   pList->a = a;. 
eeb0: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c 69   }.  memset(&pLi
eec0: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64  st->a[pList->nId
eed0: 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69  ], 0, sizeof(pLi
eee0: 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66  st->a[0]));.  if
eef0: 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  ( pToken ){.    
ef00: 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69  char **pz = &pLi
ef10: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64  st->a[pList->nId
ef20: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c  ].zName;.    sql
ef30: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a  iteSetNString(pz
ef40: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
ef50: 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20  ken->n, 0);.    
ef60: 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20  if( *pz==0 ){.  
ef70: 20 20 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74      sqliteIdList
ef80: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
ef90: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
efa0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
efb0: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70  sqliteDequote(*p
efc0: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  z);.    }.  }.  
efd0: 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20  pList->nId++;.  
efe0: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
eff0: 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
f000: 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  new table name t
f010: 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  o the given SrcL
f020: 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
f030: 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a  ew SrcList if.**
f040: 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77   need be.  A new
f050: 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65   entry is create
f060: 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  d in the SrcList
f070: 20 65 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20   even if pToken 
f080: 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41  is NULL..**.** A
f090: 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 73 20   new SrcList is 
f0a0: 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
f0b0: 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  L if malloc() fa
f0c0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  ils..**.** If pD
f0d0: 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e  atabase is not n
f0e0: 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ull, it means th
f0f0: 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  at the table has
f100: 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20   an optional.** 
f110: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72  database name pr
f120: 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73  efix.  Like this
f130: 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62  :  "database.tab
f140: 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62  le".  The pDatab
f150: 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  ase.** points to
f160: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
f170: 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70  and the pTable p
f180: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74  oints to the dat
f190: 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54  abase name..** T
f1a0: 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  he SrcList.a[].z
f1b0: 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69  Name field is fi
f1c0: 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61  lled with the ta
f1d0: 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d  ble name which m
f1e0: 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f  ight.** come fro
f1f0: 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61  m pTable (if pDa
f200: 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20  tabase is NULL) 
f210: 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73  or from pDatabas
f220: 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e  e.  .** SrcList.
f230: 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73  a[].zDatabase is
f240: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
f250: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66   database name f
f260: 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f  rom pTable,.** o
f270: 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e  r with NULL if n
f280: 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70  o database is sp
f290: 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ecified..**.** I
f2a0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
f2b0: 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73  f call like this
f2c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
f2d0: 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41 70 70  sqliteSrcListApp
f2e0: 65 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a  end(A,B,0);.**.*
f2f0: 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61  * Then B is a ta
f300: 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
f310: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
f320: 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20  s unspecified.  
f330: 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b  If called.** lik
f340: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
f350: 20 20 20 20 20 20 73 71 6c 69 74 65 53 72 63 4c        sqliteSrcL
f360: 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 43 29  istAppend(A,B,C)
f370: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69  ;.**.** Then C i
f380: 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  s the table name
f390: 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61   and B is the da
f3a0: 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a  tabase name..*/.
f3b0: 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 53  SrcList *sqliteS
f3c0: 72 63 4c 69 73 74 41 70 70 65 6e 64 28 53 72 63  rcListAppend(Src
f3d0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
f3e0: 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65  en *pTable, Toke
f3f0: 6e 20 2a 70 44 61 74 61 62 61 73 65 29 7b 0a 20  n *pDatabase){. 
f400: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
f410: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
f420: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
f430: 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20  f(SrcList) );.  
f440: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
f450: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
f460: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31  List->nAlloc = 1
f470: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
f480: 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e  t->nSrc>=pList->
f490: 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72  nAlloc ){.    Sr
f4a0: 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20  cList *pNew;.   
f4b0: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a   pList->nAlloc *
f4c0: 3d 20 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  = 2;.    pNew = 
f4d0: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
f4e0: 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ist,.           
f4f0: 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73      sizeof(*pLis
f500: 74 29 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c  t) + (pList->nAl
f510: 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c  loc-1)*sizeof(pL
f520: 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  ist->a[0]) );.  
f530: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
f540: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 72 63  .      sqliteSrc
f550: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
f560: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
f570: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  0;.    }.    pLi
f580: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  st = pNew;.  }. 
f590: 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e   memset(&pList->
f5a0: 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2c 20  a[pList->nSrc], 
f5b0: 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  0, sizeof(pList-
f5c0: 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70  >a[0]));.  if( p
f5d0: 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74  Database && pDat
f5e0: 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  abase->z==0 ){. 
f5f0: 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30     pDatabase = 0
f600: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74  ;.  }.  if( pDat
f610: 61 62 61 73 65 20 26 26 20 70 54 61 62 6c 65 20  abase && pTable 
f620: 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  ){.    Token *pT
f630: 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b  emp = pDatabase;
f640: 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
f650: 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61   pTable;.    pTa
f660: 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d  ble = pTemp;.  }
f670: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b  .  if( pTable ){
f680: 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d  .    char **pz =
f690: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
f6a0: 2d 3e 6e 53 72 63 5d 2e 7a 4e 61 6d 65 3b 0a 20  ->nSrc].zName;. 
f6b0: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
f6c0: 69 6e 67 28 70 7a 2c 20 70 54 61 62 6c 65 2d 3e  ing(pz, pTable->
f6d0: 7a 2c 20 70 54 61 62 6c 65 2d 3e 6e 2c 20 30 29  z, pTable->n, 0)
f6e0: 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30  ;.    if( *pz==0
f6f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f700: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  SrcListDelete(pL
f710: 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ist);.      retu
f720: 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rn 0;.    }else{
f730: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 71  .      sqliteDeq
f740: 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d  uote(*pz);.    }
f750: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61  .  }.  if( pData
f760: 62 61 73 65 20 29 7b 0a 20 20 20 20 63 68 61 72  base ){.    char
f770: 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e   **pz = &pList->
f780: 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a  a[pList->nSrc].z
f790: 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20 73 71  Database;.    sq
f7a0: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70  liteSetNString(p
f7b0: 7a 2c 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 2c  z, pDatabase->z,
f7c0: 20 70 44 61 74 61 62 61 73 65 2d 3e 6e 2c 20 30   pDatabase->n, 0
f7d0: 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d  );.    if( *pz==
f7e0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
f7f0: 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  eSrcListDelete(p
f800: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
f810: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
f820: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65  {.      sqliteDe
f830: 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20  quote(*pz);.    
f840: 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61  }.  }.  pList->a
f850: 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 69 43  [pList->nSrc].iC
f860: 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 4c  ursor = -1;.  pL
f870: 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72  ist->nSrc++;.  r
f880: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
f890: 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75 72  /*.** Assign cur
f8a0: 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c  sors to all tabl
f8b0: 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a  es in a SrcList.
f8c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 72  */.void sqliteSr
f8d0: 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
f8e0: 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
f8f0: 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  , SrcList *pList
f900: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
f910: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
f920: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
f930: 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
f940: 69 43 75 72 73 6f 72 3c 30 20 29 7b 0a 20 20 20  iCursor<0 ){.   
f950: 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69     pList->a[i].i
f960: 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
f970: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 0a 20  >nTab++;.    }. 
f980: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
f990: 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20  an alias to the 
f9a0: 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65 72 20  last identifier 
f9b0: 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69 64 65  on the given ide
f9c0: 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f  ntifier list..*/
f9d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 72 63 4c  .void sqliteSrcL
f9e0: 69 73 74 41 64 64 41 6c 69 61 73 28 53 72 63 4c  istAddAlias(SrcL
f9f0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
fa00: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
fa10: 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74  ( pList && pList
fa20: 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ->nSrc>0 ){.    
fa30: 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e  int i = pList->n
fa40: 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 73 71 6c  Src - 1;.    sql
fa50: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
fa60: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61  List->a[i].zAlia
fa70: 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54  s, pToken->z, pT
fa80: 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  oken->n, 0);.   
fa90: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 70   sqliteDequote(p
faa0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61  List->a[i].zAlia
fab0: 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  s);.  }.}../*.**
fac0: 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73   Delete an IdLis
fad0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
fae0: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64  eIdListDelete(Id
faf0: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
fb00: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
fb10: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
fb20: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
fb30: 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
fb40: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
fb50: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
fb60: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
fb70: 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  ee(pList->a);.  
fb80: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
fb90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
fba0: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  rn the index in 
fbb0: 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65  pList of the ide
fbc0: 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49  ntifier named zI
fbd0: 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  d.  Return -1.**
fbe0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
fbf0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 49 64 4c 69  /.int sqliteIdLi
fc00: 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a  stIndex(IdList *
fc10: 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61  pList, const cha
fc20: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
fc30: 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
fc40: 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  =0 ) return -1;.
fc50: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
fc60: 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
fc70: 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72     if( sqliteStr
fc80: 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
fc90: 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
fca0: 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
fcb0: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
fcc0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
fcd0: 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74  n entire SrcList
fce0: 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69   including all i
fcf0: 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 2e  ts substructure.
fd00: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53  .*/.void sqliteS
fd10: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53 72 63  rcListDelete(Src
fd20: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
fd30: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
fd40: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
fd50: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
fd60: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
fd70: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
fd80: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 44 61 74 61  List->a[i].zData
fd90: 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  base);.    sqlit
fda0: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  eFree(pList->a[i
fdb0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ].zName);.    sq
fdc0: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
fdd0: 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20  a[i].zAlias);.  
fde0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
fdf0: 5d 2e 70 54 61 62 20 26 26 20 70 4c 69 73 74 2d  ].pTab && pList-
fe00: 3e 61 5b 69 5d 2e 70 54 61 62 2d 3e 69 73 54 72  >a[i].pTab->isTr
fe10: 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20  ansient ){.     
fe20: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
fe30: 6c 65 28 30 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  le(0, pList->a[i
fe40: 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  ].pTab);.    }. 
fe50: 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44     sqliteSelectD
fe60: 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  elete(pList->a[i
fe70: 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ].pSelect);.    
fe80: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
fe90: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 4f 6e  (pList->a[i].pOn
fea0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 49 64 4c  );.    sqliteIdL
feb0: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 2d  istDelete(pList-
fec0: 3e 61 5b 69 5d 2e 70 55 73 69 6e 67 29 3b 0a 20  >a[i].pUsing);. 
fed0: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
fee0: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
fef0: 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63   Begin a transac
ff00: 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
ff10: 69 74 65 42 65 67 69 6e 54 72 61 6e 73 61 63 74  iteBeginTransact
ff20: 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
ff30: 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b  e, int onError){
ff40: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a  .  sqlite *db;..
ff50: 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
ff60: 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
ff70: 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62  b)==0 || db->aDb
ff80: 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74  [0].pBt==0 ) ret
ff90: 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
ffa0: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
ffb0: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
ffc0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
ffd0: 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28  sqliteAuthCheck(
ffe0: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
fff0: 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47  RANSACTION, "BEG
10000 49 4e 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  IN", 0, 0) ) ret
10010 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66  urn;.  if( db->f
10020 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
10030 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 73 71 6c  Trans ){.    sql
10040 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72  iteErrorMsg(pPar
10050 73 65 2c 20 22 63 61 6e 6e 6f 74 20 73 74 61 72  se, "cannot star
10060 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
10070 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
10080 74 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74 75  tion");.    retu
10090 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
100a0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
100b0 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 30  ion(pParse, 0, 0
100c0 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  );.  db->flags |
100d0 3d 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  = SQLITE_InTrans
100e0 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20  ;.  db->onError 
100f0 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a  = onError;.}../*
10100 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61  .** Commit a tra
10110 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
10120 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74 54 72 61   sqliteCommitTra
10130 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
10140 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
10150 65 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 50  e *db;..  if( pP
10160 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
10170 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
10180 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
10190 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
101a0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
101b0 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  || sqlite_malloc
101c0 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  _failed ) return
101d0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 41 75  ;.  if( sqliteAu
101e0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
101f0 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
10200 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  ON, "COMMIT", 0,
10210 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   0) ) return;.  
10220 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
10230 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29   SQLITE_InTrans)
10240 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
10250 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
10260 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74  , "cannot commit
10270 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f   - no transactio
10280 6e 20 69 73 20 61 63 74 69 76 65 22 29 3b 0a 20  n is active");. 
10290 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
102a0 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
102b0 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20  QLITE_InTrans;. 
102c0 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
102d0 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
102e0 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20  ;.  db->onError 
102f0 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a  = OE_Default;.}.
10300 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
10310 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
10320 0a 76 6f 69 64 20 73 71 6c 69 74 65 52 6f 6c 6c  .void sqliteRoll
10330 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
10340 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
10350 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20    sqlite *db;.  
10360 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
10370 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
10380 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
10390 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
103a0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
103b0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
103c0 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c  r || sqlite_mall
103d0 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
103e0 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
103f0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
10400 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
10410 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  TION, "ROLLBACK"
10420 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
10430 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61  ;.  if( (db->fla
10440 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72  gs & SQLITE_InTr
10450 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ans)==0 ){.    s
10460 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
10470 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 72 6f  arse, "cannot ro
10480 6c 6c 62 61 63 6b 20 2d 20 6e 6f 20 74 72 61 6e  llback - no tran
10490 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
104a0 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  e");.    return;
104b0 20 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69   .  }.  v = sqli
104c0 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
104d0 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
104e0 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
104f0 70 28 76 2c 20 4f 50 5f 52 6f 6c 6c 62 61 63 6b  p(v, OP_Rollback
10500 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 64  , 0, 0);.  }.  d
10510 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
10520 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 64  ITE_InTrans;.  d
10530 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f  b->onError = OE_
10540 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  Default;.}../*.*
10550 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
10560 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76  code that will v
10570 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61  erify the schema
10580 20 63 6f 6f 6b 69 65 20 66 6f 72 20 61 6c 6c 0a   cookie for all.
10590 2a 2a 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  ** named databas
105a0 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 76 6f 69 64  e files..*/.void
105b0 20 73 71 6c 69 74 65 43 6f 64 65 56 65 72 69 66   sqliteCodeVerif
105c0 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70  ySchema(Parse *p
105d0 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
105e0 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
105f0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
10600 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65  be *v = sqliteGe
10610 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
10620 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
10630 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
10640 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
10650 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20  aDb[iDb].pBt!=0 
10660 29 3b 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20  );.  if( iDb!=1 
10670 26 26 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  && !DbHasPropert
10680 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 43 6f  y(db, iDb, DB_Co
10690 6f 6b 69 65 29 20 29 7b 0a 20 20 20 20 73 71 6c  okie) ){.    sql
106a0 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
106b0 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c  OP_VerifyCookie,
106c0 20 69 44 62 2c 20 64 62 2d 3e 61 44 62 5b 69 44   iDb, db->aDb[iD
106d0 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  b].schema_cookie
106e0 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70  );.    DbSetProp
106f0 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42  erty(db, iDb, DB
10700 5f 43 6f 6f 6b 69 65 29 3b 0a 20 20 7d 0a 7d 0a  _Cookie);.  }.}.
10710 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
10720 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70  VDBE code that p
10730 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e  repares for doin
10740 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74  g an operation t
10750 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61  hat.** might cha
10760 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nge the database
10770 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
10780 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65  tine starts a ne
10790 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  w transaction if
107a0 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
107b0 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20  ady within.** a 
107c0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
107d0 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
107e0 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
107f0 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65  tion, then a che
10800 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65  ckpoint.** is se
10810 74 20 69 66 20 74 68 65 20 73 65 74 43 68 65 63  t if the setChec
10820 6b 70 6f 69 6e 74 20 70 61 72 61 6d 65 74 65 72  kpoint parameter
10830 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65   is true.  A che
10840 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a  ckpoint should.*
10850 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65  * be set for ope
10860 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67  rations that mig
10870 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20  ht fail (due to 
10880 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61  a constraint) pa
10890 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79  rt of.** the way
108a0 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69   through and whi
108b0 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  ch will need to 
108c0 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73  undo some writes
108d0 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
108e0 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74  to.** rollback t
108f0 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63  he whole transac
10900 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61  tion.  For opera
10910 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20  tions where all 
10920 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63  constraints.** c
10930 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65  an be checked be
10940 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
10950 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65   are made to the
10960 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73   database, it is
10970 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73   never.** necess
10980 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72  ary to undo a wr
10990 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63  ite and the chec
109a0 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f  kpoint should no
109b0 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  t be set..**.** 
109c0 4f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 69 44  Only database iD
109d0 62 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64  b and the temp d
109e0 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 64 65  atabase are made
109f0 20 77 72 69 74 61 62 6c 65 20 62 79 20 74 68 69   writable by thi
10a00 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44  s call..** If iD
10a10 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 6d  b==0, then the m
10a20 61 69 6e 20 61 6e 64 20 74 65 6d 70 20 64 61 74  ain and temp dat
10a30 61 62 61 73 65 73 20 61 72 65 20 6d 61 64 65 20  abases are made 
10a40 77 72 69 74 61 62 6c 65 2e 20 20 20 49 66 0a 2a  writable.   If.*
10a50 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e 20 6f 6e  * iDb==1 then on
10a60 6c 79 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ly the temp data
10a70 62 61 73 65 20 69 73 20 6d 61 64 65 20 77 72 69  base is made wri
10a80 74 61 62 6c 65 2e 20 20 49 66 20 69 44 62 3e 31  table.  If iDb>1
10a90 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73 70 65   then the.** spe
10aa0 63 69 66 69 65 64 20 61 75 78 69 6c 69 61 72 79  cified auxiliary
10ab0 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
10ac0 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
10ad0 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c  are made writabl
10ae0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
10af0 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  eBeginWriteOpera
10b00 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
10b10 73 65 2c 20 69 6e 74 20 73 65 74 43 68 65 63 6b  se, int setCheck
10b20 70 6f 69 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b  point, int iDb){
10b30 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
10b40 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
10b50 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 44 62 48  e->db;.  if( DbH
10b60 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  asProperty(db, i
10b70 44 62 2c 20 44 42 5f 4c 6f 63 6b 65 64 29 20 29  Db, DB_Locked) )
10b80 20 72 65 74 75 72 6e 3b 0a 20 20 76 20 3d 20 73   return;.  v = s
10b90 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
10ba0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
10bb0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
10bc0 20 21 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 69   !db->aDb[iDb].i
10bd0 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 73 71  nTrans ){.    sq
10be0 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
10bf0 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
10c00 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 44 62   iDb, 0);.    Db
10c10 53 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20  SetProperty(db, 
10c20 69 44 62 2c 20 44 42 5f 4c 6f 63 6b 65 64 29 3b  iDb, DB_Locked);
10c30 0a 20 20 20 20 73 71 6c 69 74 65 43 6f 64 65 56  .    sqliteCodeV
10c40 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
10c50 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66  se, iDb);.    if
10c60 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20  ( iDb!=1 ){.    
10c70 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69    sqliteBeginWri
10c80 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
10c90 73 65 2c 20 73 65 74 43 68 65 63 6b 70 6f 69 6e  se, setCheckpoin
10ca0 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t, 1);.    }.  }
10cb0 65 6c 73 65 20 69 66 28 20 73 65 74 43 68 65 63  else if( setChec
10cc0 6b 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 73 71  kpoint ){.    sq
10cd0 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
10ce0 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 2c 20   OP_Checkpoint, 
10cf0 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 44 62 53  iDb, 0);.    DbS
10d00 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  etProperty(db, i
10d10 44 62 2c 20 44 42 5f 4c 6f 63 6b 65 64 29 3b 0a  Db, DB_Locked);.
10d20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
10d30 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
10d40 63 6f 6e 63 6c 75 64 65 73 20 61 6e 20 6f 70 65  concludes an ope
10d50 72 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 79 20  ration that may 
10d60 68 61 76 65 20 63 68 61 6e 67 65 64 0a 2a 2a 20  have changed.** 
10d70 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
10d80 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  f a statement tr
10d90 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74  ansaction was st
10da0 61 72 74 65 64 2c 20 74 68 65 6e 20 65 6d 69 74  arted, then emit
10db0 0a 2a 2a 20 61 6e 20 4f 50 5f 43 6f 6d 6d 69 74  .** an OP_Commit
10dc0 20 74 68 61 74 20 77 69 6c 6c 20 63 61 75 73 65   that will cause
10dd0 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
10de0 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20  be committed to 
10df0 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  disk..**.** Note
10e00 20 74 68 61 74 20 63 68 65 63 6b 70 6f 69 6e 74   that checkpoint
10e10 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
10e20 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 20 61 74  lly committed at
10e30 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 61   the end of.** a
10e40 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4e 6f 74   statement.  Not
10e50 65 20 61 6c 73 6f 20 74 68 61 74 20 74 68 65 72  e also that ther
10e60 65 20 63 61 6e 20 62 65 20 6d 75 6c 74 69 70 6c  e can be multipl
10e70 65 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73  e calls to .** s
10e80 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
10e90 70 65 72 61 74 69 6f 6e 28 29 20 62 75 74 20 74  peration() but t
10ea0 68 65 72 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  here should only
10eb0 20 62 65 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20   be a single.** 
10ec0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 45 6e  call to sqliteEn
10ed0 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
10ee0 29 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  ) at the conclus
10ef0 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65  ion of the state
10f00 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
10f10 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
10f20 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ation(Parse *pPa
10f30 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  rse){.  Vdbe *v;
10f40 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
10f50 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
10f60 28 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74  ( pParse->trigSt
10f70 61 63 6b 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a  ack ) return; /*
10f80 20 69 66 20 74 68 69 73 20 69 73 20 69 6e 20 61   if this is in a
10f90 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 76 20   trigger */.  v 
10fa0 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
10fb0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
10fc0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
10fd0 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
10fe0 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29  SQLITE_InTrans )
10ff0 7b 0a 20 20 20 20 2f 2a 20 41 20 42 45 47 49 4e  {.    /* A BEGIN
11000 20 68 61 73 20 65 78 65 63 75 74 65 64 2e 20 20   has executed.  
11010 44 6f 20 6e 6f 74 20 63 6f 6d 6d 69 74 20 75 6e  Do not commit un
11020 74 69 6c 20 77 65 20 73 65 65 20 61 6e 20 65 78  til we see an ex
11030 70 6c 69 63 69 74 0a 20 20 20 20 2a 2a 20 43 4f  plicit.    ** CO
11040 4d 4d 49 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  MMIT statement. 
11050 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
11060 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
11070 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c  v, OP_Commit, 0,
11080 20 30 29 3b 0a 20 20 7d 0a 7d 0a                  0);.  }.}.