/ Hex Artifact Content
Login

Artifact 4b95b200515d1f6ffc4ae60d5d57380afa0b4081:


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 33 20 32 30 30 34 2f 30 31 2f 31 36 20 32  163 2004/01/16 2
0300: 30 3a 30 31 3a 33 31 20 64 72 68 20 45 78 70 20  0:01:31 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 26 26 20 70 50 61 72  lback==0 && pPar
0a30: 73 65 2d 3e 75 73 65 43 61 6c 6c 62 61 63 6b 20  se->useCallback 
0a40: 29 20 78 43 61 6c 6c 62 61 63 6b 20 3d 20 66 61  ) xCallback = fa
0a50: 6b 65 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 69 66  keCallback;.  if
0a60: 28 20 76 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  ( v && pParse->n
0a70: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49  Err==0 ){.    FI
0a80: 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d  LE *trace = (db-
0a90: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
0aa0: 56 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20  VdbeTrace)!=0 ? 
0ab0: 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20  stdout : 0;.    
0ac0: 73 71 6c 69 74 65 56 64 62 65 54 72 61 63 65 28  sqliteVdbeTrace(
0ad0: 76 2c 20 74 72 61 63 65 29 3b 0a 20 20 20 20 73  v, trace);.    s
0ae0: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 52 65 61  qliteVdbeMakeRea
0af0: 64 79 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56  dy(v, pParse->nV
0b00: 61 72 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20 70  ar, xCallback, p
0b10: 50 61 72 73 65 2d 3e 70 41 72 67 2c 0a 20 20 20  Parse->pArg,.   
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b30: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 65 78 70       pParse->exp
0b40: 6c 61 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 70  lain);.    if( p
0b50: 50 61 72 73 65 2d 3e 75 73 65 43 61 6c 6c 62 61  Parse->useCallba
0b60: 63 6b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ck ){.      if( 
0b70: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
0b80: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
0b90: 73 71 6c 69 74 65 56 64 62 65 4c 69 73 74 28 76  sqliteVdbeList(v
0ba0: 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  );.        db->n
0bb0: 65 78 74 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d  ext_cookie = db-
0bc0: 3e 61 44 62 5b 30 5d 2e 73 63 68 65 6d 61 5f 63  >aDb[0].schema_c
0bd0: 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 7d 65 6c  ookie;.      }el
0be0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
0bf0: 74 65 56 64 62 65 45 78 65 63 28 76 29 3b 0a 20  teVdbeExec(v);. 
0c00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
0c10: 3d 20 73 71 6c 69 74 65 56 64 62 65 46 69 6e 61  = sqliteVdbeFina
0c20: 6c 69 7a 65 28 76 2c 20 26 70 50 61 72 73 65 2d  lize(v, &pParse-
0c30: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  >zErrMsg);.     
0c40: 20 69 66 28 20 72 63 20 29 20 70 50 61 72 73 65   if( rc ) pParse
0c50: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
0c60: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
0c70: 30 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  0;.      pParse-
0c80: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
0c90: 69 66 28 20 72 63 20 29 20 70 50 61 72 73 65 2d  if( rc ) pParse-
0ca0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 65 6c  >nErr++;.    }el
0cb0: 73 65 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65  se{.      pParse
0cc0: 2d 3e 72 63 20 3d 20 70 50 61 72 73 65 2d 3e 6e  ->rc = pParse->n
0cd0: 45 72 72 20 3f 20 53 51 4c 49 54 45 5f 45 52 52  Err ? SQLITE_ERR
0ce0: 4f 52 20 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  OR : SQLITE_DONE
0cf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
0d00: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
0d10: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
0d20: 20 70 50 61 72 73 65 2d 3e 75 73 65 43 61 6c 6c   pParse->useCall
0d30: 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 70  back==0 ){.    p
0d40: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
0d50: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
0d60: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30  pParse->nTab = 0
0d70: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
0d80: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
0d90: 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72  nSet = 0;.  pPar
0da0: 73 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a 20 20  se->nAgg = 0;.  
0db0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30  pParse->nVar = 0
0dc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
0dd0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
0de0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
0df0: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
0e00: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
0e10: 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  se table given t
0e20: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68  he name.** of th
0e30: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
0e40: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
0e50: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
0e60: 73 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  se.** containing
0e70: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
0e80: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
0e90: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  found..**.** If 
0ea0: 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20  zDatabase is 0, 
0eb0: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72  all databases ar
0ec0: 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
0ed0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  he.** table and 
0ee0: 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
0ef0: 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75  ng table is retu
0f00: 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b  rned.  (No check
0f10: 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69  ing.** for dupli
0f20: 63 61 74 65 20 74 61 62 6c 65 20 6e 61 6d 65 73  cate table names
0f30: 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20   is done.)  The 
0f40: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a  search order is.
0f50: 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74  ** TEMP first, t
0f60: 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61  hen MAIN, then a
0f70: 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ny auxiliary dat
0f80: 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20  abases added.** 
0f90: 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48  using the ATTACH
0fa0: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
0fb0: 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 4c  See also sqliteL
0fc0: 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f  ocateTable()..*/
0fd0: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 46 69  .Table *sqliteFi
0fe0: 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 20 2a  ndTable(sqlite *
0ff0: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
1000: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
1010: 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20  r *zDatabase){. 
1020: 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20   Table *p = 0;. 
1030: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1040: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
1050: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20  +){.    int j = 
1060: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
1070: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d     /* Search TEM
1080: 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f  P before MAIN */
1090: 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61  .    if( zDataba
10a0: 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 53  se!=0 && sqliteS
10b0: 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65  trICmp(zDatabase
10c0: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61  , db->aDb[j].zNa
10d0: 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  me) ) continue;.
10e0: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 48 61      p = sqliteHa
10f0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b  shFind(&db->aDb[
1100: 6a 5d 2e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d  j].tblHash, zNam
1110: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
1120: 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  +1);.    if( p )
1130: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
1140: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1150: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
1160: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
1170: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a  that describes .
1180: 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ** a particular 
1190: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 67  database table g
11a0: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  iven the name.**
11b0: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
11c0: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
11d0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
11e0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 74  database.** cont
11f0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
1200: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
1210: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 20  f not found..** 
1220: 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 20 65 72  Also leave an er
1230: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
1240: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
1250: 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
1260: 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
1270: 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71  s routine and sq
1280: 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 29 0a  liteFindTable().
1290: 2a 2a 20 69 73 20 74 68 61 74 20 74 68 69 73 20  ** is that this 
12a0: 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61  routine leaves a
12b0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
12c0: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
12d0: 73 67 0a 2a 2a 20 77 68 65 72 65 20 73 71 6c 69  sg.** where sqli
12e0: 74 65 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f  teFindTable() do
12f0: 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65  es not..*/.Table
1300: 20 2a 73 71 6c 69 74 65 4c 6f 63 61 74 65 54 61   *sqliteLocateTa
1310: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
1320: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1330: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
1340: 20 2a 7a 44 62 61 73 65 29 7b 0a 20 20 54 61 62   *zDbase){.  Tab
1350: 6c 65 20 2a 70 3b 0a 0a 20 20 70 20 3d 20 73 71  le *p;..  p = sq
1360: 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50  liteFindTable(pP
1370: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  arse->db, zName,
1380: 20 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20   zDbase);.  if( 
1390: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  p==0 ){.    if( 
13a0: 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  zDbase ){.      
13b0: 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
13c0: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
13d0: 74 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20 7a  table: %s.%s", z
13e0: 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  Dbase, zName);. 
13f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
1400: 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50 61  iteFindTable(pPa
1410: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  rse->db, zName, 
1420: 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  0)!=0 ){.      s
1430: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
1440: 61 72 73 65 2c 20 22 74 61 62 6c 65 20 5c 22 25  arse, "table \"%
1450: 73 5c 22 20 69 73 20 6e 6f 74 20 69 6e 20 64 61  s\" is not in da
1460: 74 61 62 61 73 65 20 5c 22 25 73 5c 22 22 2c 0a  tabase \"%s\"",.
1470: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20           zName, 
1480: 7a 44 62 61 73 65 29 3b 0a 20 20 20 20 7d 65 6c  zDbase);.    }el
1490: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
14a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
14b0: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
14c0: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
14d0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
14e0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63   p;.}../*.** Loc
14f0: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
1500: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
1510: 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61   describes .** a
1520: 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65   particular inde
1530: 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  x given the name
1540: 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a   of that index.*
1550: 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f  * and the name o
1560: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
1570: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
1580: 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72   index..** Retur
1590: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
15a0: 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44  und..**.** If zD
15b0: 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c  atabase is 0, al
15c0: 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  l databases are 
15d0: 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65  searched for the
15e0: 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68  .** table and th
15f0: 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
1600: 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e   index is return
1610: 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e  ed.  (No checkin
1620: 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61  g.** for duplica
1630: 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69  te index names i
1640: 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65  s done.)  The se
1650: 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a  arch order is.**
1660: 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65   TEMP first, the
1670: 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79  n MAIN, then any
1680: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
1690: 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73  ases added.** us
16a0: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
16b0: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78  ommand..*/.Index
16c0: 20 2a 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65   *sqliteFindInde
16d0: 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f  x(sqlite *db, co
16e0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
16f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1700: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
1710: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  0;.  int i;.  fo
1720: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
1730: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
1740: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
1750: 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20  : i;  /* Search 
1760: 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e  TEMP before MAIN
1770: 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 20   */.    if( zDb 
1780: 26 26 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  && sqliteStrICmp
1790: 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d  (zDb, db->aDb[j]
17a0: 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e  .zName) ) contin
17b0: 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  ue;.    p = sqli
17c0: 74 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  teHashFind(&db->
17d0: 61 44 62 5b 6a 5d 2e 69 64 78 48 61 73 68 2c 20  aDb[j].idxHash, 
17e0: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
17f0: 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28  ame)+1);.    if(
1800: 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   p ) break;.  }.
1810: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
1820: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
1830: 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d  given index from
1840: 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20   the index hash 
1850: 74 61 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a  table, and free.
1860: 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74  ** its memory st
1870: 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  ructures..**.** 
1880: 54 68 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d  The index is rem
1890: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  oved from the da
18a0: 74 61 62 61 73 65 20 68 61 73 68 20 74 61 62 6c  tabase hash tabl
18b0: 65 73 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20  es but.** it is 
18c0: 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  not unlinked fro
18d0: 6d 20 74 68 65 20 54 61 62 6c 65 20 74 68 61 74  m the Table that
18e0: 20 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20   it indexes..** 
18f0: 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74  Unlinking from t
1900: 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65  he Table must be
1910: 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c   done by the cal
1920: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
1930: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
1940: 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28  liteDeleteIndex(
1950: 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65  sqlite *db, Inde
1960: 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a  x *p){.  Index *
1970: 70 4f 6c 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  pOld;..  assert(
1980: 20 64 62 21 3d 30 20 26 26 20 70 2d 3e 7a 4e 61   db!=0 && p->zNa
1990: 6d 65 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20  me!=0 );.  pOld 
19a0: 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65  = sqliteHashInse
19b0: 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69  rt(&db->aDb[p->i
19c0: 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 2d 3e  Db].idxHash, p->
19d0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65   strlen(p->zName
1a00: 29 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  )+1, 0);.  if( p
1a10: 4f 6c 64 21 3d 30 20 26 26 20 70 4f 6c 64 21 3d  Old!=0 && pOld!=
1a20: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 48  p ){.    sqliteH
1a30: 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61  ashInsert(&db->a
1a40: 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61  Db[p->iDb].idxHa
1a50: 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c  sh, pOld->zName,
1a60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a70: 20 20 20 20 20 20 73 74 72 6c 65 6e 28 70 4f 6c        strlen(pOl
1a80: 64 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c  d->zName)+1, pOl
1a90: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
1aa0: 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Free(p);.}../*.*
1ab0: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
1ac0: 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74  en index from it
1ad0: 73 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65  s table, then re
1ae0: 6d 6f 76 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65  move.** the inde
1af0: 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  x from the index
1b00: 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20   hash table and 
1b10: 66 72 65 65 20 69 74 73 20 6d 65 6d 6f 72 79 0a  free its memory.
1b20: 2a 2a 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  ** structures..*
1b30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 55 6e 6c  /.void sqliteUnl
1b40: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65  inkAndDeleteInde
1b50: 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e  x(sqlite *db, In
1b60: 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20  dex *pIndex){.  
1b70: 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  if( pIndex->pTab
1b80: 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64  le->pIndex==pInd
1b90: 65 78 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78  ex ){.    pIndex
1ba0: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
1bb0: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
1bc0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49  ;.  }else{.    I
1bd0: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 66 6f 72  ndex *p;.    for
1be0: 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  (p=pIndex->pTabl
1bf0: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20  e->pIndex; p && 
1c00: 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78  p->pNext!=pIndex
1c10: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a  ; p=p->pNext){}.
1c20: 20 20 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e      if( p && p->
1c30: 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b  pNext==pIndex ){
1c40: 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20  .      p->pNext 
1c50: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
1c60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1c70: 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64  iteDeleteIndex(d
1c80: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f  b, pIndex);.}../
1c90: 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73  *.** Erase all s
1ca0: 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f  chema informatio
1cb0: 6e 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65  n from the in-me
1cc0: 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73  mory hash tables
1cd0: 20 6f 66 0a 2a 2a 20 64 61 74 61 62 61 73 65 20   of.** database 
1ce0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69  connection.  Thi
1cf0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1d00: 6c 65 64 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d  led to reclaim m
1d10: 65 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20  emory.** before 
1d20: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  the connection c
1d30: 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61 6c  loses.  It is al
1d40: 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67  so called during
1d50: 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69   a rollback.** i
1d60: 66 20 74 68 65 72 65 20 77 65 72 65 20 73 63 68  f there were sch
1d70: 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72 69  ema changes duri
1d80: 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ng the transacti
1d90: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  on..**.** If iDb
1da0: 3c 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20 74  <=0 then reset t
1db0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
1dc0: 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c  ma tables for al
1dd0: 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  l database.** fi
1de0: 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20  les.  If iDb>=2 
1df0: 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69  then reset the i
1e00: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66  nternal schema f
1e10: 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73  or only the.** s
1e20: 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63  ingle file indic
1e30: 61 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ates..*/.void sq
1e40: 6c 69 74 65 52 65 73 65 74 49 6e 74 65 72 6e 61  liteResetInterna
1e50: 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65 20 2a  lSchema(sqlite *
1e60: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
1e70: 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b  HashElem *pElem;
1e80: 0a 20 20 48 61 73 68 20 74 65 6d 70 31 3b 0a 20  .  Hash temp1;. 
1e90: 20 48 61 73 68 20 74 65 6d 70 32 3b 0a 20 20 69   Hash temp2;.  i
1ea0: 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73 73 65  nt i, j;..  asse
1eb0: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
1ec0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 64  b<db->nDb );.  d
1ed0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
1ee0: 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 3b  ITE_Initialized;
1ef0: 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c  .  for(i=iDb; i<
1f00: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
1f10: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
1f20: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 74 65  ->aDb[i];.    te
1f30: 6d 70 31 20 3d 20 70 44 62 2d 3e 74 62 6c 48 61  mp1 = pDb->tblHa
1f40: 73 68 3b 0a 20 20 20 20 74 65 6d 70 32 20 3d 20  sh;.    temp2 = 
1f50: 70 44 62 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20  pDb->trigHash;. 
1f60: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 69     sqliteHashIni
1f70: 74 28 26 70 44 62 2d 3e 74 72 69 67 48 61 73 68  t(&pDb->trigHash
1f80: 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54  , SQLITE_HASH_ST
1f90: 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73 71  RING, 0);.    sq
1fa0: 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28 26 70  liteHashClear(&p
1fb0: 44 62 2d 3e 61 46 4b 65 79 29 3b 0a 20 20 20 20  Db->aFKey);.    
1fc0: 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28  sqliteHashClear(
1fd0: 26 70 44 62 2d 3e 69 64 78 48 61 73 68 29 3b 0a  &pDb->idxHash);.
1fe0: 20 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71      for(pElem=sq
1ff0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74  liteHashFirst(&t
2000: 65 6d 70 32 29 3b 20 70 45 6c 65 6d 3b 20 70 45  emp2); pElem; pE
2010: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
2020: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
2030: 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
2040: 67 65 72 20 3d 20 73 71 6c 69 74 65 48 61 73 68  ger = sqliteHash
2050: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
2060: 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54     sqliteDeleteT
2070: 72 69 67 67 65 72 28 70 54 72 69 67 67 65 72 29  rigger(pTrigger)
2080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2090: 74 65 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d  teHashClear(&tem
20a0: 70 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 48  p2);.    sqliteH
20b0: 61 73 68 49 6e 69 74 28 26 70 44 62 2d 3e 74 62  ashInit(&pDb->tb
20c0: 6c 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41  lHash, SQLITE_HA
20d0: 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20  SH_STRING, 0);. 
20e0: 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c     for(pElem=sql
20f0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74 65  iteHashFirst(&te
2100: 6d 70 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  mp1); pElem; pEl
2110: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
2120: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20  t(pElem)){.     
2130: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
2140: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
2150: 6c 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lem);.      sqli
2160: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  teDeleteTable(db
2170: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  , pTab);.    }. 
2180: 20 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65     sqliteHashCle
2190: 61 72 28 26 74 65 6d 70 31 29 3b 0a 20 20 20 20  ar(&temp1);.    
21a0: 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
21b0: 64 62 2c 20 69 2c 20 44 42 5f 53 63 68 65 6d 61  db, i, DB_Schema
21c0: 4c 6f 61 64 65 64 29 3b 0a 20 20 20 20 69 66 28  Loaded);.    if(
21d0: 20 69 44 62 3e 30 20 29 20 72 65 74 75 72 6e 3b   iDb>0 ) return;
21e0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69  .  }.  assert( i
21f0: 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66  Db==0 );.  db->f
2200: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
2210: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a  InternChanges;..
2220: 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d    /* If one or m
2230: 6f 72 65 20 6f 66 20 74 68 65 20 61 75 78 69 6c  ore of the auxil
2240: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  iary database fi
2250: 6c 65 73 20 68 61 73 20 62 65 65 6e 20 63 6c 6f  les has been clo
2260: 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  sed,.  ** then r
2270: 65 6d 6f 76 65 20 74 68 65 6e 20 66 72 6f 6d 20  emove then from 
2280: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
2290: 74 61 62 61 73 65 20 6c 69 73 74 2e 20 20 57 65  tabase list.  We
22a0: 20 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a 20 6f   take the.  ** o
22b0: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 64 6f  pportunity to do
22c0: 20 74 68 69 73 20 68 65 72 65 20 73 69 6e 63 65   this here since
22d0: 20 77 65 20 68 61 76 65 20 6a 75 73 74 20 64 65   we have just de
22e0: 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20 74 68 65  leted all of the
22f0: 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 68 61 73  .  ** schema has
2300: 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65  h tables and the
2310: 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20 68 61  refore do not ha
2320: 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 63  ve to make any c
2330: 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 61  hanges.  ** to a
2340: 6e 79 20 6f 66 20 74 68 6f 73 65 20 74 61 62 6c  ny of those tabl
2350: 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
2360: 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  =j=2; i<db->nDb;
2370: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64   i++){.    if( d
2380: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30  b->aDb[i].pBt==0
2390: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
23a0: 46 72 65 65 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  Free(db->aDb[i].
23b0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 64 62  zName);.      db
23c0: 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  ->aDb[i].zName =
23d0: 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   0;.      contin
23e0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
23f0: 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64  ( j<i ){.      d
2400: 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e  b->aDb[j] = db->
2410: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  aDb[i];.    }.  
2420: 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d    j++;.  }.  mem
2430: 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c  set(&db->aDb[j],
2440: 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a   0, (db->nDb-j)*
2450: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a  sizeof(db->aDb[j
2460: 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d  ]));.  db->nDb =
2470: 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44   j;.  if( db->nD
2480: 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21  b<=2 && db->aDb!
2490: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
24a0: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d  {.    memcpy(db-
24b0: 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e  >aDbStatic, db->
24c0: 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62  aDb, 2*sizeof(db
24d0: 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20  ->aDb[0]));.    
24e0: 73 71 6c 69 74 65 46 72 65 65 28 64 62 2d 3e 61  sqliteFree(db->a
24f0: 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Db);.    db->aDb
2500: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
2510: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
2520: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2530: 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61  alled whenever a
2540: 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
2550: 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
2560: 0a 2a 2a 20 73 63 68 65 6d 61 20 63 68 61 6e 67  .** schema chang
2570: 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72  es during the tr
2580: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
2590: 77 65 20 68 61 76 65 20 74 6f 20 72 65 73 65 74  we have to reset
25a0: 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c   the.** internal
25b0: 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64   hash tables and
25c0: 20 72 65 6c 6f 61 64 20 74 68 65 6d 20 66 72 6f   reload them fro
25d0: 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  m disk..*/.void 
25e0: 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 49 6e  sqliteRollbackIn
25f0: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
2600: 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 69 66 28  lite *db){.  if(
2610: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
2620: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
2630: 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 52  s ){.    sqliteR
2640: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
2650: 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d  ma(db, 0);.  }.}
2660: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2670: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
2680: 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63  hen a commit occ
2690: 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
26a0: 69 74 65 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  iteCommitInterna
26b0: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20  lChanges(sqlite 
26c0: 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 61 44 62 5b  *db){.  db->aDb[
26d0: 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  0].schema_cookie
26e0: 20 3d 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b   = db->next_cook
26f0: 69 65 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  ie;.  db->flags 
2700: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
2710: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
2720: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65  ** Remove the me
2730: 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74  mory data struct
2740: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
2750: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a  with the given.*
2760: 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61  * Table.  No cha
2770: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
2780: 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f   disk by this ro
2790: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  utine..**.** Thi
27a0: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64  s routine just d
27b0: 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20  eletes the data 
27c0: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64  structure.  It d
27d0: 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a  oes not unlink.*
27e0: 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61  * the table data
27f0: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
2800: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
2810: 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d   Nor does it rem
2820: 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b  ove.** foreign k
2830: 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  eys from the sql
2840: 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74  ite.aFKey hash t
2850: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
2860: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
2870: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
2880: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
2890: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
28a0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
28b0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
28c0: 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73  *.** Indices ass
28d0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
28e0: 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e   table are unlin
28f0: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62  ked from the "db
2900: 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74  ".** data struct
2910: 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e  ure if db!=NULL.
2920: 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69    If db==NULL, i
2930: 6e 64 69 63 65 73 20 61 74 74 61 63 68 65 64 20  ndices attached 
2940: 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  to.** the table 
2950: 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74  are deleted, but
2960: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
2970: 68 65 79 20 68 61 76 65 20 61 6c 72 65 61 64 79  hey have already
2980: 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65   been.** unlinke
2990: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
29a0: 65 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  eDeleteTable(sql
29b0: 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  ite *db, Table *
29c0: 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  pTable){.  int i
29d0: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ;.  Index *pInde
29e0: 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65  x, *pNext;.  FKe
29f0: 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74  y *pFKey, *pNext
2a00: 46 4b 65 79 3b 0a 0a 20 20 69 66 28 20 70 54 61  FKey;..  if( pTa
2a10: 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ble==0 ) return;
2a20: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  ..  /* Delete al
2a30: 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  l indices associ
2a40: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74  ated with this t
2a50: 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  able.  */.  for(
2a60: 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d  pIndex = pTable-
2a70: 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
2a80: 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a   pIndex=pNext){.
2a90: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64      pNext = pInd
2aa0: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61  ex->pNext;.    a
2ab0: 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 69  ssert( pIndex->i
2ac0: 44 62 3d 3d 70 54 61 62 6c 65 2d 3e 69 44 62 20  Db==pTable->iDb 
2ad0: 7c 7c 20 28 70 54 61 62 6c 65 2d 3e 69 44 62 3d  || (pTable->iDb=
2ae0: 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e 69 44  =0 && pIndex->iD
2af0: 62 3d 3d 31 29 20 29 3b 0a 20 20 20 20 73 71 6c  b==1) );.    sql
2b00: 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64  iteDeleteIndex(d
2b10: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
2b20: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c  .  /* Delete all
2b30: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73   foreign keys as
2b40: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
2b50: 69 73 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6b  is table.  The k
2b60: 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  eys.  ** should 
2b70: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
2b80: 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  n unlinked from 
2b90: 74 68 65 20 64 62 2d 3e 61 46 4b 65 79 20 68 61  the db->aFKey ha
2ba0: 73 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a 20  sh table .  */. 
2bb0: 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61 62 6c   for(pFKey=pTabl
2bc0: 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b  e->pFKey; pFKey;
2bd0: 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79   pFKey=pNextFKey
2be0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b 65 79  ){.    pNextFKey
2bf0: 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46   = pFKey->pNextF
2c00: 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rom;.    assert(
2c10: 20 70 54 61 62 6c 65 2d 3e 69 44 62 3c 64 62 2d   pTable->iDb<db-
2c20: 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65  >nDb );.    asse
2c30: 72 74 28 20 73 71 6c 69 74 65 48 61 73 68 46 69  rt( sqliteHashFi
2c40: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70 54 61 62  nd(&db->aDb[pTab
2c50: 6c 65 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 0a  le->iDb].aFKey,.
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c70: 20 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79             pFKey
2c80: 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46  ->zTo, strlen(pF
2c90: 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46  Key->zTo)+1)!=pF
2ca0: 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  Key );.    sqlit
2cb0: 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20  eFree(pFKey);.  
2cc0: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  }..  /* Delete t
2cd0: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
2ce0: 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a  re itself..  */.
2cf0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
2d00: 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  ble->nCol; i++){
2d10: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2d20: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e  pTable->aCol[i].
2d30: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
2d40: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
2d50: 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20  Col[i].zDflt);. 
2d60: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54     sqliteFree(pT
2d70: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54  able->aCol[i].zT
2d80: 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ype);.  }.  sqli
2d90: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a  teFree(pTable->z
2da0: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  Name);.  sqliteF
2db0: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
2dc0: 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63  );.  sqliteSelec
2dd0: 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e  tDelete(pTable->
2de0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
2df0: 74 65 46 72 65 65 28 70 54 61 62 6c 65 29 3b 0a  teFree(pTable);.
2e00: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
2e10: 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20  the given table 
2e20: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
2e30: 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c  bles and the del
2e40: 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  ete the.** table
2e50: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
2e60: 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20  all its indices 
2e70: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
2e80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2e90: 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64   sqliteUnlinkAnd
2ea0: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
2eb0: 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  te *db, Table *p
2ec0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64  ){.  Table *pOld
2ed0: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a  ;.  FKey *pF1, *
2ee0: 70 46 32 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  pF2;.  int i = p
2ef0: 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65 72 74 28  ->iDb;.  assert(
2f00: 20 64 62 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64   db!=0 );.  pOld
2f10: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73   = sqliteHashIns
2f20: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e  ert(&db->aDb[i].
2f30: 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  tblHash, p->zNam
2f40: 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61  e, strlen(p->zNa
2f50: 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73  me)+1, 0);.  ass
2f60: 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20  ert( pOld==0 || 
2f70: 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 6f 72  pOld==p );.  for
2f80: 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70  (pF1=p->pFKey; p
2f90: 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65  F1; pF1=pF1->pNe
2fa0: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 69 6e 74  xtFrom){.    int
2fb0: 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46   nTo = strlen(pF
2fc0: 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20  1->zTo) + 1;.   
2fd0: 20 70 46 32 20 3d 20 73 71 6c 69 74 65 48 61 73   pF2 = sqliteHas
2fe0: 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 69  hFind(&db->aDb[i
2ff0: 5d 2e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54  ].aFKey, pF1->zT
3000: 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 69 66 28  o, nTo);.    if(
3010: 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20   pF2==pF1 ){.   
3020: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73     sqliteHashIns
3030: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e  ert(&db->aDb[i].
3040: 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c  aFKey, pF1->zTo,
3050: 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78 74   nTo, pF1->pNext
3060: 54 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  To);.    }else{.
3070: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 32        while( pF2
3080: 20 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f   && pF2->pNextTo
3090: 21 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32  !=pF1 ){ pF2=pF2
30a0: 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20  ->pNextTo; }.   
30b0: 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a 20 20     if( pF2 ){.  
30c0: 20 20 20 20 20 20 70 46 32 2d 3e 70 4e 65 78 74        pF2->pNext
30d0: 54 6f 20 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54  To = pF1->pNextT
30e0: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
30f0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 6c  .  }.  sqliteDel
3100: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b  eteTable(db, p);
3110: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
3120: 75 63 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  uct the name of 
3130: 61 20 75 73 65 72 20 74 61 62 6c 65 20 6f 72 20  a user table or 
3140: 69 6e 64 65 78 20 66 72 6f 6d 20 61 20 74 6f 6b  index from a tok
3150: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  en..**.** Space 
3160: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65  to hold the name
3170: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
3180: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
3190: 20 61 6e 64 20 6d 75 73 74 0a 2a 2a 20 62 65 20   and must.** be 
31a0: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
31b0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
31c0: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 54 61  /.char *sqliteTa
31d0: 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  bleNameFromToken
31e0: 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a  (Token *pName){.
31f0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
3200: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e  sqliteStrNDup(pN
3210: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
3220: 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f  );.  sqliteDequo
3230: 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  te(zName);.  ret
3240: 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  urn zName;.}../*
3250: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
3260: 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 61 70  e to open the ap
3270: 70 72 6f 70 72 69 61 74 65 20 6d 61 73 74 65 72  propriate master
3280: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 74 61 62   table.  The tab
3290: 6c 65 0a 2a 2a 20 6f 70 65 6e 65 64 20 77 69 6c  le.** opened wil
32a0: 6c 20 62 65 20 53 51 4c 49 54 45 5f 4d 41 53 54  l be SQLITE_MAST
32b0: 45 52 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  ER for persisten
32c0: 74 20 74 61 62 6c 65 73 20 61 6e 64 20 0a 2a 2a  t tables and .**
32d0: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 4d 41 53   SQLITE_TEMP_MAS
32e0: 54 45 52 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  TER for temporar
32f0: 79 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 74  y tables.  The t
3300: 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 0a 2a  able is opened.*
3310: 2a 20 6f 6e 20 63 75 72 73 6f 72 20 30 2e 0a 2a  * on cursor 0..*
3320: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 4f 70 65  /.void sqliteOpe
3330: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 56 64 62  nMasterTable(Vdb
3340: 65 20 2a 76 2c 20 69 6e 74 20 69 73 54 65 6d 70  e *v, int isTemp
3350: 29 7b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  ){.  sqliteVdbeA
3360: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
3370: 65 72 2c 20 69 73 54 65 6d 70 2c 20 30 29 3b 0a  er, isTemp, 0);.
3380: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3390: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  p(v, OP_OpenWrit
33a0: 65 2c 20 30 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a  e, 0, 2);.}../*.
33b0: 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75  ** Begin constru
33c0: 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  cting a new tabl
33d0: 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
33e0: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
33f0: 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  s is.** the firs
3400: 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74  t of several act
3410: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ion routines tha
3420: 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20  t get called in 
3430: 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61  response.** to a
3440: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
3450: 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72  atement.  In par
3460: 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f  ticular, this ro
3470: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a  utine is called.
3480: 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20  ** after seeing 
3490: 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20  tokens "CREATE" 
34a0: 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20  and "TABLE" and 
34b0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  the table name. 
34c0: 20 54 68 65 0a 2a 2a 20 70 53 74 61 72 74 20 74   The.** pStart t
34d0: 6f 6b 65 6e 20 69 73 20 74 68 65 20 43 52 45 41  oken is the CREA
34e0: 54 45 20 61 6e 64 20 70 4e 61 6d 65 20 69 73 20  TE and pName is 
34f0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  the table name. 
3500: 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66   The isTemp.** f
3510: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
3520: 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  he table should 
3530: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
3540: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
3550: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74  ase.** file inst
3560: 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61  ead of in the ma
3570: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
3580: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
3590: 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20  lly the case.** 
35a0: 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20  when the "TEMP" 
35b0: 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b  or "TEMPORARY" k
35c0: 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e  eyword occurs in
35d0: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41   between.** CREA
35e0: 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a  TE and TABLE..**
35f0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c  .** The new tabl
3600: 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74  e record is init
3610: 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20  ialized and put 
3620: 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  in pParse->pNewT
3630: 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65  able..** As more
3640: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
3650: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
3660: 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69  s parsed, additi
3670: 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72  onal action.** r
3680: 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20  outines will be 
3690: 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f  called to add mo
36a0: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  re information t
36b0: 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a  o this record..*
36c0: 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
36d0: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
36e0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
36f0: 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 29  sqliteEndTable()
3700: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
3710: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74  alled to complet
3720: 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69  e the constructi
3730: 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  on of the new ta
3740: 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76  ble record..*/.v
3750: 6f 69 64 20 73 71 6c 69 74 65 53 74 61 72 74 54  oid sqliteStartT
3760: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
3770: 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
3780: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
3790: 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
37a0: 20 2f 2a 20 54 68 65 20 22 43 52 45 41 54 45 22   /* The "CREATE"
37b0: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65   token */.  Toke
37c0: 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f 2a 20  n *pName,    /* 
37d0: 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72  Name of table or
37e0: 20 76 69 65 77 20 74 6f 20 63 72 65 61 74 65 20   view to create 
37f0: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c  */.  int isTemp,
3800: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3810: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20   this is a TEMP 
3820: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
3830: 73 56 69 65 77 20 20 20 20 20 20 20 2f 2a 20 54  sView       /* T
3840: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
3850: 20 56 49 45 57 20 2a 2f 0a 29 7b 0a 20 20 54 61   VIEW */.){.  Ta
3860: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49  ble *pTable;.  I
3870: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 63 68  ndex *pIdx;.  ch
3880: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c  ar *zName;.  sql
3890: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
38a0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ->db;.  Vdbe *v;
38b0: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 70  .  int iDb;..  p
38c0: 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b  Parse->sFirstTok
38d0: 65 6e 20 3d 20 2a 70 53 74 61 72 74 3b 0a 20 20  en = *pStart;.  
38e0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61  zName = sqliteTa
38f0: 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  bleNameFromToken
3900: 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  (pName);.  if( z
3910: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
3920: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
3930: 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20  iDb==1 ) isTemp 
3940: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
3950: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
3960: 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28  ZATION.  assert(
3970: 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69   (isTemp & 1)==i
3980: 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20  sTemp );.  {.   
3990: 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63   int code;.    c
39a0: 68 61 72 20 2a 7a 44 62 20 3d 20 69 73 54 65 6d  har *zDb = isTem
39b0: 70 20 3f 20 22 74 65 6d 70 22 20 3a 20 22 6d 61  p ? "temp" : "ma
39c0: 69 6e 22 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  in";.    if( sql
39d0: 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61  iteAuthCheck(pPa
39e0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
39f0: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
3a00: 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62  (isTemp), 0, zDb
3a10: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
3a20: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
3a30: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
3a40: 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
3a50: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
3a60: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
3a70: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
3a80: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  EATE_TEMP_VIEW;.
3a90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3aa0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
3ab0: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a  TE_CREATE_VIEW;.
3ac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
3ad0: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54  e{.      if( isT
3ae0: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63  emp ){.        c
3af0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
3b00: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ATE_TEMP_TABLE;.
3b10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3b20: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
3b30: 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b  TE_CREATE_TABLE;
3b40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3b50: 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74     if( sqliteAut
3b60: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
3b70: 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a  ode, zName, 0, z
3b80: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Db) ){.      sql
3b90: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
3ba0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
3bb0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
3bc0: 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 72  ..  /* Before tr
3bd0: 79 69 6e 67 20 74 6f 20 63 72 65 61 74 65 20 61  ying to create a
3be0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
3bf0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
3c00: 42 74 72 65 65 20 66 6f 72 0a 20 20 2a 2a 20 68  Btree for.  ** h
3c10: 6f 6c 64 69 6e 67 20 74 65 6d 70 6f 72 61 72 79  olding temporary
3c20: 20 74 61 62 6c 65 73 20 69 73 20 6f 70 65 6e 2e   tables is open.
3c30: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65  .  */.  if( isTe
3c40: 6d 70 20 26 26 20 64 62 2d 3e 61 44 62 5b 31 5d  mp && db->aDb[1]
3c50: 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72  .pBt==0 && !pPar
3c60: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
3c70: 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
3c80: 74 65 42 74 72 65 65 46 61 63 74 6f 72 79 28 64  teBtreeFactory(d
3c90: 62 2c 20 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47  b, 0, 0, MAX_PAG
3ca0: 45 53 2c 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e  ES, &db->aDb[1].
3cb0: 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pBt);.    if( rc
3cc0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
3cd0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
3ce0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
3cf0: 72 72 4d 73 67 2c 20 22 75 6e 61 62 6c 65 20 74  rrMsg, "unable t
3d00: 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
3d10: 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20  ry database ".  
3d20: 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20        "file for 
3d30: 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72  storing temporar
3d40: 79 20 74 61 62 6c 65 73 22 2c 20 28 63 68 61 72  y tables", (char
3d50: 2a 29 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  *)0);.      pPar
3d60: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
3d70: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
3d80: 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67      if( db->flag
3d90: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
3da0: 6e 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ns ){.      rc =
3db0: 20 73 71 6c 69 74 65 42 74 72 65 65 42 65 67 69   sqliteBtreeBegi
3dc0: 6e 54 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31  nTrans(db->aDb[1
3dd0: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  ].pBt);.      if
3de0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
3df0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3e00: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
3e10: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75  rse->zErrMsg, "u
3e20: 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61 20 77  nable to get a w
3e30: 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20  rite lock on ". 
3e40: 20 20 20 20 20 20 20 20 20 22 74 68 65 20 74 65           "the te
3e50: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
3e60: 20 66 69 6c 65 22 2c 20 30 29 3b 0a 20 20 20 20   file", 0);.    
3e70: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
3e80: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ++;.        retu
3e90: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
3ea0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
3eb0: 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61   sure the new ta
3ec0: 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f  ble name does no
3ed0: 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61  t collide with a
3ee0: 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
3ef0: 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e  index or table n
3f00: 61 6d 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65  ame.  Issue an e
3f10: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20  rror message if 
3f20: 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2a 0a 20 20  it does..  **.  
3f30: 2a 2a 20 49 66 20 77 65 20 61 72 65 20 72 65 2d  ** If we are re-
3f40: 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
3f50: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
3f60: 62 65 63 61 75 73 65 20 6f 66 20 61 20 73 63 68  because of a sch
3f70: 65 6d 61 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20  ema.  ** change 
3f80: 61 6e 64 20 61 20 6e 65 77 20 70 65 72 6d 61 6e  and a new perman
3f90: 65 6e 74 20 74 61 62 6c 65 20 69 73 20 66 6f 75  ent table is fou
3fa0: 6e 64 20 77 68 6f 73 65 20 6e 61 6d 65 20 63 6f  nd whose name co
3fb0: 6c 6c 69 64 65 73 20 77 69 74 68 0a 20 20 2a 2a  llides with.  **
3fc0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 65 6d   an existing tem
3fd0: 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
3fe0: 61 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72  at is not an err
3ff0: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 6c  or..  */.  pTabl
4000: 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61  e = sqliteFindTa
4010: 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  ble(db, zName, 0
4020: 29 3b 0a 20 20 69 44 62 20 3d 20 69 73 54 65 6d  );.  iDb = isTem
4030: 70 20 3f 20 31 20 3a 20 70 50 61 72 73 65 2d 3e  p ? 1 : pParse->
4040: 69 44 62 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  iDb;.  if( pTabl
4050: 65 21 3d 30 20 26 26 20 28 70 54 61 62 6c 65 2d  e!=0 && (pTable-
4060: 3e 69 44 62 3d 3d 69 44 62 20 7c 7c 20 21 70 50  >iDb==iDb || !pP
4070: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 29 20  arse->initFlag) 
4080: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
4090: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
40a0: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65  >zErrMsg, "table
40b0: 20 22 2c 20 30 2c 20 70 4e 61 6d 65 2d 3e 7a 2c   ", 0, pName->z,
40c0: 20 70 4e 61 6d 65 2d 3e 6e 2c 0a 20 20 20 20 20   pName->n,.     
40d0: 20 20 20 22 20 61 6c 72 65 61 64 79 20 65 78 69     " already exi
40e0: 73 74 73 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20  sts", 0, 0);.   
40f0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
4100: 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  e);.    pParse->
4110: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
4120: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  rn;.  }.  if( (p
4130: 49 64 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  Idx = sqliteFind
4140: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
4150: 20 30 29 29 21 3d 30 20 26 26 0a 20 20 20 20 20   0))!=0 &&.     
4160: 20 20 20 20 20 28 70 49 64 78 2d 3e 69 44 62 3d       (pIdx->iDb=
4170: 3d 30 20 7c 7c 20 21 70 50 61 72 73 65 2d 3e 69  =0 || !pParse->i
4180: 6e 69 74 46 6c 61 67 29 20 29 7b 0a 20 20 20 20  nitFlag) ){.    
4190: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
41a0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
41b0: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
41c0: 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d  ady an index nam
41d0: 65 64 20 22 2c 20 0a 20 20 20 20 20 20 20 7a 4e  ed ", .       zN
41e0: 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
41f0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
4200: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 72 73  Name);.    pPars
4210: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
4220: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61  eturn;.  }.  pTa
4230: 62 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ble = sqliteMall
4240: 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  oc( sizeof(Table
4250: 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  ) );.  if( pTabl
4260: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  e==0 ){.    sqli
4270: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
4280: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
4290: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d   pTable->zName =
42a0: 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65   zName;.  pTable
42b0: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54  ->nCol = 0;.  pT
42c0: 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  able->aCol = 0;.
42d0: 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20    pTable->iPKey 
42e0: 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  = -1;.  pTable->
42f0: 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54  pIndex = 0;.  pT
4300: 61 62 6c 65 2d 3e 69 44 62 20 3d 20 69 44 62 3b  able->iDb = iDb;
4310: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70  .  if( pParse->p
4320: 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c 69 74  NewTable ) sqlit
4330: 65 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  eDeleteTable(db,
4340: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
4350: 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70  le);.  pParse->p
4360: 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  NewTable = pTabl
4370: 65 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67  e;..  /* Begin g
4380: 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f  enerating the co
4390: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73  de that will ins
43a0: 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65  ert the table re
43b0: 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74  cord into.  ** t
43c0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
43d0: 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e   table.  Note in
43e0: 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74   particular that
43f0: 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61   we must go ahea
4400: 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63  d.  ** and alloc
4410: 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ate the record n
4420: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
4430: 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20  ble entry now.  
4440: 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20  Before any.  ** 
4450: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
4460: 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61  NIQUE keywords a
4470: 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73  re parsed.  Thos
4480: 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20  e keywords will 
4490: 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63  cause.  ** indic
44a0: 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  es to be created
44b0: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72   and the table r
44c0: 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20  ecord must come 
44d0: 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a  before the .  **
44e0: 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65   indices.  Hence
44f0: 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  , the record num
4500: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
4510: 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  e must be alloca
4520: 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20  ted.  ** now..  
4530: 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  */.  if( !pParse
4540: 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26 20 28 76  ->initFlag && (v
4550: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
4560: 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a  (pParse))!=0 ){.
4570: 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57      sqliteBeginW
4580: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
4590: 61 72 73 65 2c 20 30 2c 20 69 73 54 65 6d 70 29  arse, 0, isTemp)
45a0: 3b 0a 20 20 20 20 69 66 28 20 21 69 73 54 65 6d  ;.    if( !isTem
45b0: 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
45c0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
45d0: 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 66 69  _Integer, db->fi
45e0: 6c 65 5f 66 6f 72 6d 61 74 2c 20 30 29 3b 0a 20  le_format, 0);. 
45f0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
4600: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
4610: 6f 6b 69 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  okie, 0, 1);.   
4620: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 4f 70 65   }.    sqliteOpe
4630: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20  nMasterTable(v, 
4640: 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c  isTemp);.    sql
4650: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4660: 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20  OP_NewRecno, 0, 
4670: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
4680: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
4690: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  p, 0, 0);.    sq
46a0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
46b0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
46c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
46d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
46e0: 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20  IntKey, 0, 0);. 
46f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
4700: 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20  a new column to 
4710: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
4720: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
4730: 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ucted..**.** The
4740: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
4750: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20  is routine once 
4760: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
4770: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69  declaration.** i
4780: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
4790: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c   statement.  sql
47a0: 69 74 65 53 74 61 72 74 54 61 62 6c 65 28 29 20  iteStartTable() 
47b0: 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66  gets called.** f
47c0: 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e  irst to get thin
47d0: 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20  gs going.  Then 
47e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
47f0: 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a  called for each.
4800: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f  ** column..*/.vo
4810: 69 64 20 73 71 6c 69 74 65 41 64 64 43 6f 6c 75  id sqliteAddColu
4820: 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mn(Parse *pParse
4830: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
4840: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
4850: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 20  nt i;.  char *z 
4860: 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  = 0;.  Column *p
4870: 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  Col;.  if( (p = 
4880: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4890: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
48a0: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
48b0: 6e 67 28 26 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c  ng(&z, pName->z,
48c0: 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20   pName->n, 0);. 
48d0: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
48e0: 72 6e 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75  rn;.  sqliteDequ
48f0: 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69 3d  ote(z);.  for(i=
4900: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
4910: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
4920: 74 65 53 74 72 49 43 6d 70 28 7a 2c 20 70 2d 3e  teStrICmp(z, p->
4930: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  aCol[i].zName)==
4940: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
4950: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
4960: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 64 75  se->zErrMsg, "du
4970: 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e  plicate column n
4980: 61 6d 65 3a 20 22 2c 20 7a 2c 20 28 63 68 61 72  ame: ", z, (char
4990: 2a 29 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  *)0);.      pPar
49a0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
49b0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
49c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
49d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28     }.  }.  if( (
49e0: 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d  p->nCol & 0x7)==
49f0: 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  0 ){.    Column 
4a00: 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20  *aNew;.    aNew 
4a10: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
4a20: 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43   p->aCol, (p->nC
4a30: 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e  ol+8)*sizeof(p->
4a40: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69  aCol[0]));.    i
4a50: 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( aNew==0 ) ret
4a60: 75 72 6e 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c  urn;.    p->aCol
4a70: 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = aNew;.  }.  p
4a80: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70  Col = &p->aCol[p
4a90: 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65  ->nCol];.  memse
4aa0: 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(pCol, 0, sizeo
4ab0: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
4ac0: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
4ad0: 7a 3b 0a 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f  z;.  pCol->sortO
4ae0: 72 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f  rder = SQLITE_SO
4af0: 5f 4e 55 4d 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b  _NUM;.  p->nCol+
4b00: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  +;.}../*.** This
4b10: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
4b20: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
4b30: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
4b40: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
4b50: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
4b60: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20  E statement.  A 
4b70: 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74  "NOT NULL" const
4b80: 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65  raint has.** bee
4b90: 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75  n seen on a colu
4ba0: 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  mn.  This routin
4bb0: 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75  e sets the notNu
4bc0: 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68  ll flag on.** th
4bd0: 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  e column current
4be0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
4bf0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
4c00: 71 6c 69 74 65 41 64 64 4e 6f 74 4e 75 6c 6c 28  qliteAddNotNull(
4c10: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
4c20: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54  nt onError){.  T
4c30: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
4c40: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
4c50: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
4c60: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
4c70: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
4c80: 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43  if( i>=0 ) p->aC
4c90: 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20  ol[i].notNull = 
4ca0: 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  onError;.}../*.*
4cb0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4cc0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
4cd0: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
4ce0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
4cf0: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
4d00: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
4d10: 74 2e 20 20 54 68 65 20 70 46 69 72 73 74 20 74  t.  The pFirst t
4d20: 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72 73  oken is the firs
4d30: 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68  t.** token in th
4d40: 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f  e sequence of to
4d50: 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63 72 69  kens that descri
4d60: 62 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 74  be the type of t
4d70: 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72  he.** column cur
4d80: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
4d90: 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61  struction.   pLa
4da0: 73 74 20 69 73 20 74 68 65 20 6c 61 73 74 20 74  st is the last t
4db0: 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73  oken.** in the s
4dc0: 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68  equence.  Use th
4dd0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  is information t
4de0: 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74  o construct a st
4df0: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e  ring.** that con
4e00: 74 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61  tains the typena
4e10: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
4e20: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20   and store that 
4e30: 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79  string.** in zTy
4e40: 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c  pe..*/ .void sql
4e50: 69 74 65 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  iteAddColumnType
4e60: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
4e70: 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54  Token *pFirst, T
4e80: 6f 6b 65 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20  oken *pLast){.  
4e90: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
4ea0: 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  i, j;.  int n;. 
4eb0: 20 63 68 61 72 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a   char *z, **pz;.
4ec0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
4ed0: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
4ee0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
4ef0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
4f00: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66   p->nCol-1;.  if
4f10: 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  ( i<0 ) return;.
4f20: 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f    pCol = &p->aCo
4f30: 6c 5b 69 5d 3b 0a 20 20 70 7a 20 3d 20 26 70 43  l[i];.  pz = &pC
4f40: 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 6e 20 3d  ol->zType;.  n =
4f50: 20 70 4c 61 73 74 2d 3e 6e 20 2b 20 41 64 64 72   pLast->n + Addr
4f60: 28 70 4c 61 73 74 2d 3e 7a 29 20 2d 20 41 64 64  (pLast->z) - Add
4f70: 72 28 70 46 69 72 73 74 2d 3e 7a 29 3b 0a 20 20  r(pFirst->z);.  
4f80: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
4f90: 28 70 7a 2c 20 70 46 69 72 73 74 2d 3e 7a 2c 20  (pz, pFirst->z, 
4fa0: 6e 2c 20 30 29 3b 0a 20 20 7a 20 3d 20 2a 70 7a  n, 0);.  z = *pz
4fb0: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
4fc0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a  eturn;.  for(i=j
4fd0: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
4fe0: 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 5b 69 5d      int c = z[i]
4ff0: 3b 0a 20 20 20 20 69 66 28 20 69 73 73 70 61 63  ;.    if( isspac
5000: 65 28 63 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  e(c) ) continue;
5010: 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b  .    z[j++] = c;
5020: 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b  .  }.  z[j] = 0;
5030: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
5040: 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  b->file_format>=
5050: 34 20 29 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73  4 ){.    pCol->s
5060: 6f 72 74 4f 72 64 65 72 20 3d 20 73 71 6c 69 74  ortOrder = sqlit
5070: 65 43 6f 6c 6c 61 74 65 54 79 70 65 28 7a 2c 20  eCollateType(z, 
5080: 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n);.  }else{.   
5090: 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72   pCol->sortOrder
50a0: 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d   = SQLITE_SO_NUM
50b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
50c0: 68 65 20 67 69 76 65 6e 20 74 6f 6b 65 6e 20 69  he given token i
50d0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  s the default va
50e0: 6c 75 65 20 66 6f 72 20 74 68 65 20 6c 61 73 74  lue for the last
50f0: 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f   column added to
5100: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 63 75  .** the table cu
5110: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
5120: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20  nstruction.  If 
5130: 22 6d 69 6e 75 73 46 6c 61 67 22 20 69 73 20 74  "minusFlag" is t
5140: 72 75 65 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73  rue, it.** means
5150: 20 74 68 65 20 76 61 6c 75 65 20 74 6f 6b 65 6e   the value token
5160: 20 77 61 73 20 70 72 65 63 65 64 65 64 20 62 79   was preceded by
5170: 20 61 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a   a minus sign..*
5180: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5190: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
51a0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
51b0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
51c0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
51d0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
51e0: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
51f0: 6c 69 74 65 41 64 64 44 65 66 61 75 6c 74 56 61  liteAddDefaultVa
5200: 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lue(Parse *pPars
5210: 65 2c 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20  e, Token *pVal, 
5220: 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a  int minusFlag){.
5230: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
5240: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a  t i;.  char **pz
5250: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
5260: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
5270: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
5280: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
5290: 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
52a0: 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f  ;.  pz = &p->aCo
52b0: 6c 5b 69 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69 66  l[i].zDflt;.  if
52c0: 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20  ( minusFlag ){. 
52d0: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
52e0: 69 6e 67 28 70 7a 2c 20 22 2d 22 2c 20 31 2c 20  ing(pz, "-", 1, 
52f0: 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e  pVal->z, pVal->n
5300: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
5310: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
5320: 69 6e 67 28 70 7a 2c 20 70 56 61 6c 2d 3e 7a 2c  ing(pz, pVal->z,
5330: 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20   pVal->n, 0);.  
5340: 7d 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74  }.  sqliteDequot
5350: 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e(*pz);.}../*.**
5360: 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50   Designate the P
5370: 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74  RIMARY KEY for t
5380: 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74  he table.  pList
5390: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61   is a list of na
53a0: 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d  mes .** of colum
53b0: 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65  ns that form the
53c0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
53d0: 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c  f pList is NULL,
53e0: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73   then the.** mos
53f0: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
5400: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74   column of the t
5410: 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d  able is the prim
5420: 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41  ary key..**.** A
5430: 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20   table can have 
5440: 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d  at most one prim
5450: 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65  ary key.  If the
5460: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68   table already h
5470: 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20  as.** a primary 
5480: 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73  key (and this is
5490: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d   the second prim
54a0: 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72  ary key) then cr
54b0: 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eate an.** error
54c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
54d0: 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e  RIMARY KEY is on
54e0: 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
54f0: 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20   whose datatype 
5500: 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74  is INTEGER,.** t
5510: 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20  hen we will try 
5520: 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75  to use that colu
5530: 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 20 69 64  mn as the row id
5540: 2e 20 20 28 45 78 63 65 70 74 69 6f 6e 3a 0a 2a  .  (Exception:.*
5550: 2a 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20  * For backwards 
5560: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
5570: 74 68 20 6f 6c 64 65 72 20 64 61 74 61 62 61 73  th older databas
5580: 65 73 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68  es, do not do th
5590: 69 73 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c  is.** if the fil
55a0: 65 20 66 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e  e format version
55b0: 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20   number is less 
55c0: 74 68 61 6e 20 31 2e 29 20 20 53 65 74 20 74 68  than 1.)  Set th
55d0: 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a  e Table.iPKey.**
55e0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61   field of the ta
55f0: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
5600: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65  uction to be the
5610: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
5620: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
5630: 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61   KEY column.  Ta
5640: 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74  ble.iPKey is set
5650: 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20   to -1 if there 
5660: 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52  is.** no INTEGER
5670: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a   PRIMARY KEY..**
5680: 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69  .** If the key i
5690: 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
56a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68   PRIMARY KEY, th
56b0: 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  en create a uniq
56c0: 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20  ue.** index for 
56d0: 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64  the key.  No ind
56e0: 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f  ex is created fo
56f0: 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  r INTEGER PRIMAR
5700: 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20  Y KEYs..*/.void 
5710: 73 71 6c 69 74 65 41 64 64 50 72 69 6d 61 72 79  sqliteAddPrimary
5720: 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  Key(Parse *pPars
5730: 65 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  e, IdList *pList
5740: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
5750: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
5760: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
5770: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65  e;.  char *zType
5780: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
5790: 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20   = -1, i;.  if( 
57a0: 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70  pTab==0 ) goto p
57b0: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
57c0: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61 73  .  if( pTab->has
57d0: 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73  PrimKey ){.    s
57e0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
57f0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
5800: 20 22 74 61 62 6c 65 20 5c 22 22 2c 20 70 54 61   "table \"", pTa
5810: 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  b->zName, .     
5820: 20 20 20 22 5c 22 20 68 61 73 20 6d 6f 72 65 20     "\" has more 
5830: 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79  than one primary
5840: 20 6b 65 79 22 2c 20 28 63 68 61 72 2a 29 30 29   key", (char*)0)
5850: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
5860: 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 70  rr++;.    goto p
5870: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
5880: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73  .  }.  pTab->has
5890: 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69  PrimKey = 1;.  i
58a0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
58b0: 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     iCol = pTab->
58c0: 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54  nCol - 1;.    pT
58d0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69  ab->aCol[iCol].i
58e0: 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20  sPrimKey = 1;.  
58f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
5900: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
5910: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  ; i++){.      fo
5920: 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70  r(iCol=0; iCol<p
5930: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  Tab->nCol; iCol+
5940: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
5950: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c  sqliteStrICmp(pL
5960: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
5970: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
5980: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
5990: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
59a0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62     if( iCol<pTab
59b0: 2d 3e 6e 43 6f 6c 20 29 20 70 54 61 62 2d 3e 61  ->nCol ) pTab->a
59c0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d  Col[iCol].isPrim
59d0: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Key = 1;.    }. 
59e0: 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49     if( pList->nI
59f0: 64 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b  d>1 ) iCol = -1;
5a00: 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e  .  }.  if( iCol>
5a10: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
5a20: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79  >nCol ){.    zTy
5a30: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
5a40: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d  iCol].zType;.  }
5a50: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
5a60: 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  b->file_format>=
5a70: 31 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  1 && .          
5a80: 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74 65   zType && sqlite
5a90: 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22  StrICmp(zType, "
5aa0: 49 4e 54 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a  INTEGER")==0 ){.
5ab0: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
5ac0: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62  = iCol;.    pTab
5ad0: 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72  ->keyConf = onEr
5ae0: 72 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ror;.  }else{.  
5af0: 20 20 73 71 6c 69 74 65 43 72 65 61 74 65 49 6e    sqliteCreateIn
5b00: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
5b10: 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72  , pList, onError
5b20: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69  , 0, 0);.    pLi
5b30: 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69  st = 0;.  }..pri
5b40: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20  mary_key_exit:. 
5b50: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c   sqliteIdListDel
5b60: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65  ete(pList);.  re
5b70: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  turn;.}../*.** R
5b80: 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70  eturn the approp
5b90: 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20  riate collating 
5ba0: 74 79 70 65 20 67 69 76 65 6e 20 61 20 74 79 70  type given a typ
5bb0: 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e name..**.** Th
5bc0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65  e collation type
5bd0: 20 69 73 20 74 65 78 74 20 28 53 51 4c 49 54 45   is text (SQLITE
5be0: 5f 53 4f 5f 54 45 58 54 29 20 69 66 20 74 68 65  _SO_TEXT) if the
5bf0: 20 74 79 70 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f   type.** name co
5c00: 6e 74 61 69 6e 73 20 74 68 65 20 63 68 61 72 61  ntains the chara
5c10: 63 74 65 72 20 73 74 72 65 61 6d 20 22 74 65 78  cter stream "tex
5c20: 74 22 20 6f 72 20 22 62 6c 6f 62 22 20 6f 72 0a  t" or "blob" or.
5c30: 2a 2a 20 22 63 6c 6f 62 22 2e 20 20 41 6e 79 20  ** "clob".  Any 
5c40: 6f 74 68 65 72 20 74 79 70 65 20 6e 61 6d 65 20  other type name 
5c50: 69 73 20 63 6f 6c 6c 61 74 65 64 20 61 73 20 6e  is collated as n
5c60: 75 6d 65 72 69 63 0a 2a 2a 20 28 53 51 4c 49 54  umeric.** (SQLIT
5c70: 45 5f 53 4f 5f 4e 55 4d 29 2e 0a 2a 2f 0a 69 6e  E_SO_NUM)..*/.in
5c80: 74 20 73 71 6c 69 74 65 43 6f 6c 6c 61 74 65 54  t sqliteCollateT
5c90: 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ype(const char *
5ca0: 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70 65  zType, int nType
5cb0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
5cc0: 72 28 69 3d 30 3b 20 69 3c 6e 54 79 70 65 2d 31  r(i=0; i<nType-1
5cd0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77 69 74  ; i++){.    swit
5ce0: 63 68 28 20 7a 54 79 70 65 5b 69 5d 20 29 7b 0a  ch( zType[i] ){.
5cf0: 20 20 20 20 20 20 63 61 73 65 20 27 62 27 3a 0a        case 'b':.
5d00: 20 20 20 20 20 20 63 61 73 65 20 27 42 27 3a 20        case 'B': 
5d10: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  {.        if( i<
5d20: 6e 54 79 70 65 2d 33 20 26 26 20 73 71 6c 69 74  nType-3 && sqlit
5d30: 65 53 74 72 4e 49 43 6d 70 28 26 7a 54 79 70 65  eStrNICmp(&zType
5d40: 5b 69 5d 2c 22 62 6c 6f 62 22 2c 34 29 3d 3d 30  [i],"blob",4)==0
5d50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
5d60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 54  turn SQLITE_SO_T
5d70: 45 58 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  EXT;.        }. 
5d80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5d90: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
5da0: 20 27 63 27 3a 0a 20 20 20 20 20 20 63 61 73 65   'c':.      case
5db0: 20 27 43 27 3a 20 7b 0a 20 20 20 20 20 20 20 20   'C': {.        
5dc0: 69 66 28 20 69 3c 6e 54 79 70 65 2d 33 20 26 26  if( i<nType-3 &&
5dd0: 20 28 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70   (sqliteStrNICmp
5de0: 28 26 7a 54 79 70 65 5b 69 5d 2c 22 63 68 61 72  (&zType[i],"char
5df0: 22 2c 34 29 3d 3d 30 20 7c 7c 0a 20 20 20 20 20  ",4)==0 ||.     
5e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e10: 20 20 20 20 20 20 73 71 6c 69 74 65 53 74 72 4e        sqliteStrN
5e20: 49 43 6d 70 28 26 7a 54 79 70 65 5b 69 5d 2c 22  ICmp(&zType[i],"
5e30: 63 6c 6f 62 22 2c 34 29 3d 3d 30 29 0a 20 20 20  clob",4)==0).   
5e40: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
5e50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5e60: 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 20  SO_TEXT;.       
5e70: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
5e80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5e90: 63 61 73 65 20 27 78 27 3a 0a 20 20 20 20 20 20  case 'x':.      
5ea0: 63 61 73 65 20 27 58 27 3a 20 7b 0a 20 20 20 20  case 'X': {.    
5eb0: 20 20 20 20 69 66 28 20 69 3e 3d 32 20 26 26 20      if( i>=2 && 
5ec0: 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 26  sqliteStrNICmp(&
5ed0: 7a 54 79 70 65 5b 69 2d 32 5d 2c 22 74 65 78 74  zType[i-2],"text
5ee0: 22 2c 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",4)==0 ){.     
5ef0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
5f00: 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20  TE_SO_TEXT;.    
5f10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
5f20: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5f30: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
5f40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5f50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
5f60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53   return SQLITE_S
5f70: 4f 5f 4e 55 4d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  O_NUM;.}../*.** 
5f80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5f90: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
5fa0: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
5fb0: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
5fc0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
5fd0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
5fe0: 20 20 41 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c    A "COLLATE" cl
5ff0: 61 75 73 65 20 68 61 73 0a 2a 2a 20 62 65 65 6e  ause has.** been
6000: 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d   seen on a colum
6010: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
6020: 20 73 65 74 73 20 74 68 65 20 43 6f 6c 75 6d 6e   sets the Column
6030: 2e 73 6f 72 74 4f 72 64 65 72 20 6f 6e 0a 2a 2a  .sortOrder on.**
6040: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72   the column curr
6050: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
6060: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
6070: 64 20 73 71 6c 69 74 65 41 64 64 43 6f 6c 6c 61  d sqliteAddColla
6080: 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  teType(Parse *pP
6090: 61 72 73 65 2c 20 69 6e 74 20 63 6f 6c 6c 54 79  arse, int collTy
60a0: 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  pe){.  Table *p;
60b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
60c0: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
60d0: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
60e0: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
60f0: 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30  ol-1;.  if( i>=0
6100: 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 73 6f   ) p->aCol[i].so
6110: 72 74 4f 72 64 65 72 20 3d 20 63 6f 6c 6c 54 79  rtOrder = collTy
6120: 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  pe;.}../*.** Com
6130: 65 20 75 70 20 77 69 74 68 20 61 20 6e 65 77 20  e up with a new 
6140: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 66 6f 72  random value for
6150: 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
6160: 69 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 0a 2a  ie.  Make sure.*
6170: 2a 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20  * the new value 
6180: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
6190: 6d 20 74 68 65 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a  m the old..**.**
61a0: 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   The schema cook
61b0: 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ie is used to de
61c0: 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65  termine when the
61d0: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a   schema for the.
61e0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  ** database chan
61f0: 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68  ges.  After each
6200: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20   schema change, 
6210: 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  the cookie value
6220: 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68  .** changes.  Wh
6230: 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72  en a process fir
6240: 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68  st reads the sch
6250: 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74  ema it records t
6260: 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54  he.** cookie.  T
6270: 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65  hereafter, whene
6280: 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61  ver it goes to a
6290: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
62a0: 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73  se,.** it checks
62b0: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d   the cookie to m
62c0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68  ake sure the sch
62d0: 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e  ema has not chan
62e0: 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20  ged.** since it 
62f0: 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a  was last read..*
6300: 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69  *.** This plan i
6310: 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  s not completely
6320: 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20   bullet-proof.  
6330: 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  It is possible f
6340: 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  or.** the schema
6350: 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69   to change multi
6360: 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f  ple times and fo
6370: 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  r the cookie to 
6380: 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74  be.** set back t
6390: 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20  o prior value.  
63a0: 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67  But schema chang
63b0: 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e  es are infrequen
63c0: 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f  t.** and the pro
63d0: 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74  bability of hitt
63e0: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f  ing the same coo
63f0: 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c  kie value is onl
6400: 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e  y.** 1 chance in
6410: 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65   2^32.  So we're
6420: 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f   safe enough..*/
6430: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 68 61 6e  .void sqliteChan
6440: 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 20  geCookie(sqlite 
6450: 2a 64 62 2c 20 56 64 62 65 20 2a 76 29 7b 0a 20  *db, Vdbe *v){. 
6460: 20 69 66 28 20 64 62 2d 3e 6e 65 78 74 5f 63 6f   if( db->next_co
6470: 6f 6b 69 65 3d 3d 64 62 2d 3e 61 44 62 5b 30 5d  okie==db->aDb[0]
6480: 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 29  .schema_cookie )
6490: 7b 0a 20 20 20 20 64 62 2d 3e 6e 65 78 74 5f 63  {.    db->next_c
64a0: 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 61 44 62 5b  ookie = db->aDb[
64b0: 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  0].schema_cookie
64c0: 20 2b 20 73 71 6c 69 74 65 52 61 6e 64 6f 6d 42   + sqliteRandomB
64d0: 79 74 65 28 29 20 2b 20 31 3b 0a 20 20 20 20 64  yte() + 1;.    d
64e0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
64f0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
6500: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
6510: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
6520: 67 65 72 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f  ger, db->next_co
6530: 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  okie, 0);.    sq
6540: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6550: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30   OP_SetCookie, 0
6560: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
6570: 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e  ** Measure the n
6580: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
6590: 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75  ers needed to ou
65a0: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a  tput the given.*
65b0: 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54  * identifier.  T
65c0: 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
65d0: 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20  ed includes any 
65e0: 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62  quotes used.** b
65f0: 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c  ut does not incl
6600: 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72  ude the null ter
6610: 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  minator..*/.stat
6620: 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67  ic int identLeng
6630: 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  th(const char *z
6640: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e  ){.  int n;.  in
6650: 74 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 30 3b  t needQuote = 0;
6660: 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20  .  for(n=0; *z; 
6670: 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69  n++, z++){.    i
6680: 66 28 20 2a 7a 3d 3d 27 5c 27 27 20 29 7b 20 6e  f( *z=='\'' ){ n
6690: 2b 2b 3b 20 6e 65 65 64 51 75 6f 74 65 3d 31 3b  ++; needQuote=1;
66a0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
66b0: 6e 20 2b 20 6e 65 65 64 51 75 6f 74 65 2a 32 3b  n + needQuote*2;
66c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
66d0: 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e  an identifier on
66e0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
66f0: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 20  e given string. 
6700: 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68   Add.** quote ch
6710: 61 72 61 63 74 65 72 73 20 61 73 20 6e 65 65 64  aracters as need
6720: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
6730: 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61 72  id identPut(char
6740: 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20   *z, int *pIdx, 
6750: 63 68 61 72 20 2a 7a 49 64 65 6e 74 29 7b 0a 20  char *zIdent){. 
6760: 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51   int i, j, needQ
6770: 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64  uote;.  i = *pId
6780: 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  x;.  for(j=0; zI
6790: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
67a0: 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28     if( !isalnum(
67b0: 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49  zIdent[j]) && zI
67c0: 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62  dent[j]!='_' ) b
67d0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64  reak;.  }.  need
67e0: 51 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b  Quote =  zIdent[
67f0: 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74  j]!=0 || isdigit
6800: 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20  (zIdent[0]).    
6810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
6820: 20 73 71 6c 69 74 65 4b 65 79 77 6f 72 64 43 6f   sqliteKeywordCo
6830: 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54  de(zIdent, j)!=T
6840: 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64  K_ID;.  if( need
6850: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
6860: 20 27 5c 27 27 3b 0a 20 20 66 6f 72 28 6a 3d 30   '\'';.  for(j=0
6870: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
6880: 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20  ){.    z[i++] = 
6890: 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69  zIdent[j];.    i
68a0: 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 5c  f( zIdent[j]=='\
68b0: 27 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c  '' ) z[i++] = '\
68c0: 27 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65  '';.  }.  if( ne
68d0: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
68e0: 20 3d 20 27 5c 27 27 3b 0a 20 20 7a 5b 69 5d 20   = '\'';.  z[i] 
68f0: 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69  = 0;.  *pIdx = i
6900: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
6910: 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42  ate a CREATE TAB
6920: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70  LE statement app
6930: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
6940: 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e   given.** table.
6950: 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64    Memory to hold
6960: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
6970: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62   statement is ob
6980: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73  tained.** from s
6990: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
69a0: 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
69b0: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
69c0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
69d0: 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54  ic char *createT
69e0: 61 62 6c 65 53 74 6d 74 28 54 61 62 6c 65 20 2a  ableStmt(Table *
69f0: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20  p){.  int i, k, 
6a00: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  n;.  char *zStmt
6a10: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20  ;.  char *zSep, 
6a20: 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20  *zSep2, *zEnd;. 
6a30: 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d   n = 0;.  for(i=
6a40: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
6a50: 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65  +){.    n += ide
6a60: 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 61 43 6f 6c  ntLength(p->aCol
6a70: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
6a80: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
6a90: 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  th(p->zName);.  
6aa0: 69 66 28 20 6e 3c 34 30 20 29 7b 0a 20 20 20 20  if( n<40 ){.    
6ab0: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a  zSep = "";.    z
6ac0: 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20  Sep2 = ",";.    
6ad0: 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65  zEnd = ")";.  }e
6ae0: 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20  lse{.    zSep = 
6af0: 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70  "\n  ";.    zSep
6b00: 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20  2 = ",\n  ";.   
6b10: 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20   zEnd = "\n)";. 
6b20: 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36   }.  n += 35 + 6
6b30: 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d  *p->nCol;.  zStm
6b40: 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
6b50: 52 61 77 28 20 6e 20 29 3b 0a 20 20 69 66 28 20  Raw( n );.  if( 
6b60: 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72  zStmt==0 ) retur
6b70: 6e 20 30 3b 0a 20 20 73 74 72 63 70 79 28 7a 53  n 0;.  strcpy(zS
6b80: 74 6d 74 2c 20 70 2d 3e 69 44 62 3d 3d 31 20 3f  tmt, p->iDb==1 ?
6b90: 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41   "CREATE TEMP TA
6ba0: 42 4c 45 20 22 20 3a 20 22 43 52 45 41 54 45 20  BLE " : "CREATE 
6bb0: 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20  TABLE ");.  k = 
6bc0: 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20  strlen(zStmt);. 
6bd0: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
6be0: 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a   &k, p->zName);.
6bf0: 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27    zStmt[k++] = '
6c00: 28 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  (';.  for(i=0; i
6c10: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  <p->nCol; i++){.
6c20: 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d      strcpy(&zStm
6c30: 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20  t[k], zSep);.   
6c40: 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53   k += strlen(&zS
6c50: 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65  tmt[k]);.    zSe
6c60: 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69  p = zSep2;.    i
6c70: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
6c80: 6b 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  k, p->aCol[i].zN
6c90: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 74 72 63  ame);.  }.  strc
6ca0: 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45  py(&zStmt[k], zE
6cb0: 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  nd);.  return zS
6cc0: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  tmt;.}../*.** Th
6cd0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
6ce0: 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  lled to report t
6cf0: 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61  he final ")" tha
6d00: 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20  t terminates.** 
6d10: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
6d20: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
6d30: 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74  The table struct
6d40: 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61  ure that other a
6d50: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68  ction routines h
6d60: 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e  ave been buildin
6d70: 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  g.** is added to
6d80: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61   the internal ha
6d90: 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d  sh tables, assum
6da0: 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61  ing no errors ha
6db0: 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a  ve.** occurred..
6dc0: 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66  **.** An entry f
6dd0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  or the table is 
6de0: 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74  made in the mast
6df0: 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b  er table on disk
6e00: 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 74 68 69 73  ,.** unless this
6e10: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
6e20: 74 61 62 6c 65 20 6f 72 20 69 6e 69 74 46 6c 61  table or initFla
6e30: 67 3d 3d 31 2e 20 20 57 68 65 6e 20 69 6e 69 74  g==1.  When init
6e40: 46 6c 61 67 3d 3d 31 2c 0a 2a 2a 20 69 74 20 6d  Flag==1,.** it m
6e50: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
6e60: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
6e70: 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61  aster table beca
6e80: 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63  use we just.** c
6e90: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20  onnected to the 
6ea0: 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61  database or beca
6eb0: 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  use the sqlite_m
6ec0: 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a  aster table has.
6ed0: 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e  ** recently chan
6ee0: 67 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74 72  ges, so the entr
6ef0: 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65  y for this table
6f00: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
6f10: 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  in.** the sqlite
6f20: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20  _master table.  
6f30: 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  We do not want t
6f40: 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69  o create it agai
6f50: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
6f60: 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74  pSelect argument
6f70: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
6f80: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
6f90: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20   routine.** was 
6fa0: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
6fb0: 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74   a table generat
6fc0: 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43  ed from a .** "C
6fd0: 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20  REATE TABLE ... 
6fe0: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73  AS SELECT ..." s
6ff0: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63  tatement.  The c
7000: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a  olumn names of.*
7010: 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * the new table 
7020: 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72  will match the r
7030: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
7040: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
7050: 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28   sqliteEndTable(
7060: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
7070: 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65 6c 65  oken *pEnd, Sele
7080: 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
7090: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69  Table *p;.  sqli
70a0: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
70b0: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e  >db;..  if( (pEn
70c0: 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d  d==0 && pSelect=
70d0: 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  =0) || pParse->n
70e0: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
70f0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
7100: 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72  turn;.  p = pPar
7110: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
7120: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
7130: 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  rn;..  /* If the
7140: 20 74 61 62 6c 65 20 69 73 20 67 65 6e 65 72 61   table is genera
7150: 74 65 64 20 66 72 6f 6d 20 61 20 53 45 4c 45 43  ted from a SELEC
7160: 54 2c 20 74 68 65 6e 20 63 6f 6e 73 74 72 75 63  T, then construc
7170: 74 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 20  t the.  ** list 
7180: 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74  of columns and t
7190: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 74  he text of the t
71a0: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
71b0: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
71c0: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 20 3d  Table *pSelTab =
71d0: 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74   sqliteResultSet
71e0: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
71f0: 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20   0, pSelect);.  
7200: 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30    if( pSelTab==0
7210: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 61   ) return;.    a
7220: 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d  ssert( p->aCol==
7230: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c  0 );.    p->nCol
7240: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c   = pSelTab->nCol
7250: 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20  ;.    p->aCol = 
7260: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
7270: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
7280: 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61   = 0;.    pSelTa
7290: 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
72a0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
72b0: 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a  le(0, pSelTab);.
72c0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
72d0: 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31 20 69   initFlag is 1 i
72e0: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
72f0: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
7300: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
7310: 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
7320: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
7330: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
7340: 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
7350: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
7360: 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
7370: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
7380: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
7390: 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
73a0: 66 72 6f 6d 20 74 68 65 20 70 50 61 72 73 65 2d  from the pParse-
73b0: 3e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20  >newTnum field. 
73c0: 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65   (The page numbe
73d0: 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61  r.  ** should ha
73e0: 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72  ve been put ther
73f0: 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f  e by the sqliteO
7400: 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a  penCb routine.).
7410: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
7420: 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20  e->initFlag ){. 
7430: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 70 50 61     p->tnum = pPa
7440: 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20  rse->newTnum;.  
7450: 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69  }..  /* If not i
7460: 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65  nitializing, the
7470: 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72  n create a recor
7480: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  d for the new ta
7490: 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ble.  ** in the 
74a0: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
74b0: 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ble of the datab
74c0: 61 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64  ase.  The record
74d0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72   number.  ** for
74e0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65   the new table e
74f0: 6e 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65  ntry should alre
7500: 61 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74  ady be on the st
7510: 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ack..  **.  ** I
7520: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
7530: 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69  ORARY table, wri
7540: 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74  te the entry int
7550: 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a  o the auxiliary.
7560: 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61    ** file instea
7570: 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61  d of into the ma
7580: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
7590: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
75a0: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29  arse->initFlag )
75b0: 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
75c0: 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20 76   Vdbe *v;..    v
75d0: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
75e0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
75f0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
7600: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c  .    if( p->pSel
7610: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect==0 ){.      
7620: 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62  /* A regular tab
7630: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  le */.      sqli
7640: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7650: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 30  P_CreateTable, 0
7660: 2c 20 70 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20  , p->iDb);.     
7670: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
7680: 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP3(v, -1, (char
7690: 20 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20 50 33 5f   *)&p->tnum, P3_
76a0: 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d 65  POINTER);.    }e
76b0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
76c0: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 71  view */.      sq
76d0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
76e0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
76f0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  0);.    }.    p-
7700: 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 73  >tnum = 0;.    s
7710: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
7720: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
7730: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
7740: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
7750: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  ng, 0, 0);.    i
7760: 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  f( p->pSelect==0
7770: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7780: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
7790: 2d 31 2c 20 22 74 61 62 6c 65 22 2c 20 50 33 5f  -1, "table", P3_
77a0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 65 6c  STATIC);.    }el
77b0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
77c0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
77d0: 2d 31 2c 20 22 76 69 65 77 22 2c 20 50 33 5f 53  -1, "view", P3_S
77e0: 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  TATIC);.    }.  
77f0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7800: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
7810: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
7820: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
7830: 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50   -1, p->zName, P
7840: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  3_STATIC);.    s
7850: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
7860: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
7870: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
7880: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
7890: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  , p->zName, P3_S
78a0: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
78b0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
78c0: 50 5f 44 75 70 2c 20 34 2c 20 30 29 3b 0a 20 20  P_Dup, 4, 0);.  
78d0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
78e0: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
78f0: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
7900: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
7910: 63 68 61 72 20 2a 7a 20 3d 20 63 72 65 61 74 65  char *z = create
7920: 54 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20 20  TableStmt(p);.  
7930: 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73 74 72 6c      n = z ? strl
7940: 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 20 20 20  en(z) : 0;.     
7950: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
7960: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e 29  eP3(v, -1, z, n)
7970: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
7980: 65 65 28 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ee(z);.    }else
7990: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
79a0: 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 20  pEnd!=0 );.     
79b0: 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e   n = Addr(pEnd->
79c0: 7a 29 20 2d 20 41 64 64 72 28 70 50 61 72 73 65  z) - Addr(pParse
79d0: 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 29  ->sFirstToken.z)
79e0: 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   + 1;.      sqli
79f0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
7a00: 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 73 46  , -1, pParse->sF
7a10: 69 72 73 74 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b  irstToken.z, n);
7a20: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
7a30: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
7a40: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20  _MakeRecord, 5, 
7a50: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
7a60: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
7a70: 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a  tIntKey, 0, 0);.
7a80: 20 20 20 20 69 66 28 20 21 70 2d 3e 69 44 62 20      if( !p->iDb 
7a90: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43  ){.      sqliteC
7aa0: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20  hangeCookie(db, 
7ab0: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  v);.    }.    sq
7ac0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7ad0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
7ae0: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  ;.    if( pSelec
7af0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
7b00: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
7b10: 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e 69 44 62  _Integer, p->iDb
7b20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
7b30: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7b40: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20  P_OpenWrite, 1, 
7b50: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
7b60: 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20  ->nTab = 2;.    
7b70: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70    sqliteSelect(p
7b80: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
7b90: 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30 2c  SRT_Table, 1, 0,
7ba0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
7bb0: 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65    sqliteEndWrite
7bc0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
7bd0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  );.  }..  /* Add
7be0: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68   the table to th
7bf0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
7c00: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
7c10: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  e database..  */
7c20: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
7c30: 78 70 6c 61 69 6e 3d 3d 30 20 26 26 20 70 50 61  xplain==0 && pPa
7c40: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
7c50: 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b      Table *pOld;
7c60: 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  .    FKey *pFKey
7c70: 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
7c80: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
7c90: 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 74  b->aDb[p->iDb].t
7ca0: 62 6c 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20  blHash, .       
7cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cc0: 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73       p->zName, s
7cd0: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
7ce0: 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  1, p);.    if( p
7cf0: 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
7d00: 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
7d10: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
7d20: 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
7d30: 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
7d40: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  */.      return;
7d50: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
7d60: 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70  FKey=p->pFKey; p
7d70: 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65  FKey; pFKey=pFKe
7d80: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20  y->pNextFrom){. 
7d90: 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73       int nTo = s
7da0: 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f  trlen(pFKey->zTo
7db0: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 4b  ) + 1;.      pFK
7dc0: 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71  ey->pNextTo = sq
7dd0: 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 64 62  liteHashFind(&db
7de0: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61 46  ->aDb[p->iDb].aF
7df0: 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c  Key, pFKey->zTo,
7e00: 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c   nTo);.      sql
7e10: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
7e20: 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61  b->aDb[p->iDb].a
7e30: 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f  FKey, pFKey->zTo
7e40: 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20  , nTo, pFKey);. 
7e50: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
7e60: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a  >pNewTable = 0;.
7e70: 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b      db->nTable++
7e80: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
7e90: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
7ea0: 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a  Changes;.  }.}..
7eb0: 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  /*.** The parser
7ec0: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
7ed0: 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ine in order to 
7ee0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45  create a new VIE
7ef0: 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  W.*/.void sqlite
7f00: 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61  CreateView(.  Pa
7f10: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7f20: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
7f30: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
7f40: 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20  en *pBegin,     
7f50: 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
7f60: 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
7f70: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
7f80: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
7f90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b        /* The tok
7fa0: 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  en that holds th
7fb0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  e name of the vi
7fc0: 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ew */.  Select *
7fd0: 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20  pSelect,   /* A 
7fe0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
7ff0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
8000: 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a  e the new view *
8010: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 20  /.  int isTemp  
8020: 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66         /* TRUE f
8030: 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76  or a TEMPORARY v
8040: 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  iew */.){.  Tabl
8050: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  e *p;.  int n;. 
8060: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
8070: 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20    Token sEnd;.  
8080: 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 0a 20  DbFixer sFix;.. 
8090: 20 73 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c   sqliteStartTabl
80a0: 65 28 70 50 61 72 73 65 2c 20 70 42 65 67 69 6e  e(pParse, pBegin
80b0: 2c 20 70 4e 61 6d 65 2c 20 69 73 54 65 6d 70 2c  , pName, isTemp,
80c0: 20 31 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73   1);.  p = pPars
80d0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
80e0: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72  if( p==0 || pPar
80f0: 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
8100: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65  sqliteSelectDele
8110: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  te(pSelect);.   
8120: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
8130: 66 28 20 73 71 6c 69 74 65 46 69 78 49 6e 69 74  f( sqliteFixInit
8140: 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
8150: 70 2d 3e 69 44 62 2c 20 22 76 69 65 77 22 2c 20  p->iDb, "view", 
8160: 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20 73 71  pName).    && sq
8170: 6c 69 74 65 46 69 78 53 65 6c 65 63 74 28 26 73  liteFixSelect(&s
8180: 46 69 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20  Fix, pSelect).  
8190: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c  ){.    sqliteSel
81a0: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
81b0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
81c0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61    }..  /* Make a
81d0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74   copy of the ent
81e0: 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ire SELECT state
81f0: 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
8200: 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a  s the view..  **
8210: 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65   This will force
8220: 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f   all the Expr.to
8230: 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20  ken.z values to 
8240: 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  be dynamically. 
8250: 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61   ** allocated ra
8260: 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20  ther than point 
8270: 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  to the input str
8280: 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e  ing - which mean
8290: 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79  s that.  ** they
82a0: 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66   will persist af
82b0: 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ter the current 
82c0: 73 71 6c 69 74 65 5f 65 78 65 63 28 29 20 63 61  sqlite_exec() ca
82d0: 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f  ll returns..  */
82e0: 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20  .  p->pSelect = 
82f0: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 75 70 28  sqliteSelectDup(
8300: 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
8310: 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  teSelectDelete(p
8320: 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 21  Select);.  if( !
8330: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
8340: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 69   ){.    sqliteVi
8350: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
8360: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d  (pParse, p);.  }
8370: 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
8380: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
8390: 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
83a0: 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70  nt.  Make sEnd p
83b0: 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65  oint to.  ** the
83c0: 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e   end..  */.  sEn
83d0: 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73  d = pParse->sLas
83e0: 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45  tToken;.  if( sE
83f0: 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45  nd.z[0]!=0 && sE
8400: 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a  nd.z[0]!=';' ){.
8410: 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45      sEnd.z += sE
8420: 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64  nd.n;.  }.  sEnd
8430: 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 28  .n = 0;.  n = ((
8440: 69 6e 74 29 73 45 6e 64 2e 7a 29 20 2d 20 28 69  int)sEnd.z) - (i
8450: 6e 74 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20  nt)pBegin->z;.  
8460: 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20  z = pBegin->z;. 
8470: 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 28   while( n>0 && (
8480: 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69  z[n-1]==';' || i
8490: 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29 20  sspace(z[n-1])) 
84a0: 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64  ){ n--; }.  sEnd
84b0: 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20  .z = &z[n-1];.  
84c0: 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f  sEnd.n = 1;..  /
84d0: 2a 20 55 73 65 20 73 71 6c 69 74 65 45 6e 64 54  * Use sqliteEndT
84e0: 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68  able() to add th
84f0: 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51  e view to the SQ
8500: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
8510: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 45 6e 64  e */.  sqliteEnd
8520: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 26 73  Table(pParse, &s
8530: 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  End, 0);.  retur
8540: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  n;.}../*.** The 
8550: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
8560: 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79  pTable is really
8570: 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69   a VIEW.  Fill i
8580: 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a  n the names of.*
8590: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  * the columns of
85a0: 20 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65   the view in the
85b0: 20 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72   pTable structur
85c0: 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  e.  Return the n
85d0: 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f  umber.** of erro
85e0: 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  rs.  If an error
85f0: 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61   is seen leave a
8600: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
8610: 69 6e 20 70 50 61 72 65 2d 3e 7a 45 72 72 4d 73  in pPare->zErrMs
8620: 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
8630: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
8640: 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
8650: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
8660: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  {.  ExprList *pE
8670: 4c 69 73 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  List;.  Select *
8680: 70 53 65 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70  pSel;.  Table *p
8690: 53 65 6c 54 61 62 3b 0a 20 20 69 6e 74 20 6e 45  SelTab;.  int nE
86a0: 72 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  rr = 0;..  asser
86b0: 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 20 20  t( pTable );..  
86c0: 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43  /* A positive nC
86d0: 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c  ol means the col
86e0: 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74  umns names for t
86f0: 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a  his view are.  *
8700: 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e  * already known.
8710: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
8720: 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74  le->nCol>0 ) ret
8730: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e  urn 0;..  /* A n
8740: 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20  egative nCol is 
8750: 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72  a special marker
8760: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65   meaning that we
8770: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20   are currently. 
8780: 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f   ** trying to co
8790: 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e  mpute the column
87a0: 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65   names.  If we e
87b0: 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  nter this routin
87c0: 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65  e with.  ** a ne
87d0: 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20  gative nCol, it 
87e0: 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72  means two or mor
87f0: 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c  e views form a l
8800: 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  oop, like this:.
8810: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52    **.  **     CR
8820: 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53  EATE VIEW one AS
8830: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
8840: 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  wo;.  **     CRE
8850: 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20  ATE VIEW two AS 
8860: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e  SELECT * FROM on
8870: 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74  e;.  **.  ** Act
8880: 75 61 6c 6c 79 2c 20 74 68 69 73 20 65 72 72 6f  ually, this erro
8890: 72 20 69 73 20 63 61 75 67 68 74 20 70 72 65 76  r is caught prev
88a0: 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20 74 68  iously and so th
88b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
88c0: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77  .  ** should alw
88d0: 61 79 73 20 66 61 69 6c 2e 20 20 42 75 74 20 77  ays fail.  But w
88e0: 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 69 74 20  e will leave it 
88f0: 69 6e 20 70 6c 61 63 65 20 6a 75 73 74 20 74 6f  in place just to
8900: 20 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20   be safe..  */. 
8910: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
8920: 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  l<0 ){.    sqlit
8930: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
8940: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 76 69  se->zErrMsg, "vi
8950: 65 77 20 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  ew ", pTable->zN
8960: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 22 20  ame,.         " 
8970: 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65  is circularly de
8980: 66 69 6e 65 64 22 2c 20 28 63 68 61 72 2a 29 30  fined", (char*)0
8990: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
89a0: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
89b0: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 1;.  }..  /* I
89c0: 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
89d0: 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e  r, it means we n
89e0: 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
89f0: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a  he table names..
8a00: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
8a10: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29  Table->pSelect )
8a20: 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c  ; /* If nCol==0,
8a30: 20 74 68 65 6e 20 70 54 61 62 6c 65 20 6d 75 73   then pTable mus
8a40: 74 20 62 65 20 61 20 56 49 45 57 20 2a 2f 0a 20  t be a VIEW */. 
8a50: 20 70 53 65 6c 20 3d 20 70 54 61 62 6c 65 2d 3e   pSel = pTable->
8a60: 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e  pSelect;..  /* N
8a70: 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c  ote that the cal
8a80: 6c 20 74 6f 20 73 71 6c 69 74 65 52 65 73 75 6c  l to sqliteResul
8a90: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77  tSetOfSelect() w
8aa0: 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20  ill expand any. 
8ab0: 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73   ** "*" elements
8ac0: 20 69 6e 20 74 68 69 73 20 6c 69 73 74 2e 20 20   in this list.  
8ad0: 42 75 74 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  But we will need
8ae0: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
8af0: 6c 69 73 74 0a 20 20 2a 2a 20 62 61 63 6b 20 74  list.  ** back t
8b00: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
8b10: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 66 74  onfiguration aft
8b20: 65 72 77 61 72 64 73 2c 20 73 6f 20 77 65 20 73  erwards, so we s
8b30: 61 76 65 20 61 20 63 6f 70 79 20 6f 66 0a 20 20  ave a copy of.  
8b40: 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** the original 
8b50: 69 6e 20 70 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a  in pEList..  */.
8b60: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 2d    pEList = pSel-
8b70: 3e 70 45 4c 69 73 74 3b 0a 20 20 70 53 65 6c 2d  >pEList;.  pSel-
8b80: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
8b90: 45 78 70 72 4c 69 73 74 44 75 70 28 70 45 4c 69  ExprListDup(pELi
8ba0: 73 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 2d  st);.  if( pSel-
8bb0: 3e 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  >pEList==0 ){.  
8bc0: 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d    pSel->pEList =
8bd0: 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 72 65 74   pEList;.    ret
8be0: 75 72 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  urn 1;  /* Mallo
8bf0: 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a  c failed */.  }.
8c00: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
8c10: 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d   -1;.  pSelTab =
8c20: 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74   sqliteResultSet
8c30: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
8c40: 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 69 66 28   0, pSel);.  if(
8c50: 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20   pSelTab ){.    
8c60: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
8c70: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70  aCol==0 );.    p
8c80: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53  Table->nCol = pS
8c90: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
8ca0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
8cb0: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
8cc0: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
8cd0: 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61   = 0;.    pSelTa
8ce0: 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
8cf0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
8d00: 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a  le(0, pSelTab);.
8d10: 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74      DbSetPropert
8d20: 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  y(pParse->db, pT
8d30: 61 62 6c 65 2d 3e 69 44 62 2c 20 44 42 5f 55 6e  able->iDb, DB_Un
8d40: 72 65 73 65 74 56 69 65 77 73 29 3b 0a 20 20 7d  resetViews);.  }
8d50: 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 6c 65  else{.    pTable
8d60: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
8d70: 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71  nErr++;.  }.  sq
8d80: 6c 69 74 65 53 65 6c 65 63 74 55 6e 62 69 6e 64  liteSelectUnbind
8d90: 28 70 53 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65  (pSel);.  sqlite
8da0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
8db0: 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sel->pEList);.  
8dc0: 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70  pSel->pEList = p
8dd0: 45 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e 20  EList;.  return 
8de0: 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  nErr;  .}../*.**
8df0: 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
8e00: 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68 65  n names from the
8e10: 20 56 49 45 57 20 70 54 61 62 6c 65 2e 0a 2a 2a   VIEW pTable..**
8e20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8e30: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
8e40: 76 65 72 20 61 6e 79 20 6f 74 68 65 72 20 74 61  ver any other ta
8e50: 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 6d  ble or view is m
8e60: 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 54 68 65 20  odified..** The 
8e70: 76 69 65 77 20 70 61 73 73 65 64 20 69 6e 74 6f  view passed into
8e80: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
8e90: 67 68 74 20 64 65 70 65 6e 64 20 64 69 72 65 63  ght depend direc
8ea0: 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c  tly or indirectl
8eb0: 79 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 64 69  y.** on the modi
8ec0: 66 69 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  fied or deleted 
8ed0: 74 61 62 6c 65 20 73 6f 20 77 65 20 6e 65 65 64  table so we need
8ee0: 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 6f 6c   to clear the ol
8ef0: 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d 65  d column.** name
8f00: 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 77  s so that they w
8f10: 69 6c 6c 20 62 65 20 72 65 63 6f 6d 70 75 74 65  ill be recompute
8f20: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
8f30: 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
8f40: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62  tColumnNames(Tab
8f50: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69  le *pTable){.  i
8f60: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62  nt i;.  if( pTab
8f70: 6c 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 2d  le==0 || pTable-
8f80: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 72 65  >pSelect==0 ) re
8f90: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 54 61 62  turn;.  if( pTab
8fa0: 6c 65 2d 3e 6e 43 6f 6c 3d 3d 30 20 29 20 72 65  le->nCol==0 ) re
8fb0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
8fc0: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
8fd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
8fe0: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
8ff0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[i].zName);.  
9000: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
9010: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66  ble->aCol[i].zDf
9020: 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  lt);.    sqliteF
9030: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
9040: 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a  [i].zType);.  }.
9050: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
9060: 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70 54  ble->aCol);.  pT
9070: 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  able->aCol = 0;.
9080: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
9090: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   0;.}../*.** Cle
90a0: 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
90b0: 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56  mes from every V
90c0: 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20  IEW in database 
90d0: 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  idx..*/.static v
90e0: 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
90f0: 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 20 2a 64  setAll(sqlite *d
9100: 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48  b, int idx){.  H
9110: 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66  ashElem *i;.  if
9120: 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79  ( !DbHasProperty
9130: 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
9140: 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74  esetViews) ) ret
9150: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c  urn;.  for(i=sql
9160: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
9170: 2d 3e 61 44 62 5b 69 64 78 5d 2e 74 62 6c 48 61  ->aDb[idx].tblHa
9180: 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65  sh); i; i=sqlite
9190: 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
91a0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
91b0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
91c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
91d0: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
91e0: 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65    sqliteViewRese
91f0: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61  tColumnNames(pTa
9200: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
9210: 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
9220: 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
9230: 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 0a 2f 2a  setViews);.}../*
9240: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65  .** Given a toke
9250: 6e 2c 20 6c 6f 6f 6b 20 75 70 20 61 20 74 61 62  n, look up a tab
9260: 6c 65 20 77 69 74 68 20 74 68 61 74 20 6e 61 6d  le with that nam
9270: 65 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64  e.  If not found
9280: 2c 20 6c 65 61 76 65 0a 2a 2a 20 61 6e 20 65 72  , leave.** an er
9290: 72 6f 72 20 66 6f 72 20 74 68 65 20 70 61 72 73  ror for the pars
92a0: 65 72 20 74 6f 20 66 69 6e 64 20 61 6e 64 20 72  er to find and r
92b0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 54  eturn NULL..*/.T
92c0: 61 62 6c 65 20 2a 73 71 6c 69 74 65 54 61 62 6c  able *sqliteTabl
92d0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 50 61 72 73 65  eFromToken(Parse
92e0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
92f0: 2a 70 54 6f 6b 29 7b 0a 20 20 63 68 61 72 20 2a  *pTok){.  char *
9300: 7a 4e 61 6d 65 3b 0a 20 20 54 61 62 6c 65 20 2a  zName;.  Table *
9310: 70 54 61 62 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  pTab;.  zName = 
9320: 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46  sqliteTableNameF
9330: 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29 3b 0a  romToken(pTok);.
9340: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
9350: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 54 61   return 0;.  pTa
9360: 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61  b = sqliteFindTa
9370: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
9380: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c  zName, 0);.  sql
9390: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
93a0: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
93b0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53  .    sqliteSetNS
93c0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
93d0: 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68  ErrMsg, "no such
93e0: 20 74 61 62 6c 65 3a 20 22 2c 20 30 2c 20 0a 20   table: ", 0, . 
93f0: 20 20 20 20 20 20 20 70 54 6f 6b 2d 3e 7a 2c 20         pTok->z, 
9400: 70 54 6f 6b 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  pTok->n, 0);.   
9410: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
9420: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54  .  }.  return pT
9430: 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ab;.}../*.** Thi
9440: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
9450: 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  led to do the wo
9460: 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42  rk of a DROP TAB
9470: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
9480: 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61   pName is the na
9490: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
94a0: 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a  to be dropped..*
94b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 72 6f  /.void sqliteDro
94c0: 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
94d0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
94e0: 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b  me, int isView){
94f0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
9500: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
9510: 6e 74 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74  nt base;.  sqlit
9520: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
9530: 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
9540: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
9550: 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c  rr || sqlite_mal
9560: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
9570: 75 72 6e 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20  urn;.  pTable = 
9580: 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54  sqliteTableFromT
9590: 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 4e 61  oken(pParse, pNa
95a0: 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  me);.  if( pTabl
95b0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
95c0: 20 69 44 62 20 3d 20 70 54 61 62 6c 65 2d 3e 69   iDb = pTable->i
95d0: 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  Db;.  assert( iD
95e0: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
95f0: 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  nDb );.#ifndef S
9600: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
9610: 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
9620: 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63   int code;.    c
9630: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
9640: 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70  = SCHEMA_TABLE(p
9650: 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 20 20 20  Table->iDb);.   
9660: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
9670: 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62 6c   = db->aDb[pTabl
9680: 65 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  e->iDb].zName;. 
9690: 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74     if( sqliteAut
96a0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
96b0: 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54  QLITE_DELETE, zT
96c0: 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20  ab, 0, zDb)){.  
96d0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
96e0: 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
96f0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44   ){.      if( iD
9700: 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
9710: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
9720: 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  OP_TEMP_VIEW;.  
9730: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9740: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
9750: 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20  _DROP_VIEW;.    
9760: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
9770: 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20       if( iDb==1 
9780: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
9790: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
97a0: 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
97b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
97c0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
97d0: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
97e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
97f0: 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70  qliteAuthCheck(p
9800: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61  Parse, code, pTa
9810: 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a  ble->zName, 0, z
9820: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Db) ){.      ret
9830: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
9840: 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65  f( sqliteAuthChe
9850: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
9860: 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 6c 65  E_DELETE, pTable
9870: 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  ->zName, 0, zDb)
9880: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
9890: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
98a0: 69 66 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  if.  if( pTable-
98b0: 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
98c0: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
98d0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
98e0: 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61  g, "table ", pTa
98f0: 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20  ble->zName, .   
9900: 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20 62 65      " may not be
9910: 20 64 72 6f 70 70 65 64 22 2c 20 28 63 68 61 72   dropped", (char
9920: 2a 29 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  *)0);.    pParse
9930: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
9940: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
9950: 69 73 56 69 65 77 20 26 26 20 70 54 61 62 6c 65  isView && pTable
9960: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
9970: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
9980: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
9990: 72 4d 73 67 2c 20 22 75 73 65 20 44 52 4f 50 20  rMsg, "use DROP 
99a0: 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20  TABLE to delete 
99b0: 74 61 62 6c 65 20 22 2c 0a 20 20 20 20 20 20 70  table ",.      p
99c0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 28 63  Table->zName, (c
99d0: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 70 50 61  har*)0);.    pPa
99e0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
99f0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
9a00: 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54  f( !isView && pT
9a10: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 7b  able->pSelect ){
9a20: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
9a30: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
9a40: 72 72 4d 73 67 2c 20 22 75 73 65 20 44 52 4f 50  rrMsg, "use DROP
9a50: 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20   VIEW to delete 
9a60: 76 69 65 77 20 22 2c 0a 20 20 20 20 20 20 70 54  view ",.      pT
9a70: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 28 63 68  able->zName, (ch
9a80: 61 72 2a 29 30 29 3b 0a 20 20 20 20 70 50 61 72  ar*)0);.    pPar
9a90: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
9aa0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
9ab0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
9ac0: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61  to remove the ta
9ad0: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  ble from the mas
9ae0: 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ter table.  ** o
9af0: 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76  n disk..  */.  v
9b00: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
9b10: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
9b20: 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  v ){.    static 
9b30: 56 64 62 65 4f 70 20 64 72 6f 70 54 61 62 6c 65  VdbeOp dropTable
9b40: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f  [] = {.      { O
9b50: 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c  P_Rewind,     0,
9b60: 20 41 44 44 52 28 38 29 2c 20 20 30 7d 2c 0a 20   ADDR(8),  0},. 
9b70: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
9b80: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
9b90: 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20     0}, /* 1 */. 
9ba0: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f       { OP_MemSto
9bb0: 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20  re,   1, 1,     
9bc0: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
9bd0: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c  P_MemLoad,    1,
9be0: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   0,        0}, /
9bf0: 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 3 */.      { O
9c00: 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c  P_Column,     0,
9c10: 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   2,        0},. 
9c20: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20       { OP_Ne,   
9c30: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 37 29        0, ADDR(7)
9c40: 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ,  0},.      { O
9c50: 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c  P_Delete,     0,
9c60: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
9c70: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20       { OP_Next, 
9c80: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 33 29        0, ADDR(3)
9c90: 2c 20 20 30 7d 2c 20 2f 2a 20 37 20 2a 2f 0a 20  ,  0}, /* 7 */. 
9ca0: 20 20 20 7d 3b 0a 20 20 20 20 49 6e 64 65 78 20     };.    Index 
9cb0: 2a 70 49 64 78 3b 0a 20 20 20 20 54 72 69 67 67  *pIdx;.    Trigg
9cc0: 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20  er *pTrigger;.  
9cd0: 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69    sqliteBeginWri
9ce0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
9cf0: 73 65 2c 20 30 2c 20 70 54 61 62 6c 65 2d 3e 69  se, 0, pTable->i
9d00: 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f  Db);..    /* Dro
9d10: 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61  p all triggers a
9d20: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
9d30: 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
9d40: 72 6f 70 70 65 64 20 2a 2f 0a 20 20 20 20 70 54  ropped */.    pT
9d50: 72 69 67 67 65 72 20 3d 20 70 54 61 62 6c 65 2d  rigger = pTable-
9d60: 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 77  >pTrigger;.    w
9d70: 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29  hile( pTrigger )
9d80: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9d90: 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d 70  pTrigger->iDb==p
9da0: 54 61 62 6c 65 2d 3e 69 44 62 20 7c 7c 20 70 54  Table->iDb || pT
9db0: 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d 31 20 29  rigger->iDb==1 )
9dc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 72  ;.      sqliteDr
9dd0: 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61  opTriggerPtr(pPa
9de0: 72 73 65 2c 20 70 54 72 69 67 67 65 72 2c 20 31  rse, pTrigger, 1
9df0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
9e00: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
9e10: 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72          pTrigger
9e20: 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65   = pTrigger->pNe
9e30: 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  xt;.      }else{
9e40: 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65  .        pTrigge
9e50: 72 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54 72 69  r = pTable->pTri
9e60: 67 67 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gger;.      }.  
9e70: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70    }..    /* Drop
9e80: 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54   all SQLITE_MAST
9e90: 45 52 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ER entries that 
9ea0: 72 65 66 65 72 20 74 6f 20 74 68 65 20 74 61 62  refer to the tab
9eb0: 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  le */.    sqlite
9ec0: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
9ed0: 76 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b  v, pTable->iDb);
9ee0: 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69  .    base = sqli
9ef0: 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
9f00: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f  v, ArraySize(dro
9f10: 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54 61 62  pTable), dropTab
9f20: 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  le);.    sqliteV
9f30: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62  dbeChangeP3(v, b
9f40: 61 73 65 2b 31 2c 20 70 54 61 62 6c 65 2d 3e 7a  ase+1, pTable->z
9f50: 4e 61 6d 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  Name, 0);..    /
9f60: 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54  * Drop all SQLIT
9f70: 45 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20 65 6e  E_TEMP_MASTER en
9f80: 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72  tries that refer
9f90: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   to the table */
9fa0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d  .    if( pTable-
9fb0: 3e 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20  >iDb!=1 ){.     
9fc0: 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65   sqliteOpenMaste
9fd0: 72 54 61 62 6c 65 28 76 2c 20 31 29 3b 0a 20 20  rTable(v, 1);.  
9fe0: 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74      base = sqlit
9ff0: 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  eVdbeAddOpList(v
a000: 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70  , ArraySize(drop
a010: 54 61 62 6c 65 29 2c 20 64 72 6f 70 54 61 62 6c  Table), dropTabl
a020: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
a030: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
a040: 62 61 73 65 2b 31 2c 20 70 54 61 62 6c 65 2d 3e  base+1, pTable->
a050: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d  zName, 0);.    }
a060: 0a 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  ..    if( pTable
a070: 2d 3e 69 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20  ->iDb==0 ){.    
a080: 20 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f    sqliteChangeCo
a090: 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a 20 20 20  okie(db, v);.   
a0a0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62   }.    sqliteVdb
a0b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
a0c0: 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  se, 0, 0);.    i
a0d0: 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20  f( !isView ){.  
a0e0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
a0f0: 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  dOp(v, OP_Destro
a100: 79 2c 20 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 2c  y, pTable->tnum,
a110: 20 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 20   pTable->iDb);. 
a120: 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
a130: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49  able->pIndex; pI
a140: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
a150: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 73  Next){.        s
a160: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
a170: 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49  , OP_Destroy, pI
a180: 64 78 2d 3e 74 6e 75 6d 2c 20 70 49 64 78 2d 3e  dx->tnum, pIdx->
a190: 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iDb);.      }.  
a1a0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 45 6e    }.    sqliteEn
a1b0: 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
a1c0: 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20  pParse);.  }..  
a1d0: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e  /* Delete the in
a1e0: 2d 6d 65 6d 6f 72 79 20 64 65 73 63 72 69 70 74  -memory descript
a1f0: 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
a200: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65  ..  **.  ** Exce
a210: 70 74 69 6f 6e 3a 20 69 66 20 74 68 65 20 53 51  ption: if the SQ
a220: 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 67 61  L statement bega
a230: 6e 20 77 69 74 68 20 74 68 65 20 45 58 50 4c 41  n with the EXPLA
a240: 49 4e 20 6b 65 79 77 6f 72 64 2c 0a 20 20 2a 2a  IN keyword,.  **
a250: 20 74 68 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73   then no changes
a260: 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65 2e   should be made.
a270: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
a280: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
a290: 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b      sqliteUnlink
a2a0: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 64  AndDeleteTable(d
a2b0: 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20  b, pTable);.    
a2c0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
a2d0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
a2e0: 73 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56  s;.  }.  sqliteV
a2f0: 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20  iewResetAll(db, 
a300: 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  iDb);.}../*.** T
a310: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 73  his routine cons
a320: 74 72 75 63 74 73 20 61 20 50 33 20 73 74 72 69  tructs a P3 stri
a330: 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ng suitable for 
a340: 61 6e 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79  an OP_MakeIdxKey
a350: 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 6e 64 20 61  .** opcode and a
a360: 64 64 73 20 74 68 61 74 20 50 33 20 73 74 72 69  dds that P3 stri
a370: 6e 67 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72  ng to the most r
a380: 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64  ecently inserted
a390: 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20   instruction.** 
a3a0: 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  in the virtual m
a3b0: 61 63 68 69 6e 65 2e 20 20 54 68 65 20 50 33 20  achine.  The P3 
a3c0: 73 74 72 69 6e 67 20 63 6f 6e 73 69 73 74 73 20  string consists 
a3d0: 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72  of a single char
a3e0: 61 63 74 65 72 0a 2a 2a 20 66 6f 72 20 65 61 63  acter.** for eac
a3f0: 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  h column in the 
a400: 69 6e 64 65 78 20 70 49 64 78 20 6f 66 20 74 61  index pIdx of ta
a410: 62 6c 65 20 70 54 61 62 2e 20 20 49 66 20 74 68  ble pTab.  If th
a420: 65 20 63 6f 6c 75 6d 6e 20 75 73 65 73 0a 2a 2a  e column uses.**
a430: 20 61 20 6e 75 6d 65 72 69 63 20 73 6f 72 74 20   a numeric sort 
a440: 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68 65 20  order, then the 
a450: 50 33 20 73 74 72 69 6e 67 20 63 68 61 72 61 63  P3 string charac
a460: 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ter correspondin
a470: 67 20 74 6f 0a 2a 2a 20 74 68 61 74 20 63 6f 6c  g to.** that col
a480: 75 6d 6e 20 69 73 20 27 6e 27 2e 20 20 49 66 20  umn is 'n'.  If 
a490: 74 68 65 20 63 6f 6c 75 6d 6e 20 75 73 65 73 20  the column uses 
a4a0: 61 20 74 65 78 74 20 73 6f 72 74 20 6f 72 64 65  a text sort orde
a4b0: 72 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 50  r, then the.** P
a4c0: 33 20 73 74 72 69 6e 67 20 69 73 20 27 74 27 2e  3 string is 't'.
a4d0: 20 20 53 65 65 20 74 68 65 20 4f 50 5f 4d 61 6b    See the OP_Mak
a4e0: 65 49 64 78 4b 65 79 20 6f 70 63 6f 64 65 20 64  eIdxKey opcode d
a4f0: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72  ocumentation for
a500: 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  .** additional i
a510: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 65 65  nformation.  See
a520: 20 61 6c 73 6f 20 74 68 65 20 73 71 6c 69 74 65   also the sqlite
a530: 41 64 64 4b 65 79 54 79 70 65 28 29 20 72 6f 75  AddKeyType() rou
a540: 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tine..*/.void sq
a550: 6c 69 74 65 41 64 64 49 64 78 4b 65 79 54 79 70  liteAddIdxKeyTyp
a560: 65 28 56 64 62 65 20 2a 76 2c 20 49 6e 64 65 78  e(Vdbe *v, Index
a570: 20 2a 70 49 64 78 29 7b 0a 20 20 63 68 61 72 20   *pIdx){.  char 
a580: 2a 7a 54 79 70 65 3b 0a 20 20 54 61 62 6c 65 20  *zType;.  Table 
a590: 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20  *pTab;.  int i, 
a5a0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  n;.  assert( pId
a5b0: 78 21 3d 30 20 26 26 20 70 49 64 78 2d 3e 70 54  x!=0 && pIdx->pT
a5c0: 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 70 54 61  able!=0 );.  pTa
a5d0: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
a5e0: 3b 0a 20 20 6e 20 3d 20 70 49 64 78 2d 3e 6e 43  ;.  n = pIdx->nC
a5f0: 6f 6c 75 6d 6e 3b 0a 20 20 7a 54 79 70 65 20 3d  olumn;.  zType =
a600: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
a610: 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a  ( n+1 );.  if( z
a620: 54 79 70 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Type==0 ) return
a630: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
a640: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
a650: 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43  iCol = pIdx->aiC
a660: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73  olumn[i];.    as
a670: 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26  sert( iCol>=0 &&
a680: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
a690: 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61   );.    if( (pTa
a6a0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 6f  b->aCol[iCol].so
a6b0: 72 74 4f 72 64 65 72 20 26 20 53 51 4c 49 54 45  rtOrder & SQLITE
a6c0: 5f 53 4f 5f 54 59 50 45 4d 41 53 4b 29 3d 3d 53  _SO_TYPEMASK)==S
a6d0: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 29 7b  QLITE_SO_TEXT ){
a6e0: 0a 20 20 20 20 20 20 7a 54 79 70 65 5b 69 5d 20  .      zType[i] 
a6f0: 3d 20 27 74 27 3b 0a 20 20 20 20 7d 65 6c 73 65  = 't';.    }else
a700: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 5b 69 5d  {.      zType[i]
a710: 20 3d 20 27 6e 27 3b 0a 20 20 20 20 7d 0a 20 20   = 'n';.    }.  
a720: 7d 0a 20 20 7a 54 79 70 65 5b 6e 5d 20 3d 20 30  }.  zType[n] = 0
a730: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 43 68  ;.  sqliteVdbeCh
a740: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 54  angeP3(v, -1, zT
a750: 79 70 65 2c 20 6e 29 3b 0a 20 20 73 71 6c 69 74  ype, n);.  sqlit
a760: 65 46 72 65 65 28 7a 54 79 70 65 29 3b 0a 7d 0a  eFree(zType);.}.
a770: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
a780: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
a790: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f   create a new fo
a7a0: 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65  reign key on the
a7b0: 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e   table.** curren
a7c0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
a7d0: 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f  uction.  pFromCo
a7e0: 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  l determines whi
a7f0: 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  ch columns.** in
a800: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
a810: 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  le point to the 
a820: 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66  foreign key.  If
a830: 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65   pFromCol==0 the
a840: 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65  n.** connect the
a850: 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74   key to the last
a860: 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64   column inserted
a870: 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61  .  pTo is the na
a880: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62  me of.** the tab
a890: 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20  le referred to. 
a8a0: 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73   pToCol is a lis
a8b0: 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  t of tables in t
a8c0: 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20  he other.** pTo 
a8d0: 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66  table that the f
a8e0: 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74  oreign key point
a8f0: 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e  s to.  flags con
a900: 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66  tains all.** inf
a910: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
a920: 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f  he conflict reso
a930: 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
a940: 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69  s specified.** i
a950: 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c  n the ON DELETE,
a960: 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f   ON UPDATE and O
a970: 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73  N INSERT clauses
a980: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20  ..**.** An FKey 
a990: 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
a9a0: 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74  ated and added t
a9b0: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
a9c0: 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63  ently.** under c
a9d0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74  onstruction in t
a9e0: 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  he pParse->pNewT
a9f0: 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65  able field.  The
aa00: 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20   new FKey.** is 
aa10: 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20  not linked into 
aa20: 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69  db->aFKey at thi
aa30: 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64  s point - that d
aa40: 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a  oes not happen.*
aa50: 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 45 6e  * until sqliteEn
aa60: 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  dTable()..**.** 
aa70: 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  The foreign key 
aa80: 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44  is set for IMMED
aa90: 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e  IATE processing.
aaa0: 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63    A subsequent c
aab0: 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  all.** to sqlite
aac0: 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
aad0: 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  ) might change t
aae0: 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e  his to DEFERRED.
aaf0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43  .*/.void sqliteC
ab00: 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28  reateForeignKey(
ab10: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
ab20: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
ab30: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
ab40: 49 64 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c  IdList *pFromCol
ab50: 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ,    /* Columns 
ab60: 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68  in this table th
ab70: 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65  at point to othe
ab80: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b  r table */.  Tok
ab90: 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20  en *pTo,        
aba0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
abb0: 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
abc0: 20 20 49 64 4c 69 73 74 20 2a 70 54 6f 43 6f 6c    IdList *pToCol
abd0: 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ,      /* Column
abe0: 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74  s in the other t
abf0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  able */.  int fl
ac00: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
ac10: 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
ac20: 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
ac30: 2e 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  . */.){.  Table 
ac40: 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  *p = pParse->pNe
ac50: 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42  wTable;.  int nB
ac60: 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  yte;.  int i;.  
ac70: 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72  int nCol;.  char
ac80: 20 2a 7a 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b   *z;.  FKey *pFK
ac90: 65 79 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ey = 0;..  asser
aca0: 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69  t( pTo!=0 );.  i
acb0: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73  f( p==0 || pPars
acc0: 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 66  e->nErr ) goto f
acd0: 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72  k_end;.  if( pFr
ace0: 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
acf0: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43  int iCol = p->nC
ad00: 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43  ol-1;.    if( iC
ad10: 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65  ol<0 ) goto fk_e
ad20: 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43  nd;.    if( pToC
ad30: 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 49  ol && pToCol->nI
ad40: 64 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  d!=1 ){.      sq
ad50: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
ad60: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
ad70: 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e   "foreign key on
ad80: 20 22 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20   ", -1,.        
ad90: 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a   p->aCol[iCol].z
ada0: 4e 61 6d 65 2c 20 2d 31 2c 20 0a 20 20 20 20 20  Name, -1, .     
adb0: 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66      " should ref
adc0: 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20  erence only one 
add0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
ade0: 22 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20  ", -1,.         
adf0: 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 2c 20  pTo->z, pTo->n, 
ae00: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
ae10: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
ae20: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
ae30: 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b   }.    nCol = 1;
ae40: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f  .  }else if( pTo
ae50: 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
ae60: 49 64 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 49  Id!=pFromCol->nI
ae70: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  d ){.    sqliteS
ae80: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
ae90: 2d 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20 20 20  ->zErrMsg, .    
aea0: 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63      "number of c
aeb0: 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67  olumns in foreig
aec0: 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d  n key does not m
aed0: 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20  atch the number 
aee0: 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f  of ".        "co
aef0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66  lumns in the ref
af00: 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 2c 20  erenced table", 
af10: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 70  (char*)0);.    p
af20: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
af30: 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
af40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
af50: 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 49  l = pFromCol->nI
af60: 64 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  d;.  }.  nByte =
af70: 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20   sizeof(*pFKey) 
af80: 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46  + nCol*sizeof(pF
af90: 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20  Key->aCol[0]) + 
afa0: 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66  pTo->n + 1;.  if
afb0: 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
afc0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f  for(i=0; i<pToCo
afd0: 6c 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  l->nId; i++){.  
afe0: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72      nByte += str
aff0: 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  len(pToCol->a[i]
b000: 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20  .zName) + 1;.   
b010: 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d   }.  }.  pFKey =
b020: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e   sqliteMalloc( n
b030: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46  Byte );.  if( pF
b040: 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b  Key==0 ) goto fk
b050: 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70  _end;.  pFKey->p
b060: 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65  From = p;.  pFKe
b070: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70  y->pNextFrom = p
b080: 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28  ->pFKey;.  z = (
b090: 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b  char*)&pFKey[1];
b0a0: 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d  .  pFKey->aCol =
b0b0: 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70   (struct sColMap
b0c0: 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65  *)z;.  z += size
b0d0: 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61  of(struct sColMa
b0e0: 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79  p)*nCol;.  pFKey
b0f0: 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d  ->zTo = z;.  mem
b100: 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70  cpy(z, pTo->z, p
b110: 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d  To->n);.  z[pTo-
b120: 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20  >n] = 0;.  z += 
b130: 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65  pTo->n+1;.  pFKe
b140: 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a  y->pNextTo = 0;.
b150: 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20    pFKey->nCol = 
b160: 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f  nCol;.  if( pFro
b170: 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70  mCol==0 ){.    p
b180: 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46  FKey->aCol[0].iF
b190: 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  rom = p->nCol-1;
b1a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
b1b0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
b1c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ++){.      int j
b1d0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
b1e0: 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29   j<p->nCol; j++)
b1f0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
b200: 6c 69 74 65 53 74 72 49 43 6d 70 28 70 2d 3e 61  liteStrICmp(p->a
b210: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46  Col[j].zName, pF
b220: 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
b230: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
b240: 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
b250: 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20  i].iFrom = j;.  
b260: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b270: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
b280: 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d  .      if( j>=p-
b290: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
b2a0: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
b2b0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
b2c0: 67 2c 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75  g, "unknown colu
b2d0: 6d 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  mn \"", .       
b2e0: 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69     pFromCol->a[i
b2f0: 5d 2e 7a 4e 61 6d 65 2c 20 22 5c 22 20 69 6e 20  ].zName, "\" in 
b300: 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
b310: 6e 69 74 69 6f 6e 22 2c 20 28 63 68 61 72 2a 29  nition", (char*)
b320: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  0);.        pPar
b330: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
b340: 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
b350: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b360: 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20   }.  if( pToCol 
b370: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
b380: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
b390: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
b3a0: 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  en(pToCol->a[i].
b3b0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46  zName);.      pF
b3c0: 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
b3d0: 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d  l = z;.      mem
b3e0: 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61  cpy(z, pToCol->a
b3f0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  [i].zName, n);. 
b400: 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20       z[n] = 0;. 
b410: 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20       z += n+1;. 
b420: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
b430: 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30  ->isDeferred = 0
b440: 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74  ;.  pFKey->delet
b450: 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20  eConf = flags & 
b460: 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75  0xff;.  pFKey->u
b470: 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61  pdateConf = (fla
b480: 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66  gs >> 8 ) & 0xff
b490: 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72  ;.  pFKey->inser
b4a0: 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e  tConf = (flags >
b4b0: 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a  > 16 ) & 0xff;..
b4c0: 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f    /* Link the fo
b4d0: 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65  reign key to the
b4e0: 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61   table as the la
b4f0: 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  st step..  */.  
b500: 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79  p->pFKey = pFKey
b510: 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a  ;.  pFKey = 0;..
b520: 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  fk_end:.  sqlite
b530: 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 73  Free(pFKey);.  s
b540: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
b550: 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73  e(pFromCol);.  s
b560: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
b570: 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a  e(pToCol);.}../*
b580: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
b590: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
b5a0: 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  an INITIALLY IMM
b5b0: 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41  EDIATE or INITIA
b5c0: 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20  LLY DEFERRED.** 
b5d0: 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61  clause is seen a
b5e0: 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65  s part of a fore
b5f0: 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
b600: 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72  on.  The isDefer
b610: 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  red.** parameter
b620: 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41   is 1 for INITIA
b630: 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64  LLY DEFERRED and
b640: 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   0 for INITIALLY
b650: 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54   IMMEDIATE..** T
b660: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
b670: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
b680: 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e   created foreign
b690: 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64   key is adjusted
b6a0: 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  .** accordingly.
b6b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44  .*/.void sqliteD
b6c0: 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50  eferForeignKey(P
b6d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
b6e0: 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 20  t isDeferred){. 
b6f0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
b700: 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69  FKey *pFKey;.  i
b710: 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73  f( (pTab = pPars
b720: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
b730: 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61   || (pFKey = pTa
b740: 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72  b->pFKey)==0 ) r
b750: 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e  eturn;.  pFKey->
b760: 69 73 44 65 66 65 72 72 65 64 20 3d 20 69 73 44  isDeferred = isD
b770: 65 66 65 72 72 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  eferred;.}../*.*
b780: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69  * Create a new i
b790: 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20  ndex for an SQL 
b7a0: 74 61 62 6c 65 2e 20 20 70 49 6e 64 65 78 20 69  table.  pIndex i
b7b0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
b7c0: 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20  e index .** and 
b7d0: 70 54 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61  pTable is the na
b7e0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
b7f0: 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
b800: 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c  dexed.  Both wil
b810: 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f  l .** be NULL fo
b820: 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  r a primary key 
b830: 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  or an index that
b840: 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20 73   is created to s
b850: 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51  atisfy a.** UNIQ
b860: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
b870: 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49  If pTable and pI
b880: 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75  ndex are NULL, u
b890: 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
b8a0: 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74  able.** as the t
b8b0: 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
b8c0: 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  ed.  pParse->pNe
b8d0: 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c  wTable is a tabl
b8e0: 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72  e that is.** cur
b8f0: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
b900: 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43 52  structed by a CR
b910: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
b920: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  ment..**.** pLis
b930: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63  t is a list of c
b940: 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
b950: 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c  exed.  pList wil
b960: 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69  l be NULL if thi
b970: 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72  s.** is a primar
b980: 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d  y key or unique-
b990: 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68  constraint on th
b9a0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f  e most recent co
b9b0: 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f  lumn added.** to
b9c0: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
b9d0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
b9e0: 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f  ruction.  .*/.vo
b9f0: 69 64 20 73 71 6c 69 74 65 43 72 65 61 74 65 49  id sqliteCreateI
ba00: 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
ba10: 50 61 72 73 65 2c 20 20 20 2f 2a 20 41 6c 6c 20  Parse,   /* All 
ba20: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
ba30: 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a  t this parse */.
ba40: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
ba50: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
ba60: 65 20 69 6e 64 65 78 2e 20 20 4d 61 79 20 62 65  e index.  May be
ba70: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69   NULL */.  SrcLi
ba80: 73 74 20 2a 70 54 61 62 6c 65 2c 20 2f 2a 20 4e  st *pTable, /* N
ba90: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
baa0: 20 74 6f 20 69 6e 64 65 78 2e 20 20 55 73 65 20   to index.  Use 
bab0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
bac0: 65 20 69 66 20 30 20 2a 2f 0a 20 20 49 64 4c 69  e if 0 */.  IdLi
bad0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
bae0: 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  A list of column
baf0: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
bb00: 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
bb10: 2c 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72  ,     /* OE_Abor
bb20: 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45  t, OE_Ignore, OE
bb30: 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f  _Replace, or OE_
bb40: 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  None */.  Token 
bb50: 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68  *pStart,   /* Th
bb60: 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
bb70: 68 61 74 20 62 65 67 69 6e 73 20 61 20 43 52 45  hat begins a CRE
bb80: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
bb90: 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
bba0: 70 45 6e 64 20 20 20 20 20 20 2f 2a 20 54 68 65  pEnd      /* The
bbb0: 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73   ")" that closes
bbc0: 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
bbd0: 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29  X statement */.)
bbe0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
bbf0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
bc00: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
bc10: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
bc20: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
bc30: 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a  o be created */.
bc40: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
bc50: 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  0;.  int i, j;. 
bc60: 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20   Token nullId;  
bc70: 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20    /* Fake token 
bc80: 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20  for an empty ID 
bc90: 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46 69 78 65  list */.  DbFixe
bca0: 72 20 73 46 69 78 3b 20 20 20 20 2f 2a 20 46 6f  r sFix;    /* Fo
bcb0: 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61  r assigning data
bcc0: 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54  base names to pT
bcd0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  able */.  int is
bce0: 54 65 6d 70 3b 20 20 20 20 20 20 2f 2a 20 54 72  Temp;      /* Tr
bcf0: 75 65 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ue for a tempora
bd00: 72 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 73 71  ry index */.  sq
bd10: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
bd20: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50  e->db;..  if( pP
bd30: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
bd40: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
bd50: 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  ed ) goto exit_c
bd60: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69  reate_index;.  i
bd70: 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  f( pParse->initF
bd80: 6c 61 67 20 0a 20 20 20 20 20 26 26 20 73 71 6c  lag .     && sql
bd90: 69 74 65 46 69 78 49 6e 69 74 28 26 73 46 69 78  iteFixInit(&sFix
bda0: 2c 20 70 50 61 72 73 65 2c 20 70 50 61 72 73 65  , pParse, pParse
bdb0: 2d 3e 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20  ->iDb, "index", 
bdc0: 70 4e 61 6d 65 29 0a 20 20 20 20 20 26 26 20 73  pName).     && s
bdd0: 71 6c 69 74 65 46 69 78 53 72 63 4c 69 73 74 28  qliteFixSrcList(
bde0: 26 73 46 69 78 2c 20 70 54 61 62 6c 65 29 0a 20  &sFix, pTable). 
bdf0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
be00: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
be10: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
be20: 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68  ind the table th
be30: 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
be40: 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72  xed.  Return ear
be50: 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ly if not found.
be60: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
be70: 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  le!=0 ){.    ass
be80: 65 72 74 28 20 70 4e 61 6d 65 21 3d 30 20 29 3b  ert( pName!=0 );
be90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
bea0: 62 6c 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ble->nSrc==1 );.
beb0: 20 20 20 20 70 54 61 62 20 3d 20 20 73 71 6c 69      pTab =  sqli
bec0: 74 65 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28  teSrcListLookup(
bed0: 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 3b  pParse, pTable);
bee0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
bef0: 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29  sert( pName==0 )
bf00: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70 50  ;.    pTab =  pP
bf10: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
bf20: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 3d  .  }.  if( pTab=
bf30: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
bf40: 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  rr ) goto exit_c
bf50: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69  reate_index;.  i
bf60: 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c  f( pTab->readOnl
bf70: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  y ){.    sqliteS
bf80: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
bf90: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c  ->zErrMsg, "tabl
bfa0: 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  e ", pTab->zName
bfb0: 2c 0a 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f  ,.      " may no
bfc0: 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 28  t be indexed", (
bfd0: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 70 50  char*)0);.    pP
bfe0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
bff0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
c000: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
c010: 69 66 28 20 70 54 61 62 2d 3e 69 44 62 3e 3d 32  if( pTab->iDb>=2
c020: 20 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74   && pParse->init
c030: 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Flag==0 ){.    s
c040: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
c050: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
c060: 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d   "table ", pTab-
c070: 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 22  >zName, .      "
c080: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 69 6e   may not have in
c090: 64 69 63 65 73 20 61 64 64 65 64 22 2c 20 28 63  dices added", (c
c0a0: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 70 50 61  har*)0);.    pPa
c0b0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
c0c0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
c0d0: 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  e_index;.  }.  i
c0e0: 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
c0f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
c100: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
c110: 3e 7a 45 72 72 4d 73 67 2c 20 22 76 69 65 77 73  >zErrMsg, "views
c120: 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
c130: 78 65 64 22 2c 20 28 63 68 61 72 2a 29 30 29 3b  xed", (char*)0);
c140: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
c150: 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  r++;.    goto ex
c160: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
c170: 0a 20 20 7d 0a 20 20 69 73 54 65 6d 70 20 3d 20  .  }.  isTemp = 
c180: 70 54 61 62 2d 3e 69 44 62 3d 3d 31 3b 0a 0a 20  pTab->iDb==1;.. 
c190: 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
c1a0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
c1b0: 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  dex.  Make sure 
c1c0: 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72  there is not alr
c1d0: 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a  eady another.  *
c1e0: 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
c1f0: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
c200: 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ame.  .  **.  **
c210: 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20   Exception:  If 
c220: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
c230: 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d  he names of perm
c240: 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72  anent indices fr
c250: 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  om the.  ** sqli
c260: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
c270: 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74  (because some ot
c280: 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e  her process chan
c290: 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20  ged the schema) 
c2a0: 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20  and.  ** one of 
c2b0: 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  the index names 
c2c0: 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68  collides with th
c2d0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70  e name of a temp
c2e0: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20  orary table or. 
c2f0: 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20   ** index, then 
c300: 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
c310: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73   to process this
c320: 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a   index..  **.  *
c330: 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74  * If pName==0 it
c340: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61   means that we a
c350: 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20  re.  ** dealing 
c360: 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b  with a primary k
c370: 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ey or UNIQUE con
c380: 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76  straint.  We hav
c390: 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a  e to invent our.
c3a0: 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20    ** own name.. 
c3b0: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20   */.  if( pName 
c3c0: 26 26 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74  && !pParse->init
c3d0: 46 6c 61 67 20 29 7b 0a 20 20 20 20 49 6e 64 65  Flag ){.    Inde
c3e0: 78 20 2a 70 49 53 61 6d 65 4e 61 6d 65 3b 20 20  x *pISameName;  
c3f0: 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 69 6e 64    /* Another ind
c400: 65 78 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ex with the same
c410: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54 61 62   name */.    Tab
c420: 6c 65 20 2a 70 54 53 61 6d 65 4e 61 6d 65 3b 20  le *pTSameName; 
c430: 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 77 69     /* A table wi
c440: 74 68 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  th same name as 
c450: 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
c460: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53   zName = sqliteS
c470: 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c  trNDup(pName->z,
c480: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
c490: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67  if( zName==0 ) g
c4a0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
c4b0: 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 28  index;.    if( (
c4c0: 70 49 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c  pISameName = sql
c4d0: 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  iteFindIndex(db,
c4e0: 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 29   zName, 0))!=0 )
c4f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  {.      sqliteSe
c500: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
c510: 3e 7a 45 72 72 4d 73 67 2c 20 22 69 6e 64 65 78  >zErrMsg, "index
c520: 20 22 2c 20 7a 4e 61 6d 65 2c 20 0a 20 20 20 20   ", zName, .    
c530: 20 20 20 20 20 22 20 61 6c 72 65 61 64 79 20 65       " already e
c540: 78 69 73 74 73 22 2c 20 28 63 68 61 72 2a 29 30  xists", (char*)0
c550: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
c560: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 67  >nErr++;.      g
c570: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
c580: 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
c590: 20 69 66 28 20 28 70 54 53 61 6d 65 4e 61 6d 65   if( (pTSameName
c5a0: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62   = sqliteFindTab
c5b0: 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  le(db, zName, 0)
c5c0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=0 ){.      sq
c5d0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
c5e0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
c5f0: 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
c600: 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  y a table named 
c610: 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  ",.         zNam
c620: 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
c630: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
c640: 2b 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  ++;.      goto e
c650: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
c660: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
c670: 69 66 28 20 70 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( pName==0 ){.
c680: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30      char zBuf[30
c690: 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ];.    int n;.  
c6a0: 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a    Index *pLoop;.
c6b0: 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54      for(pLoop=pT
c6c0: 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b  ab->pIndex, n=1;
c6d0: 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
c6e0: 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29  oop->pNext, n++)
c6f0: 7b 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  {}.    sprintf(z
c700: 42 75 66 2c 22 25 64 29 22 2c 6e 29 3b 0a 20 20  Buf,"%d)",n);.  
c710: 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20    zName = 0;.   
c720: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
c730: 28 26 7a 4e 61 6d 65 2c 20 22 28 22 2c 20 70 54  (&zName, "(", pT
c740: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 20 61 75 74  ab->zName, " aut
c750: 6f 69 6e 64 65 78 20 22 2c 20 7a 42 75 66 2c 20  oindex ", zBuf, 
c760: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 69  (char*)0);.    i
c770: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
c780: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
c790: 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ndex;.  }else{. 
c7a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
c7b0: 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e  eStrNDup(pName->
c7c0: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
c7d0: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
c7e0: 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  r authorization 
c7f0: 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  to create an ind
c800: 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ex..  */.#ifndef
c810: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
c820: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
c830: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
c840: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61  Db = db->aDb[pTa
c850: 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 0a  b->iDb].zName;..
c860: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
c870: 2d 3e 69 44 62 3d 3d 70 50 61 72 73 65 2d 3e 69  ->iDb==pParse->i
c880: 44 62 20 7c 7c 20 69 73 54 65 6d 70 20 29 3b 0a  Db || isTemp );.
c890: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75      if( sqliteAu
c8a0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
c8b0: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
c8c0: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65  CHEMA_TABLE(isTe
c8d0: 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  mp), 0, zDb) ){.
c8e0: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
c8f0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
c900: 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49    }.    i = SQLI
c910: 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b  TE_CREATE_INDEX;
c920: 0a 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20  .    if( isTemp 
c930: 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ) i = SQLITE_CRE
c940: 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ATE_TEMP_INDEX;.
c950: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75      if( sqliteAu
c960: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
c970: 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i, zName, pTab->
c980: 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
c990: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
c9a0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
c9b0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
c9c0: 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
c9d0: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
c9e0: 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
c9f0: 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
ca00: 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
ca10: 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   of the last col
ca20: 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  umn added to the
ca30: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
ca40: 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  struction..  ** 
ca50: 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65  So create a fake
ca60: 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74   list to simulat
ca70: 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69  e this..  */.  i
ca80: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
ca90: 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54     nullId.z = pT
caa0: 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
cab0: 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col-1].zName;.  
cac0: 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72    nullId.n = str
cad0: 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20  len(nullId.z);. 
cae0: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
caf0: 65 49 64 4c 69 73 74 41 70 70 65 6e 64 28 30 2c  eIdListAppend(0,
cb00: 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69   &nullId);.    i
cb10: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f  f( pList==0 ) go
cb20: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
cb30: 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ndex;.  }..  /* 
cb40: 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  ** Allocate t
cb50: 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  he index structu
cb60: 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64  re. .  */.  pInd
cb70: 65 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ex = sqliteMallo
cb80: 63 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29  c( sizeof(Index)
cb90: 20 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   + strlen(zName)
cba0: 20 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20   + 1 +.         
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
cbc0: 69 7a 65 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74  izeof(int)*pList
cbd0: 2d 3e 6e 49 64 20 29 3b 0a 20 20 69 66 28 20 70  ->nId );.  if( p
cbe0: 49 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20  Index==0 ) goto 
cbf0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
cc00: 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  x;.  pIndex->aiC
cc10: 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70  olumn = (int*)&p
cc20: 49 6e 64 65 78 5b 31 5d 3b 0a 20 20 70 49 6e 64  Index[1];.  pInd
cc30: 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61  ex->zName = (cha
cc40: 72 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f  r*)&pIndex->aiCo
cc50: 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d  lumn[pList->nId]
cc60: 3b 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64 65  ;.  strcpy(pInde
cc70: 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  x->zName, zName)
cc80: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  ;.  pIndex->pTab
cc90: 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e  le = pTab;.  pIn
cca0: 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70  dex->nColumn = p
ccb0: 4c 69 73 74 2d 3e 6e 49 64 3b 0a 20 20 70 49 6e  List->nId;.  pIn
ccc0: 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f  dex->onError = o
ccd0: 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78  nError;.  pIndex
cce0: 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e  ->autoIndex = pN
ccf0: 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78  ame==0;.  pIndex
cd00: 2d 3e 69 44 62 20 3d 20 69 73 54 65 6d 70 20 3f  ->iDb = isTemp ?
cd10: 20 31 20 3a 20 70 50 61 72 73 65 2d 3e 69 44 62   1 : pParse->iDb
cd20: 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65  ;..  /* Scan the
cd30: 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
cd40: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62  lumns of the tab
cd50: 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
cd60: 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74   and.  ** load t
cd70: 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65  he column indice
cd80: 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78  s into the Index
cd90: 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 70   structure.  Rep
cda0: 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a  ort an error.  *
cdb0: 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  * if any column 
cdc0: 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  is not found..  
cdd0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
cde0: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
cdf0: 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
ce00: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
ce10: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
ce20: 69 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73 74  iteStrICmp(pList
ce30: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[i].zName, pT
ce40: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
ce50: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
ce60: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d     }.    if( j>=
ce70: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
ce80: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
ce90: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
cea0: 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20  rMsg, "table ", 
ceb0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20  pTab->zName, .  
cec0: 20 20 20 20 20 20 22 20 68 61 73 20 6e 6f 20 63        " has no c
ced0: 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 22 2c 20 70  olumn named ", p
cee0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
cef0: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
cf00: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
cf10: 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  +;.      sqliteF
cf20: 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20  ree(pIndex);.   
cf30: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
cf40: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
cf50: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  .    pIndex->aiC
cf60: 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20  olumn[i] = j;.  
cf70: 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  }..  /* Link the
cf80: 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63   new Index struc
cf90: 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c  ture to its tabl
cfa0: 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68  e and to the oth
cfb0: 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  er.  ** in-memor
cfc0: 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  y database struc
cfd0: 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69  tures. .  */.  i
cfe0: 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  f( !pParse->expl
cff0: 61 69 6e 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ain ){.    Index
d000: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c   *p;.    p = sql
d010: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
d020: 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69  b->aDb[pIndex->i
d030: 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 0a 20 20  Db].idxHash, .  
d040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d050: 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
d060: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e  Name, strlen(pIn
d070: 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70  dex->zName)+1, p
d080: 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
d090: 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
d0a0: 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20  t( p==pIndex ); 
d0b0: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
d0c0: 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
d0d0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
d0e0: 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 67  pIndex);.      g
d0f0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
d100: 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
d110: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
d120: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
d130: 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68  es;.  }..  /* Wh
d140: 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64  en adding an ind
d150: 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ex to the list o
d160: 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20  f indices for a 
d170: 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a  table, make.  **
d180: 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65   sure all indice
d190: 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70  s labeled OE_Rep
d1a0: 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20  lace come after 
d1b0: 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65  all those labele
d1c0: 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65  d.  ** OE_Ignore
d1d0: 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
d1e0: 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72  sary for the cor
d1f0: 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  rect operation o
d200: 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e  f UPDATE.  ** an
d210: 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20  d INSERT..  */. 
d220: 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45   if( onError!=OE
d230: 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62  _Replace || pTab
d240: 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20  ->pIndex==0.    
d250: 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64     || pTab->pInd
d260: 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
d270: 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 70 49  Replace){.    pI
d280: 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54  ndex->pNext = pT
d290: 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
d2a0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70  pTab->pIndex = p
d2b0: 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Index;.  }else{.
d2c0: 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65      Index *pOthe
d2d0: 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  r = pTab->pIndex
d2e0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74  ;.    while( pOt
d2f0: 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f  her->pNext && pO
d300: 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45  ther->pNext->onE
d310: 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
d320: 20 29 7b 0a 20 20 20 20 20 20 70 4f 74 68 65 72   ){.      pOther
d330: 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
d340: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
d350: 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68  ex->pNext = pOth
d360: 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 70  er->pNext;.    p
d370: 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Other->pNext = p
d380: 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Index;.  }..  /*
d390: 20 49 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67   If the initFlag
d3a0: 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77   is 1 it means w
d3b0: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
d3c0: 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20  e SQL off the.  
d3d0: 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65  ** "sqlite_maste
d3e0: 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  r" table on the 
d3f0: 64 69 73 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f 74  disk.  So do not
d400: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69   write to the di
d410: 73 6b 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 20  sk.  ** again.  
d420: 45 78 74 72 61 63 74 20 74 68 65 20 74 61 62 6c  Extract the tabl
d430: 65 20 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68  e number from th
d440: 65 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75  e pParse->newTnu
d450: 6d 20 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20  m field..  */.  
d460: 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74  if( pParse->init
d470: 46 6c 61 67 20 26 26 20 70 54 61 62 6c 65 21 3d  Flag && pTable!=
d480: 30 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  0 ){.    pIndex-
d490: 3e 74 6e 75 6d 20 3d 20 70 50 61 72 73 65 2d 3e  >tnum = pParse->
d4a0: 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20  newTnum;.  }..  
d4b0: 2f 2a 20 49 66 20 74 68 65 20 69 6e 69 74 46 6c  /* If the initFl
d4c0: 61 67 20 69 73 20 30 20 74 68 65 6e 20 63 72 65  ag is 0 then cre
d4d0: 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  ate the index on
d4e0: 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a   disk.  This.  *
d4f0: 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69  * involves writi
d500: 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  ng the index int
d510: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  o the master tab
d520: 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69  le and filling i
d530: 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  n the.  ** index
d540: 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
d550: 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73  t table contents
d560: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
d570: 69 6e 69 74 46 6c 61 67 20 69 73 20 30 20 77 68  initFlag is 0 wh
d580: 65 6e 20 74 68 65 20 75 73 65 72 20 66 69 72 73  en the user firs
d590: 74 20 65 6e 74 65 72 73 20 61 20 43 52 45 41 54  t enters a CREAT
d5a0: 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f  E INDEX .  ** co
d5b0: 6d 6d 61 6e 64 2e 20 20 54 68 65 20 69 6e 69 74  mmand.  The init
d5c0: 46 6c 61 67 20 69 73 20 31 20 77 68 65 6e 20 61  Flag is 1 when a
d5d0: 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
d5e0: 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52  ned and .  ** CR
d5f0: 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
d600: 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f  ments are read o
d610: 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ut of the master
d620: 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a   table.  In.  **
d630: 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65   the latter case
d640: 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61   the index alrea
d650: 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73  dy exists on dis
d660: 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68 79 0a  k, which is why.
d670: 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61    ** we don't wa
d680: 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 69  nt to recreate i
d690: 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  t..  **.  ** If 
d6a0: 70 54 61 62 6c 65 3d 3d 30 20 69 74 20 6d 65 61  pTable==0 it mea
d6b0: 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  ns this index is
d6c0: 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61 20   generated as a 
d6d0: 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a  primary key.  **
d6e0: 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
d6f0: 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54  raint of a CREAT
d700: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
d710: 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61  t.  Since the ta
d720: 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73  ble.  ** has jus
d730: 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  t been created, 
d740: 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  it contains no d
d750: 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ata and the inde
d760: 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  x initialization
d770: 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62  .  ** step can b
d780: 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  e skipped..  */.
d790: 20 20 65 6c 73 65 20 69 66 28 20 70 50 61 72 73    else if( pPars
d7a0: 65 2d 3e 69 6e 69 74 46 6c 61 67 3d 3d 30 20 29  e->initFlag==0 )
d7b0: 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
d7c0: 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 69 6e   Vdbe *v;.    in
d7d0: 74 20 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a 20 20  t lbl1, lbl2;.  
d7e0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
d7f0: 20 61 64 64 72 3b 0a 0a 20 20 20 20 76 20 3d 20   addr;..    v = 
d800: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
d810: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
d820: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
d830: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
d840: 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20    if( pTable!=0 
d850: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42  ){.      sqliteB
d860: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
d870: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 73  on(pParse, 0, is
d880: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
d890: 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  iteOpenMasterTab
d8a0: 6c 65 28 76 2c 20 69 73 54 65 6d 70 29 3b 0a 20  le(v, isTemp);. 
d8b0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
d8c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
d8d0: 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a  ewRecno, 0, 0);.
d8e0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d8f0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
d900: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
d910: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
d920: 76 2c 20 2d 31 2c 20 22 69 6e 64 65 78 22 2c 20  v, -1, "index", 
d930: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
d940: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
d950: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
d960: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
d970: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
d980: 31 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  1, pIndex->zName
d990: 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d  , strlen(pIndex-
d9a0: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73 71  >zName));.    sq
d9b0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
d9c0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
d9d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
d9e0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
d9f0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33   pTab->zName, P3
da00: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 61 64  _STATIC);.    ad
da10: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
da20: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74  ddOp(v, OP_Creat
da30: 65 49 6e 64 65 78 2c 20 30 2c 20 69 73 54 65 6d  eIndex, 0, isTem
da40: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  p);.    sqliteVd
da50: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
da60: 64 72 2c 20 28 63 68 61 72 2a 29 26 70 49 6e 64  dr, (char*)&pInd
da70: 65 78 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49  ex->tnum, P3_POI
da80: 4e 54 45 52 29 3b 0a 20 20 20 20 70 49 6e 64 65  NTER);.    pInde
da90: 78 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20  x->tnum = 0;.   
daa0: 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20   if( pTable ){. 
dab0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
dac0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
dad0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
dae0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
daf0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 73 54 65  OP_Integer, isTe
db00: 6d 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  mp, 0);.      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 4f 70 65 6e 57 72 69 74 65 2c 20 31   OP_OpenWrite, 1
db30: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
db40: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62  addr = sqliteVdb
db50: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
db60: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
db70: 69 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45  if( pStart && pE
db80: 6e 64 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  nd ){.      n = 
db90: 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20  Addr(pEnd->z) - 
dba0: 41 64 64 72 28 70 53 74 61 72 74 2d 3e 7a 29 20  Addr(pStart->z) 
dbb0: 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  + 1;.      sqlit
dbc0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
dbd0: 20 61 64 64 72 2c 20 70 53 74 61 72 74 2d 3e 7a   addr, pStart->z
dbe0: 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
dbf0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
dc00: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
dc10: 2c 20 35 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 5, 0);.    sql
dc20: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
dc30: 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c  OP_PutIntKey, 0,
dc40: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61   0);.    if( pTa
dc50: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ble ){.      sql
dc60: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
dc70: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62  OP_Integer, pTab
dc80: 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20  ->iDb, 0);.     
dc90: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
dca0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
dcb0: 20 32 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b   2, pTab->tnum);
dcc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
dcd0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
dce0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33   pTab->zName, P3
dcf0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
dd00: 6c 62 6c 32 20 3d 20 73 71 6c 69 74 65 56 64 62  lbl2 = sqliteVdb
dd10: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
dd20: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
dd30: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
dd40: 64 2c 20 32 2c 20 6c 62 6c 32 29 3b 0a 20 20 20  d, 2, lbl2);.   
dd50: 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65     lbl1 = sqlite
dd60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
dd70: 52 65 63 6e 6f 2c 20 32 2c 20 30 29 3b 0a 20 20  Recno, 2, 0);.  
dd80: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
dd90: 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Index->nColumn; 
dda0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
ddb0: 74 20 69 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d  t iCol = pIndex-
ddc0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
ddd0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
dde0: 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 29 7b 0a 20  iPKey==iCol ){. 
ddf0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56           sqliteV
de00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
de10: 75 70 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20  up, i, 0);.     
de20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
de30: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
de40: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
de50: 2c 20 32 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  , 2, iCol);.    
de60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
de70: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
de80: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 49 64  dOp(v, OP_MakeId
de90: 78 4b 65 79 2c 20 70 49 6e 64 65 78 2d 3e 6e 43  xKey, pIndex->nC
dea0: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
deb0: 20 69 66 28 20 64 62 2d 3e 66 69 6c 65 5f 66 6f   if( db->file_fo
dec0: 72 6d 61 74 3e 3d 34 20 29 20 73 71 6c 69 74 65  rmat>=4 ) sqlite
ded0: 41 64 64 49 64 78 4b 65 79 54 79 70 65 28 76 2c  AddIdxKeyType(v,
dee0: 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20   pIndex);.      
def0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
df00: 76 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20 31 2c  v, OP_IdxPut, 1,
df10: 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
df20: 21 3d 4f 45 5f 4e 6f 6e 65 29 3b 0a 20 20 20 20  !=OE_None);.    
df30: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
df40: 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 69 6e 64  geP3(v, -1, "ind
df50: 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65  exed columns are
df60: 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33   not unique", P3
df70: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
df80: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
df90: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c  v, OP_Next, 2, l
dfa0: 62 6c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  bl1);.      sqli
dfb0: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
dfc0: 65 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20  el(v, lbl2);.   
dfd0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
dfe0: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
dff0: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 0);.      sql
e000: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
e010: 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b  OP_Close, 1, 0);
e020: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
e030: 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20  Table!=0 ){.    
e040: 20 20 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b    if( !isTemp ){
e050: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 43  .        sqliteC
e060: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20  hangeCookie(db, 
e070: 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  v);.      }.    
e080: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
e090: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  p(v, OP_Close, 0
e0a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
e0b0: 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  teEndWriteOperat
e0c0: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ion(pParse);.   
e0d0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65   }.  }..  /* Cle
e0e0: 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69  an up before exi
e0f0: 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65  ting */.exit_cre
e100: 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c  ate_index:.  sql
e110: 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28  iteIdListDelete(
e120: 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  pList);.  sqlite
e130: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54  SrcListDelete(pT
e140: 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  able);.  sqliteF
e150: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  ree(zName);.  re
e160: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
e170: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
e180: 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e   drop an existin
e190: 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20  g named index.  
e1a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
e1b0: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44  implements the D
e1c0: 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ROP INDEX statem
e1d0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
e1e0: 69 74 65 44 72 6f 70 49 6e 64 65 78 28 50 61 72  iteDropIndex(Par
e1f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
e200: 69 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49  ist *pName){.  I
e210: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
e220: 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
e230: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
e240: 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  db;..  if( pPars
e250: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
e260: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
e270: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
e280: 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
e290: 3d 31 20 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d  =1 );.  pIndex =
e2a0: 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78   sqliteFindIndex
e2b0: 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  (db, pName->a[0]
e2c0: 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
e2d0: 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
e2e0: 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20    if( pIndex==0 
e2f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72  ){.    sqliteErr
e300: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
e310: 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53  o such index: %S
e320: 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  ", pName, 0);.  
e330: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
e340: 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
e350: 28 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e  ( pIndex->autoIn
e360: 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dex ){.    sqlit
e370: 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
e380: 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61  , "index associa
e390: 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20  ted with UNIQUE 
e3a0: 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d  ".      "or PRIM
e3b0: 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
e3c0: 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f  nt cannot be dro
e3d0: 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67  pped", 0);.    g
e3e0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
e3f0: 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dex;.  }.  if( p
e400: 49 6e 64 65 78 2d 3e 69 44 62 3e 31 20 29 7b 0a  Index->iDb>1 ){.
e410: 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
e420: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
e430: 6f 74 20 61 6c 74 65 72 20 73 63 68 65 6d 61 20  ot alter schema 
e440: 6f 66 20 61 74 74 61 63 68 65 64 20 22 0a 20 20  of attached ".  
e450: 20 20 20 20 20 22 64 61 74 61 62 61 73 65 73 22       "databases"
e460: 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  , 0);.    goto e
e470: 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
e480: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
e490: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
e4a0: 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
e4b0: 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  t code = SQLITE_
e4c0: 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  DROP_INDEX;.    
e4d0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
e4e0: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20  ndex->pTable;.  
e4f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
e500: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e 64  b = db->aDb[pInd
e510: 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  ex->iDb].zName;.
e520: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e530: 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
e540: 42 4c 45 28 70 49 6e 64 65 78 2d 3e 69 44 62 29  BLE(pIndex->iDb)
e550: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
e560: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
e570: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
e580: 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29   zTab, 0, zDb) )
e590: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
e5a0: 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
e5b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 64    }.    if( pInd
e5c0: 65 78 2d 3e 69 44 62 20 29 20 63 6f 64 65 20 3d  ex->iDb ) code =
e5d0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
e5e0: 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
e5f0: 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b   sqliteAuthCheck
e600: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
e610: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54  Index->zName, pT
e620: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  ab->zName, zDb) 
e630: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
e640: 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
e650: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
e660: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
e670: 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
e680: 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d  e index and from
e690: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
e6a0: 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74  e */.  v = sqlit
e6b0: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
e6c0: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
e6d0: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64   static VdbeOp d
e6e0: 72 6f 70 49 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20  ropIndex[] = {. 
e6f0: 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64       { OP_Rewind
e700: 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29  ,     0, ADDR(9)
e710: 2c 20 30 7d 2c 20 0a 20 20 20 20 20 20 7b 20 4f  , 0}, .      { O
e720: 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c  P_String,     0,
e730: 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a   0,       0}, /*
e740: 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   1 */.      { OP
e750: 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20  _MemStore,   1, 
e760: 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  1,       0},.   
e770: 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c     { OP_MemLoad,
e780: 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20      1, 0,       
e790: 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20  0}, /* 3 */.    
e7a0: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20    { OP_Column,  
e7b0: 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20 30     0, 1,       0
e7c0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 45 71  },.      { OP_Eq
e7d0: 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41 44 44  ,         0, ADD
e7e0: 52 28 38 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20  R(8), 0},.      
e7f0: 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20  { OP_Next,      
e800: 20 30 2c 20 41 44 44 52 28 33 29 2c 20 30 7d 2c   0, ADDR(3), 0},
e810: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f  .      { OP_Goto
e820: 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28  ,       0, ADDR(
e830: 39 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  9), 0},.      { 
e840: 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30  OP_Delete,     0
e850: 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f  , 0,       0}, /
e860: 2a 20 38 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  * 8 */.    };.  
e870: 20 20 69 6e 74 20 62 61 73 65 3b 0a 0a 20 20 20    int base;..   
e880: 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74   sqliteBeginWrit
e890: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
e8a0: 65 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 69 44  e, 0, pIndex->iD
e8b0: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 70  b);.    sqliteOp
e8c0: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c  enMasterTable(v,
e8d0: 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20   pIndex->iDb);. 
e8e0: 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65     base = sqlite
e8f0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
e900: 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70 49   ArraySize(dropI
e910: 6e 64 65 78 29 2c 20 64 72 6f 70 49 6e 64 65 78  ndex), dropIndex
e920: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
e930: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73  eChangeP3(v, bas
e940: 65 2b 31 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  e+1, pIndex->zNa
e950: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  me, 0);.    if( 
e960: 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 30 20 29  pIndex->iDb==0 )
e970: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43 68  {.      sqliteCh
e980: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
e990: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
e9a0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
e9b0: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
e9c0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
e9d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72  ddOp(v, OP_Destr
e9e0: 6f 79 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  oy, pIndex->tnum
e9f0: 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a  , pIndex->iDb);.
ea00: 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69      sqliteEndWri
ea10: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
ea20: 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  se);.  }..  /* D
ea30: 65 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  elete the in-mem
ea40: 6f 72 79 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ory description 
ea50: 6f 66 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  of this index.. 
ea60: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
ea70: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
ea80: 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e    sqliteUnlinkAn
ea90: 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c  dDeleteIndex(db,
eaa0: 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 64 62   pIndex);.    db
eab0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
eac0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
ead0: 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  .  }..exit_drop_
eae0: 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 53  index:.  sqliteS
eaf0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61  rcListDelete(pNa
eb00: 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  me);.}../*.** Ap
eb10: 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65  pend a new eleme
eb20: 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  nt to the given 
eb30: 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  IdList.  Create 
eb40: 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a  a new IdList if.
eb50: 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a  ** need be..**.*
eb60: 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69  * A new IdList i
eb70: 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
eb80: 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  ULL if malloc() 
eb90: 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74  fails..*/.IdList
eba0: 20 2a 73 71 6c 69 74 65 49 64 4c 69 73 74 41 70   *sqliteIdListAp
ebb0: 70 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69  pend(IdList *pLi
ebc0: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
ebd0: 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  n){.  if( pList=
ebe0: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
ebf0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
ec00: 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29  sizeof(IdList) )
ec10: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
ec20: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
ec30: 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
ec40: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
ec50: 70 4c 69 73 74 2d 3e 6e 49 64 3e 3d 70 4c 69 73  pList->nId>=pLis
ec60: 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  t->nAlloc ){.   
ec70: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
ec80: 74 65 6d 20 2a 61 3b 0a 20 20 20 20 70 4c 69 73  tem *a;.    pLis
ec90: 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4c 69 73  t->nAlloc = pLis
eca0: 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b  t->nAlloc*2 + 5;
ecb0: 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52  .    a = sqliteR
ecc0: 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c  ealloc(pList->a,
ecd0: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73   pList->nAlloc*s
ece0: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
ecf0: 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 3d  ]) );.    if( a=
ed00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
ed10: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  teIdListDelete(p
ed20: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
ed30: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
ed40: 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20   pList->a = a;. 
ed50: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c 69   }.  memset(&pLi
ed60: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64  st->a[pList->nId
ed70: 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69  ], 0, sizeof(pLi
ed80: 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66  st->a[0]));.  if
ed90: 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  ( pToken ){.    
eda0: 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69  char **pz = &pLi
edb0: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64  st->a[pList->nId
edc0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c  ].zName;.    sql
edd0: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a  iteSetNString(pz
ede0: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
edf0: 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20  ken->n, 0);.    
ee00: 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20  if( *pz==0 ){.  
ee10: 20 20 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74      sqliteIdList
ee20: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
ee30: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
ee40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ee50: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70  sqliteDequote(*p
ee60: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  z);.    }.  }.  
ee70: 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20  pList->nId++;.  
ee80: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
ee90: 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
eea0: 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  new table name t
eeb0: 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  o the given SrcL
eec0: 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
eed0: 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a  ew SrcList if.**
eee0: 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77   need be.  A new
eef0: 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65   entry is create
ef00: 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  d in the SrcList
ef10: 20 65 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20   even if pToken 
ef20: 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41  is NULL..**.** A
ef30: 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 73 20   new SrcList is 
ef40: 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
ef50: 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  L if malloc() fa
ef60: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  ils..**.** If pD
ef70: 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e  atabase is not n
ef80: 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ull, it means th
ef90: 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  at the table has
efa0: 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20   an optional.** 
efb0: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72  database name pr
efc0: 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73  efix.  Like this
efd0: 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62  :  "database.tab
efe0: 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62  le".  The pDatab
eff0: 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  ase.** points to
f000: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
f010: 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70  and the pTable p
f020: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74  oints to the dat
f030: 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54  abase name..** T
f040: 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  he SrcList.a[].z
f050: 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69  Name field is fi
f060: 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61  lled with the ta
f070: 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d  ble name which m
f080: 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f  ight.** come fro
f090: 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61  m pTable (if pDa
f0a0: 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20  tabase is NULL) 
f0b0: 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73  or from pDatabas
f0c0: 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e  e.  .** SrcList.
f0d0: 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73  a[].zDatabase is
f0e0: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
f0f0: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66   database name f
f100: 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f  rom pTable,.** o
f110: 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e  r with NULL if n
f120: 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70  o database is sp
f130: 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ecified..**.** I
f140: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
f150: 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73  f call like this
f160: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
f170: 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41 70 70  sqliteSrcListApp
f180: 65 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a  end(A,B,0);.**.*
f190: 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61  * Then B is a ta
f1a0: 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
f1b0: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
f1c0: 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20  s unspecified.  
f1d0: 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b  If called.** lik
f1e0: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
f1f0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 72 63 4c        sqliteSrcL
f200: 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 43 29  istAppend(A,B,C)
f210: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69  ;.**.** Then C i
f220: 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  s the table name
f230: 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61   and B is the da
f240: 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a  tabase name..*/.
f250: 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 53  SrcList *sqliteS
f260: 72 63 4c 69 73 74 41 70 70 65 6e 64 28 53 72 63  rcListAppend(Src
f270: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
f280: 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65  en *pTable, Toke
f290: 6e 20 2a 70 44 61 74 61 62 61 73 65 29 7b 0a 20  n *pDatabase){. 
f2a0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
f2b0: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
f2c0: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
f2d0: 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20  f(SrcList) );.  
f2e0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
f2f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
f300: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31  List->nAlloc = 1
f310: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
f320: 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e  t->nSrc>=pList->
f330: 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72  nAlloc ){.    Sr
f340: 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20  cList *pNew;.   
f350: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a   pList->nAlloc *
f360: 3d 20 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  = 2;.    pNew = 
f370: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
f380: 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ist,.           
f390: 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73      sizeof(*pLis
f3a0: 74 29 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c  t) + (pList->nAl
f3b0: 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c  loc-1)*sizeof(pL
f3c0: 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  ist->a[0]) );.  
f3d0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
f3e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 72 63  .      sqliteSrc
f3f0: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
f400: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
f410: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  0;.    }.    pLi
f420: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  st = pNew;.  }. 
f430: 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e   memset(&pList->
f440: 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2c 20  a[pList->nSrc], 
f450: 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  0, sizeof(pList-
f460: 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70  >a[0]));.  if( p
f470: 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74  Database && pDat
f480: 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  abase->z==0 ){. 
f490: 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30     pDatabase = 0
f4a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74  ;.  }.  if( pDat
f4b0: 61 62 61 73 65 20 26 26 20 70 54 61 62 6c 65 20  abase && pTable 
f4c0: 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  ){.    Token *pT
f4d0: 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b  emp = pDatabase;
f4e0: 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
f4f0: 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61   pTable;.    pTa
f500: 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d  ble = pTemp;.  }
f510: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b  .  if( pTable ){
f520: 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d  .    char **pz =
f530: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
f540: 2d 3e 6e 53 72 63 5d 2e 7a 4e 61 6d 65 3b 0a 20  ->nSrc].zName;. 
f550: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
f560: 69 6e 67 28 70 7a 2c 20 70 54 61 62 6c 65 2d 3e  ing(pz, pTable->
f570: 7a 2c 20 70 54 61 62 6c 65 2d 3e 6e 2c 20 30 29  z, pTable->n, 0)
f580: 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30  ;.    if( *pz==0
f590: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f5a0: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  SrcListDelete(pL
f5b0: 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ist);.      retu
f5c0: 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rn 0;.    }else{
f5d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 71  .      sqliteDeq
f5e0: 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d  uote(*pz);.    }
f5f0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61  .  }.  if( pData
f600: 62 61 73 65 20 29 7b 0a 20 20 20 20 63 68 61 72  base ){.    char
f610: 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e   **pz = &pList->
f620: 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a  a[pList->nSrc].z
f630: 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20 73 71  Database;.    sq
f640: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70  liteSetNString(p
f650: 7a 2c 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 2c  z, pDatabase->z,
f660: 20 70 44 61 74 61 62 61 73 65 2d 3e 6e 2c 20 30   pDatabase->n, 0
f670: 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d  );.    if( *pz==
f680: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
f690: 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  eSrcListDelete(p
f6a0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
f6b0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
f6c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65  {.      sqliteDe
f6d0: 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20  quote(*pz);.    
f6e0: 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61  }.  }.  pList->a
f6f0: 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 69 43  [pList->nSrc].iC
f700: 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 4c  ursor = -1;.  pL
f710: 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72  ist->nSrc++;.  r
f720: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
f730: 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75 72  /*.** Assign cur
f740: 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c  sors to all tabl
f750: 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a  es in a SrcList.
f760: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 72  */.void sqliteSr
f770: 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
f780: 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
f790: 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  , SrcList *pList
f7a0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
f7b0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
f7c0: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
f7d0: 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
f7e0: 69 43 75 72 73 6f 72 3c 30 20 29 7b 0a 20 20 20  iCursor<0 ){.   
f7f0: 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69     pList->a[i].i
f800: 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
f810: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 0a 20  >nTab++;.    }. 
f820: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
f830: 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20  an alias to the 
f840: 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65 72 20  last identifier 
f850: 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69 64 65  on the given ide
f860: 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f  ntifier list..*/
f870: 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 72 63 4c  .void sqliteSrcL
f880: 69 73 74 41 64 64 41 6c 69 61 73 28 53 72 63 4c  istAddAlias(SrcL
f890: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
f8a0: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
f8b0: 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74  ( pList && pList
f8c0: 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ->nSrc>0 ){.    
f8d0: 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e  int i = pList->n
f8e0: 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 73 71 6c  Src - 1;.    sql
f8f0: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
f900: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61  List->a[i].zAlia
f910: 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54  s, pToken->z, pT
f920: 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  oken->n, 0);.   
f930: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 70   sqliteDequote(p
f940: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61  List->a[i].zAlia
f950: 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  s);.  }.}../*.**
f960: 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73   Delete an IdLis
f970: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
f980: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64  eIdListDelete(Id
f990: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
f9a0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
f9b0: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
f9c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
f9d0: 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
f9e0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
f9f0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
fa00: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
fa10: 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  ee(pList->a);.  
fa20: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
fa30: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
fa40: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  rn the index in 
fa50: 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65  pList of the ide
fa60: 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49  ntifier named zI
fa70: 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  d.  Return -1.**
fa80: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
fa90: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 49 64 4c 69  /.int sqliteIdLi
faa0: 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a  stIndex(IdList *
fab0: 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61  pList, const cha
fac0: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
fad0: 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
fae0: 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  =0 ) return -1;.
faf0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
fb00: 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
fb10: 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72     if( sqliteStr
fb20: 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
fb30: 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
fb40: 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
fb50: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
fb60: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
fb70: 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74  n entire SrcList
fb80: 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69   including all i
fb90: 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 2e  ts substructure.
fba0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53  .*/.void sqliteS
fbb0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53 72 63  rcListDelete(Src
fbc0: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
fbd0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
fbe0: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
fbf0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
fc00: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
fc10: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
fc20: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 44 61 74 61  List->a[i].zData
fc30: 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  base);.    sqlit
fc40: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  eFree(pList->a[i
fc50: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ].zName);.    sq
fc60: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
fc70: 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20  a[i].zAlias);.  
fc80: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
fc90: 5d 2e 70 54 61 62 20 26 26 20 70 4c 69 73 74 2d  ].pTab && pList-
fca0: 3e 61 5b 69 5d 2e 70 54 61 62 2d 3e 69 73 54 72  >a[i].pTab->isTr
fcb0: 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20  ansient ){.     
fcc0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
fcd0: 6c 65 28 30 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  le(0, pList->a[i
fce0: 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  ].pTab);.    }. 
fcf0: 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44     sqliteSelectD
fd00: 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  elete(pList->a[i
fd10: 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ].pSelect);.    
fd20: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
fd30: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 4f 6e  (pList->a[i].pOn
fd40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 49 64 4c  );.    sqliteIdL
fd50: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 2d  istDelete(pList-
fd60: 3e 61 5b 69 5d 2e 70 55 73 69 6e 67 29 3b 0a 20  >a[i].pUsing);. 
fd70: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
fd80: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
fd90: 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63   Begin a transac
fda0: 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
fdb0: 69 74 65 42 65 67 69 6e 54 72 61 6e 73 61 63 74  iteBeginTransact
fdc0: 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
fdd0: 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b  e, int onError){
fde0: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a  .  sqlite *db;..
fdf0: 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
fe00: 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
fe10: 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62  b)==0 || db->aDb
fe20: 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74  [0].pBt==0 ) ret
fe30: 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
fe40: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
fe50: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
fe60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
fe70: 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28  sqliteAuthCheck(
fe80: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
fe90: 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47  RANSACTION, "BEG
fea0: 49 4e 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  IN", 0, 0) ) ret
feb0: 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66  urn;.  if( db->f
fec0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
fed0: 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 73 71 6c  Trans ){.    sql
fee0: 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72  iteErrorMsg(pPar
fef0: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 73 74 61 72  se, "cannot star
ff00: 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
ff10: 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
ff20: 74 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74 75  tion");.    retu
ff30: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
ff40: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
ff50: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 30  ion(pParse, 0, 0
ff60: 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  );.  db->flags |
ff70: 3d 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  = SQLITE_InTrans
ff80: 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20  ;.  db->onError 
ff90: 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a  = onError;.}../*
ffa0: 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61  .** Commit a tra
ffb0: 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
ffc0: 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74 54 72 61   sqliteCommitTra
ffd0: 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
ffe0: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
fff0: 65 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 50  e *db;..  if( pP
10000 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
10010 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
10020 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
10030 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
10040 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
10050 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  || sqlite_malloc
10060 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  _failed ) return
10070 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 41 75  ;.  if( sqliteAu
10080 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
10090 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
100a0 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  ON, "COMMIT", 0,
100b0 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   0) ) return;.  
100c0 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
100d0 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29   SQLITE_InTrans)
100e0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
100f0 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
10100 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74  , "cannot commit
10110 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f   - no transactio
10120 6e 20 69 73 20 61 63 74 69 76 65 22 29 3b 0a 20  n is active");. 
10130 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
10140 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
10150 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20  QLITE_InTrans;. 
10160 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
10170 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
10180 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20  ;.  db->onError 
10190 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a  = OE_Default;.}.
101a0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
101b0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
101c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 52 6f 6c 6c  .void sqliteRoll
101d0 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
101e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
101f0 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20    sqlite *db;.  
10200 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
10210 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
10220 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
10230 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
10240 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
10250 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
10260 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c  r || sqlite_mall
10270 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
10280 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
10290 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
102a0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
102b0 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  TION, "ROLLBACK"
102c0 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
102d0 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61  ;.  if( (db->fla
102e0 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72  gs & SQLITE_InTr
102f0 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ans)==0 ){.    s
10300 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
10310 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 72 6f  arse, "cannot ro
10320 6c 6c 62 61 63 6b 20 2d 20 6e 6f 20 74 72 61 6e  llback - no tran
10330 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
10340 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  e");.    return;
10350 20 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69   .  }.  v = sqli
10360 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
10370 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
10380 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
10390 70 28 76 2c 20 4f 50 5f 52 6f 6c 6c 62 61 63 6b  p(v, OP_Rollback
103a0 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 64  , 0, 0);.  }.  d
103b0 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
103c0 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 64  ITE_InTrans;.  d
103d0 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f  b->onError = OE_
103e0 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  Default;.}../*.*
103f0 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
10400 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76  code that will v
10410 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61  erify the schema
10420 20 63 6f 6f 6b 69 65 20 66 6f 72 20 61 6c 6c 0a   cookie for all.
10430 2a 2a 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  ** named databas
10440 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 76 6f 69 64  e files..*/.void
10450 20 73 71 6c 69 74 65 43 6f 64 65 56 65 72 69 66   sqliteCodeVerif
10460 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70  ySchema(Parse *p
10470 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
10480 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
10490 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
104a0 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65  be *v = sqliteGe
104b0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
104c0 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
104d0 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
104e0 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
104f0 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20  aDb[iDb].pBt!=0 
10500 29 3b 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20  );.  if( iDb!=1 
10510 26 26 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  && !DbHasPropert
10520 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 43 6f  y(db, iDb, DB_Co
10530 6f 6b 69 65 29 20 29 7b 0a 20 20 20 20 73 71 6c  okie) ){.    sql
10540 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
10550 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c  OP_VerifyCookie,
10560 20 69 44 62 2c 20 64 62 2d 3e 61 44 62 5b 69 44   iDb, db->aDb[iD
10570 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  b].schema_cookie
10580 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70  );.    DbSetProp
10590 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42  erty(db, iDb, DB
105a0 5f 43 6f 6f 6b 69 65 29 3b 0a 20 20 7d 0a 7d 0a  _Cookie);.  }.}.
105b0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
105c0 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70  VDBE code that p
105d0 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e  repares for doin
105e0 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74  g an operation t
105f0 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61  hat.** might cha
10600 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nge the database
10610 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
10620 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65  tine starts a ne
10630 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  w transaction if
10640 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
10650 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20  ady within.** a 
10660 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
10670 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
10680 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
10690 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65  tion, then a che
106a0 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65  ckpoint.** is se
106b0 74 20 69 66 20 74 68 65 20 73 65 74 43 68 65 63  t if the setChec
106c0 6b 70 6f 69 6e 74 20 70 61 72 61 6d 65 74 65 72  kpoint parameter
106d0 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65   is true.  A che
106e0 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a  ckpoint should.*
106f0 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65  * be set for ope
10700 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67  rations that mig
10710 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20  ht fail (due to 
10720 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61  a constraint) pa
10730 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79  rt of.** the way
10740 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69   through and whi
10750 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  ch will need to 
10760 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73  undo some writes
10770 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
10780 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74  to.** rollback t
10790 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63  he whole transac
107a0 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61  tion.  For opera
107b0 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20  tions where all 
107c0 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63  constraints.** c
107d0 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65  an be checked be
107e0 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
107f0 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65   are made to the
10800 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73   database, it is
10810 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73   never.** necess
10820 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72  ary to undo a wr
10830 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63  ite and the chec
10840 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f  kpoint should no
10850 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  t be set..**.** 
10860 4f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 69 44  Only database iD
10870 62 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64  b and the temp d
10880 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 64 65  atabase are made
10890 20 77 72 69 74 61 62 6c 65 20 62 79 20 74 68 69   writable by thi
108a0 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44  s call..** If iD
108b0 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 6d  b==0, then the m
108c0 61 69 6e 20 61 6e 64 20 74 65 6d 70 20 64 61 74  ain and temp dat
108d0 61 62 61 73 65 73 20 61 72 65 20 6d 61 64 65 20  abases are made 
108e0 77 72 69 74 61 62 6c 65 2e 20 20 20 49 66 0a 2a  writable.   If.*
108f0 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e 20 6f 6e  * iDb==1 then on
10900 6c 79 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ly the temp data
10910 62 61 73 65 20 69 73 20 6d 61 64 65 20 77 72 69  base is made wri
10920 74 61 62 6c 65 2e 20 20 49 66 20 69 44 62 3e 31  table.  If iDb>1
10930 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73 70 65   then the.** spe
10940 63 69 66 69 65 64 20 61 75 78 69 6c 69 61 72 79  cified auxiliary
10950 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
10960 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
10970 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c  are made writabl
10980 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
10990 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  eBeginWriteOpera
109a0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
109b0 73 65 2c 20 69 6e 74 20 73 65 74 43 68 65 63 6b  se, int setCheck
109c0 70 6f 69 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b  point, int iDb){
109d0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
109e0 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
109f0 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 44 62 48  e->db;.  if( DbH
10a00 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  asProperty(db, i
10a10 44 62 2c 20 44 42 5f 4c 6f 63 6b 65 64 29 20 29  Db, DB_Locked) )
10a20 20 72 65 74 75 72 6e 3b 0a 20 20 76 20 3d 20 73   return;.  v = s
10a30 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
10a40 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
10a50 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
10a60 20 21 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 69   !db->aDb[iDb].i
10a70 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 73 71  nTrans ){.    sq
10a80 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
10a90 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
10aa0 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 44 62   iDb, 0);.    Db
10ab0 53 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20  SetProperty(db, 
10ac0 69 44 62 2c 20 44 42 5f 4c 6f 63 6b 65 64 29 3b  iDb, DB_Locked);
10ad0 0a 20 20 20 20 73 71 6c 69 74 65 43 6f 64 65 56  .    sqliteCodeV
10ae0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
10af0 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66  se, iDb);.    if
10b00 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20  ( iDb!=1 ){.    
10b10 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69    sqliteBeginWri
10b20 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
10b30 73 65 2c 20 73 65 74 43 68 65 63 6b 70 6f 69 6e  se, setCheckpoin
10b40 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t, 1);.    }.  }
10b50 65 6c 73 65 20 69 66 28 20 73 65 74 43 68 65 63  else if( setChec
10b60 6b 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 73 71  kpoint ){.    sq
10b70 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
10b80 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 2c 20   OP_Checkpoint, 
10b90 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 44 62 53  iDb, 0);.    DbS
10ba0 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  etProperty(db, i
10bb0 44 62 2c 20 44 42 5f 4c 6f 63 6b 65 64 29 3b 0a  Db, DB_Locked);.
10bc0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
10bd0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
10be0 63 6f 6e 63 6c 75 64 65 73 20 61 6e 20 6f 70 65  concludes an ope
10bf0 72 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 79 20  ration that may 
10c00 68 61 76 65 20 63 68 61 6e 67 65 64 0a 2a 2a 20  have changed.** 
10c10 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
10c20 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  f a statement tr
10c30 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74  ansaction was st
10c40 61 72 74 65 64 2c 20 74 68 65 6e 20 65 6d 69 74  arted, then emit
10c50 0a 2a 2a 20 61 6e 20 4f 50 5f 43 6f 6d 6d 69 74  .** an OP_Commit
10c60 20 74 68 61 74 20 77 69 6c 6c 20 63 61 75 73 65   that will cause
10c70 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
10c80 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20  be committed to 
10c90 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  disk..**.** Note
10ca0 20 74 68 61 74 20 63 68 65 63 6b 70 6f 69 6e 74   that checkpoint
10cb0 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
10cc0 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 20 61 74  lly committed at
10cd0 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 61   the end of.** a
10ce0 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4e 6f 74   statement.  Not
10cf0 65 20 61 6c 73 6f 20 74 68 61 74 20 74 68 65 72  e also that ther
10d00 65 20 63 61 6e 20 62 65 20 6d 75 6c 74 69 70 6c  e can be multipl
10d10 65 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73  e calls to .** s
10d20 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
10d30 70 65 72 61 74 69 6f 6e 28 29 20 62 75 74 20 74  peration() but t
10d40 68 65 72 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  here should only
10d50 20 62 65 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20   be a single.** 
10d60 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 45 6e  call to sqliteEn
10d70 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
10d80 29 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  ) at the conclus
10d90 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65  ion of the state
10da0 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
10db0 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
10dc0 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ation(Parse *pPa
10dd0 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  rse){.  Vdbe *v;
10de0 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
10df0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
10e00 28 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74  ( pParse->trigSt
10e10 61 63 6b 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a  ack ) return; /*
10e20 20 69 66 20 74 68 69 73 20 69 73 20 69 6e 20 61   if this is in a
10e30 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 76 20   trigger */.  v 
10e40 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
10e50 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
10e60 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
10e70 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
10e80 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29  SQLITE_InTrans )
10e90 7b 0a 20 20 20 20 2f 2a 20 41 20 42 45 47 49 4e  {.    /* A BEGIN
10ea0 20 68 61 73 20 65 78 65 63 75 74 65 64 2e 20 20   has executed.  
10eb0 44 6f 20 6e 6f 74 20 63 6f 6d 6d 69 74 20 75 6e  Do not commit un
10ec0 74 69 6c 20 77 65 20 73 65 65 20 61 6e 20 65 78  til we see an ex
10ed0 70 6c 69 63 69 74 0a 20 20 20 20 2a 2a 20 43 4f  plicit.    ** CO
10ee0 4d 4d 49 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  MMIT statement. 
10ef0 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
10f00 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
10f10 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c  v, OP_Commit, 0,
10f20 20 30 29 3b 0a 20 20 7d 0a 7d 0a                  0);.  }.}.