/ Hex Artifact Content
Login

Artifact 2a02df7931cb0ea153c1e29324292cd943d4f73c:


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 36 20 32 30 30 34 2f 30 32 2f 31 32 20 31  166 2004/02/12 1
0300: 38 3a 34 36 3a 33 39 20 64 72 68 20 45 78 70 20  8:46:39 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 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.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 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
2370: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
2380: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
2390: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
23a0: 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20  Db->pBt==0 ){.  
23b0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 41 75      if( pDb->pAu
23c0: 78 20 26 26 20 70 44 62 2d 3e 78 46 72 65 65 41  x && pDb->xFreeA
23d0: 75 78 20 29 20 70 44 62 2d 3e 78 46 72 65 65 41  ux ) pDb->xFreeA
23e0: 75 78 28 70 44 62 2d 3e 70 41 75 78 29 3b 0a 20  ux(pDb->pAux);. 
23f0: 20 20 20 20 20 70 44 62 2d 3e 70 41 75 78 20 3d       pDb->pAux =
2400: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
2410: 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d  for(i=j=2; i<db-
2420: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
2430: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
2440: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
2450: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d    if( pDb->pBt==
2460: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2470: 65 46 72 65 65 28 70 44 62 2d 3e 7a 4e 61 6d 65  eFree(pDb->zName
2480: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  );.      pDb->zN
2490: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ame = 0;.      c
24a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
24b0: 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20     if( j<i ){.  
24c0: 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d      db->aDb[j] =
24d0: 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20   db->aDb[i];.   
24e0: 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a   }.    j++;.  }.
24f0: 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44    memset(&db->aD
2500: 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44  b[j], 0, (db->nD
2510: 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b-j)*sizeof(db->
2520: 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e  aDb[j]));.  db->
2530: 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64  nDb = j;.  if( d
2540: 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d  b->nDb<=2 && db-
2550: 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb!=db->aDbSta
2560: 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  tic ){.    memcp
2570: 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c  y(db->aDbStatic,
2580: 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65   db->aDb, 2*size
2590: 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b  of(db->aDb[0]));
25a0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
25b0: 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62  db->aDb);.    db
25c0: 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53  ->aDb = db->aDbS
25d0: 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  tatic;.  }.}../*
25e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
25f0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
2600: 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ver a rollback o
2610: 63 63 75 72 73 2e 20 20 49 66 20 74 68 65 72 65  ccurs.  If there
2620: 20 77 65 72 65 0a 2a 2a 20 73 63 68 65 6d 61 20   were.** schema 
2630: 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74  changes during t
2640: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
2650: 74 68 65 6e 20 77 65 20 68 61 76 65 20 74 6f 20  then we have to 
2660: 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 69 6e 74  reset the.** int
2670: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
2680: 73 20 61 6e 64 20 72 65 6c 6f 61 64 20 74 68 65  s and reload the
2690: 6d 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2f 0a  m from disk..*/.
26a0: 76 6f 69 64 20 73 71 6c 69 74 65 52 6f 6c 6c 62  void sqliteRollb
26b0: 61 63 6b 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  ackInternalChang
26c0: 65 73 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a  es(sqlite *db){.
26d0: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
26e0: 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  & SQLITE_InternC
26f0: 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 71  hanges ){.    sq
2700: 6c 69 74 65 52 65 73 65 74 49 6e 74 65 72 6e 61  liteResetInterna
2710: 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a  lSchema(db, 0);.
2720: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
2730: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2740: 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69  led when a commi
2750: 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69  t occurs..*/.voi
2760: 64 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74 49 6e  d sqliteCommitIn
2770: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
2780: 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 64 62 2d  lite *db){.  db-
2790: 3e 61 44 62 5b 30 5d 2e 73 63 68 65 6d 61 5f 63  >aDb[0].schema_c
27a0: 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 6e 65 78 74  ookie = db->next
27b0: 5f 63 6f 6f 6b 69 65 3b 0a 20 20 64 62 2d 3e 66  _cookie;.  db->f
27c0: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
27d0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d  InternChanges;.}
27e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
27f0: 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73  he memory data s
2800: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
2810: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
2820: 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e  ven.** Table.  N
2830: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
2840: 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68  de to disk by th
2850: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
2860: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a  * This routine j
2870: 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20  ust deletes the 
2880: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20  data structure. 
2890: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c   It does not unl
28a0: 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ink.** the table
28b0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
28c0: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
28d0: 62 6c 65 2e 20 20 4e 6f 72 20 64 6f 65 73 20 69  ble.  Nor does i
28e0: 74 20 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f 72 65  t remove.** fore
28f0: 69 67 6e 20 6b 65 79 73 20 66 72 6f 6d 20 74 68  ign keys from th
2900: 65 20 73 71 6c 69 74 65 2e 61 46 4b 65 79 20 68  e sqlite.aFKey h
2910: 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20  ash table.  But 
2920: 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a  it does destroy.
2930: 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ** memory struct
2940: 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69  ures of the indi
2950: 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20  ces and foreign 
2960: 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  keys associated 
2970: 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62  with .** the tab
2980: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65  le..**.** Indice
2990: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
29a0: 68 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  h the table are 
29b0: 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68  unlinked from th
29c0: 65 20 22 64 62 22 0a 2a 2a 20 64 61 74 61 20 73  e "db".** data s
29d0: 74 72 75 63 74 75 72 65 20 69 66 20 64 62 21 3d  tructure if db!=
29e0: 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d 3d 4e 55  NULL.  If db==NU
29f0: 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61 74 74 61  LL, indices atta
2a00: 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74  ched to.** the t
2a10: 61 62 6c 65 20 61 72 65 20 64 65 6c 65 74 65 64  able are deleted
2a20: 2c 20 62 75 74 20 69 74 20 69 73 20 61 73 73 75  , but it is assu
2a30: 6d 65 64 20 74 68 65 79 20 68 61 76 65 20 61 6c  med they have al
2a40: 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 75 6e  ready been.** un
2a50: 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  linked..*/.void 
2a60: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
2a70: 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 54 61  e(sqlite *db, Ta
2a80: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
2a90: 69 6e 74 20 69 3b 0a 20 20 49 6e 64 65 78 20 2a  int i;.  Index *
2aa0: 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a  pIndex, *pNext;.
2ab0: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c 20 2a    FKey *pFKey, *
2ac0: 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20 69 66  pNextFKey;..  if
2ad0: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65  ( pTable==0 ) re
2ae0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  turn;..  /* Dele
2af0: 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61  te all indices a
2b00: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2b10: 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20  his table.  */. 
2b20: 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54   for(pIndex = pT
2b30: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49  able->pIndex; pI
2b40: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65  ndex; pIndex=pNe
2b50: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
2b60: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
2b70: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
2b80: 65 78 2d 3e 69 44 62 3d 3d 70 54 61 62 6c 65 2d  ex->iDb==pTable-
2b90: 3e 69 44 62 20 7c 7c 20 28 70 54 61 62 6c 65 2d  >iDb || (pTable-
2ba0: 3e 69 44 62 3d 3d 30 20 26 26 20 70 49 6e 64 65  >iDb==0 && pInde
2bb0: 78 2d 3e 69 44 62 3d 3d 31 29 20 29 3b 0a 20 20  x->iDb==1) );.  
2bc0: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e    sqliteDeleteIn
2bd0: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
2be0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
2bf0: 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65  e all foreign ke
2c00: 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
2c10: 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20  th this table.  
2c20: 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68  The keys.  ** sh
2c30: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
2c40: 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20  y been unlinked 
2c50: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 61 46 4b  from the db->aFK
2c60: 65 79 20 68 61 73 68 20 74 61 62 6c 65 20 0a 20  ey hash table . 
2c70: 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d   */.  for(pFKey=
2c80: 70 54 61 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70  pTable->pFKey; p
2c90: 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78  FKey; pFKey=pNex
2ca0: 74 46 4b 65 79 29 7b 0a 20 20 20 20 70 4e 65 78  tFKey){.    pNex
2cb0: 74 46 4b 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70  tFKey = pFKey->p
2cc0: 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73  NextFrom;.    as
2cd0: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 69 44  sert( pTable->iD
2ce0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20  b<db->nDb );.   
2cf0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 48   assert( sqliteH
2d00: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62  ashFind(&db->aDb
2d10: 5b 70 54 61 62 6c 65 2d 3e 69 44 62 5d 2e 61 46  [pTable->iDb].aF
2d20: 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Key,.           
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d40: 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c  pFKey->zTo, strl
2d50: 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31  en(pFKey->zTo)+1
2d60: 29 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20 20  )!=pFKey );.    
2d70: 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79  sqliteFree(pFKey
2d80: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
2d90: 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73 74  ete the Table st
2da0: 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a  ructure itself..
2db0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
2dc0: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
2dd0: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
2de0: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f  Free(pTable->aCo
2df0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[i].zName);.   
2e00: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
2e10: 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c  le->aCol[i].zDfl
2e20: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  t);.    sqliteFr
2e30: 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  ee(pTable->aCol[
2e40: 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20  i].zType);.  }. 
2e50: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
2e60: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  le->zName);.  sq
2e70: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
2e80: 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  >aCol);.  sqlite
2e90: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61  SelectDelete(pTa
2ea0: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  ble->pSelect);. 
2eb0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
2ec0: 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  le);.}../*.** Un
2ed0: 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74  link the given t
2ee0: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61  able from the ha
2ef0: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68  sh tables and th
2f00: 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20  e delete the.** 
2f10: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
2f20: 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64  with all its ind
2f30: 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e  ices and foreign
2f40: 20 6b 65 79 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   keys..*/.static
2f50: 20 76 6f 69 64 20 73 71 6c 69 74 65 55 6e 6c 69   void sqliteUnli
2f60: 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65  nkAndDeleteTable
2f70: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 54 61 62  (sqlite *db, Tab
2f80: 6c 65 20 2a 70 29 7b 0a 20 20 54 61 62 6c 65 20  le *p){.  Table 
2f90: 2a 70 4f 6c 64 3b 0a 20 20 46 4b 65 79 20 2a 70  *pOld;.  FKey *p
2fa0: 46 31 2c 20 2a 70 46 32 3b 0a 20 20 69 6e 74 20  F1, *pF2;.  int 
2fb0: 69 20 3d 20 70 2d 3e 69 44 62 3b 0a 20 20 61 73  i = p->iDb;.  as
2fc0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
2fd0: 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61   pOld = sqliteHa
2fe0: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44  shInsert(&db->aD
2ff0: 62 5b 69 5d 2e 74 62 6c 48 61 73 68 2c 20 70 2d  b[i].tblHash, p-
3000: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
3010: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a  ->zName)+1, 0);.
3020: 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d    assert( pOld==
3030: 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a  0 || pOld==p );.
3040: 20 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b    for(pF1=p->pFK
3050: 65 79 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31  ey; pF1; pF1=pF1
3060: 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20  ->pNextFrom){.  
3070: 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c    int nTo = strl
3080: 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31  en(pF1->zTo) + 1
3090: 3b 0a 20 20 20 20 70 46 32 20 3d 20 73 71 6c 69  ;.    pF2 = sqli
30a0: 74 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  teHashFind(&db->
30b0: 61 44 62 5b 69 5d 2e 61 46 4b 65 79 2c 20 70 46  aDb[i].aFKey, pF
30c0: 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20  1->zTo, nTo);.  
30d0: 20 20 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29    if( pF2==pF1 )
30e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 48 61  {.      sqliteHa
30f0: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44  shInsert(&db->aD
3100: 62 5b 69 5d 2e 61 46 4b 65 79 2c 20 70 46 31 2d  b[i].aFKey, pF1-
3110: 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e  >zTo, nTo, pF1->
3120: 70 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 7d 65  pNextTo);.    }e
3130: 6c 73 65 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  lse{.      while
3140: 28 20 70 46 32 20 26 26 20 70 46 32 2d 3e 70 4e  ( pF2 && pF2->pN
3150: 65 78 74 54 6f 21 3d 70 46 31 20 29 7b 20 70 46  extTo!=pF1 ){ pF
3160: 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b 20  2=pF2->pNextTo; 
3170: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46 32 20  }.      if( pF2 
3180: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 32 2d 3e  ){.        pF2->
3190: 70 4e 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70  pNextTo = pF1->p
31a0: 4e 65 78 74 54 6f 3b 0a 20 20 20 20 20 20 7d 0a  NextTo;.      }.
31b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
31c0: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  teDeleteTable(db
31d0: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  , p);.}../*.** C
31e0: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 6e 61 6d  onstruct the nam
31f0: 65 20 6f 66 20 61 20 75 73 65 72 20 74 61 62 6c  e of a user tabl
3200: 65 20 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d 20  e or index from 
3210: 61 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53  a token..**.** S
3220: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
3230: 20 6e 61 6d 65 20 69 73 20 6f 62 74 61 69 6e 65   name is obtaine
3240: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
3250: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 0a 2a  loc() and must.*
3260: 2a 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  * be freed by th
3270: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
3280: 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  on..*/.char *sql
3290: 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d  iteTableNameFrom
32a0: 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61  Token(Token *pNa
32b0: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  me){.  char *zNa
32c0: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  me = sqliteStrND
32d0: 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  up(pName->z, pNa
32e0: 6d 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65  me->n);.  sqlite
32f0: 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a  Dequote(zName);.
3300: 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a    return zName;.
3310: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
3320: 65 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74  e code to open t
3330: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
3340: 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 54 68  aster table.  Th
3350: 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 70 65 6e 65  e table.** opene
3360: 64 20 77 69 6c 6c 20 62 65 20 53 51 4c 49 54 45  d will be SQLITE
3370: 5f 4d 41 53 54 45 52 20 66 6f 72 20 70 65 72 73  _MASTER for pers
3380: 69 73 74 65 6e 74 20 74 61 62 6c 65 73 20 61 6e  istent tables an
3390: 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 4d  d .** SQLITE_TEM
33a0: 50 5f 4d 41 53 54 45 52 20 66 6f 72 20 74 65 6d  P_MASTER for tem
33b0: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
33c0: 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65  The table is ope
33d0: 6e 65 64 0a 2a 2a 20 6f 6e 20 63 75 72 73 6f 72  ned.** on cursor
33e0: 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69   0..*/.void sqli
33f0: 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  teOpenMasterTabl
3400: 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  e(Vdbe *v, int i
3410: 73 54 65 6d 70 29 7b 0a 20 20 73 71 6c 69 74 65  sTemp){.  sqlite
3420: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3430: 49 6e 74 65 67 65 72 2c 20 69 73 54 65 6d 70 2c  Integer, isTemp,
3440: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62   0);.  sqliteVdb
3450: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
3460: 6e 57 72 69 74 65 2c 20 30 2c 20 32 29 3b 0a 7d  nWrite, 0, 2);.}
3470: 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f  ../*.** Begin co
3480: 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77  nstructing a new
3490: 20 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74   table represent
34a0: 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e  ation in memory.
34b0: 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65    This is.** the
34c0: 20 66 69 72 73 74 20 6f 66 20 73 65 76 65 72 61   first of severa
34d0: 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65  l action routine
34e0: 73 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65  s that get calle
34f0: 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a  d in response.**
3500: 20 74 6f 20 61 20 43 52 45 41 54 45 20 54 41 42   to a CREATE TAB
3510: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49  LE statement.  I
3520: 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68  n particular, th
3530: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
3540: 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65  lled.** after se
3550: 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45  eing tokens "CRE
3560: 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22  ATE" and "TABLE"
3570: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e   and the table n
3580: 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20 70 53 74  ame.  The.** pSt
3590: 61 72 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  art token is the
35a0: 20 43 52 45 41 54 45 20 61 6e 64 20 70 4e 61 6d   CREATE and pNam
35b0: 65 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  e is the table n
35c0: 61 6d 65 2e 20 20 54 68 65 20 69 73 54 65 6d 70  ame.  The isTemp
35d0: 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65  .** flag is true
35e0: 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73 68   if the table sh
35f0: 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69  ould be stored i
3600: 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  n the auxiliary 
3610: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
3620: 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20 74   instead of in t
3630: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
3640: 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20   file.  This is 
3650: 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61 73  normally the cas
3660: 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22 54  e.** when the "T
3670: 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41  EMP" or "TEMPORA
3680: 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75  RY" keyword occu
3690: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a  rs in between.**
36a0: 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c   CREATE and TABL
36b0: 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  E..**.** The new
36c0: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73   table record is
36d0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64   initialized and
36e0: 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e   put in pParse->
36f0: 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73  pNewTable..** As
3700: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45   more of the CRE
3710: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
3720: 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20 61  ent is parsed, a
3730: 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e  dditional action
3740: 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  .** routines wil
3750: 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61  l be called to a
3760: 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74  dd more informat
3770: 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f  ion to this reco
3780: 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  rd..** At the en
3790: 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  d of the CREATE 
37a0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c  TABLE statement,
37b0: 20 74 68 65 20 73 71 6c 69 74 65 45 6e 64 54 61   the sqliteEndTa
37c0: 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  ble() routine.**
37d0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f   is called to co
37e0: 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74  mplete the const
37f0: 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  ruction of the n
3800: 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e  ew table record.
3810: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53  .*/.void sqliteS
3820: 74 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72  tartTable(.  Par
3830: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
3840: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
3850: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61  */.  Token *pSta
3860: 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 22 43 52  rt,   /* The "CR
3870: 45 41 54 45 22 20 74 6f 6b 65 6e 20 2a 2f 0a 20  EATE" token */. 
3880: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20   Token *pName,  
3890: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62    /* Name of tab
38a0: 6c 65 20 6f 72 20 76 69 65 77 20 74 6f 20 63 72  le or view to cr
38b0: 65 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  eate */.  int is
38c0: 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72  Temp,      /* Tr
38d0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
38e0: 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TEMP table */.  
38f0: 69 6e 74 20 69 73 56 69 65 77 20 20 20 20 20 20  int isView      
3900: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
3910: 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 29 7b   is a VIEW */.){
3920: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
3930: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
3940: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
3950: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
3960: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
3970: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b  e *v;.  int iDb;
3980: 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 46 69 72  ..  pParse->sFir
3990: 73 74 54 6f 6b 65 6e 20 3d 20 2a 70 53 74 61 72  stToken = *pStar
39a0: 74 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  t;.  zName = sql
39b0: 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d  iteTableNameFrom
39c0: 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20  Token(pName);.  
39d0: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72  if( zName==0 ) r
39e0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
39f0: 72 73 65 2d 3e 69 44 62 3d 3d 31 20 29 20 69 73  rse->iDb==1 ) is
3a00: 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65  Temp = 1;.#ifnde
3a10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
3a20: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73  THORIZATION.  as
3a30: 73 65 72 74 28 20 28 69 73 54 65 6d 70 20 26 20  sert( (isTemp & 
3a40: 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20  1)==isTemp );.  
3a50: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  {.    int code;.
3a60: 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20      char *zDb = 
3a70: 69 73 54 65 6d 70 20 3f 20 22 74 65 6d 70 22 20  isTemp ? "temp" 
3a80: 3a 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 69 66  : "main";.    if
3a90: 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63  ( sqliteAuthChec
3aa0: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
3ab0: 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f  _INSERT, SCHEMA_
3ac0: 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30  TABLE(isTemp), 0
3ad0: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
3ae0: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
3af0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
3b00: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
3b10: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
3b20: 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  f( isTemp ){.   
3b30: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
3b40: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
3b50: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
3b60: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
3b70: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
3b80: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
3b90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
3ba0: 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  ( isTemp ){.    
3bb0: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
3bc0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
3bd0: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
3be0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
3bf0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
3c00: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
3c10: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
3c20: 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  teAuthCheck(pPar
3c30: 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c  se, code, zName,
3c40: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
3c50: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
3c60: 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
3c70: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  n;.    }.  }.#en
3c80: 64 69 66 0a 20 0a 0a 20 20 2f 2a 20 42 65 66 6f  dif. ..  /* Befo
3c90: 72 65 20 74 72 79 69 6e 67 20 74 6f 20 63 72 65  re trying to cre
3ca0: 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
3cb0: 74 61 62 6c 65 2c 20 6d 61 6b 65 20 73 75 72 65  table, make sure
3cc0: 20 74 68 65 20 42 74 72 65 65 20 66 6f 72 0a 20   the Btree for. 
3cd0: 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 74 65 6d 70   ** holding temp
3ce0: 6f 72 61 72 79 20 74 61 62 6c 65 73 20 69 73 20  orary tables is 
3cf0: 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  open..  */.  if(
3d00: 20 69 73 54 65 6d 70 20 26 26 20 64 62 2d 3e 61   isTemp && db->a
3d10: 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20  Db[1].pBt==0 && 
3d20: 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
3d30: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
3d40: 20 73 71 6c 69 74 65 42 74 72 65 65 46 61 63 74   sqliteBtreeFact
3d50: 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c 20 4d 41  ory(db, 0, 0, MA
3d60: 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e 61 44  X_PAGES, &db->aD
3d70: 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69  b[1].pBt);.    i
3d80: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
3d90: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3da0: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
3db0: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e 61  e->zErrMsg, "una
3dc0: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  ble to open a te
3dd0: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
3de0: 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65   ".        "file
3df0: 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d   for storing tem
3e00: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 2c 20  porary tables", 
3e10: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
3e20: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
3e30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
3e40: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
3e50: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
3e60: 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20  InTrans ){.     
3e70: 20 72 63 20 3d 20 73 71 6c 69 74 65 42 74 72 65   rc = sqliteBtre
3e80: 65 42 65 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e  eBeginTrans(db->
3e90: 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[1].pBt);.   
3ea0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
3eb0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
3ec0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
3ed0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
3ee0: 67 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65  g, "unable to ge
3ef0: 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  t a write lock o
3f00: 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 74  n ".          "t
3f10: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  he temporary dat
3f20: 61 62 61 73 65 20 66 69 6c 65 22 2c 20 30 29 3b  abase file", 0);
3f30: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
3f40: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
3f50: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
3f60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
3f70: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
3f80: 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f  ew table name do
3f90: 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77  es not collide w
3fa0: 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  ith an existing.
3fb0: 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
3fc0: 62 6c 65 20 6e 61 6d 65 2e 20 20 49 73 73 75 65  ble name.  Issue
3fd0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
3fe0: 65 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20  e if it does..  
3ff0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 61 72  **.  ** If we ar
4000: 65 20 72 65 2d 72 65 61 64 69 6e 67 20 74 68 65  e re-reading the
4010: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
4020: 61 62 6c 65 20 62 65 63 61 75 73 65 20 6f 66 20  able because of 
4030: 61 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 63 68  a schema.  ** ch
4040: 61 6e 67 65 20 61 6e 64 20 61 20 6e 65 77 20 70  ange and a new p
4050: 65 72 6d 61 6e 65 6e 74 20 74 61 62 6c 65 20 69  ermanent table i
4060: 73 20 66 6f 75 6e 64 20 77 68 6f 73 65 20 6e 61  s found whose na
4070: 6d 65 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68  me collides with
4080: 0a 20 20 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e  .  ** an existin
4090: 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  g temporary tabl
40a0: 65 2c 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  e, that is not a
40b0: 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20  n error..  */.  
40c0: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 46  pTable = sqliteF
40d0: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
40e0: 6d 65 2c 20 30 29 3b 0a 20 20 69 44 62 20 3d 20  me, 0);.  iDb = 
40f0: 69 73 54 65 6d 70 20 3f 20 31 20 3a 20 70 50 61  isTemp ? 1 : pPa
4100: 72 73 65 2d 3e 69 44 62 3b 0a 20 20 69 66 28 20  rse->iDb;.  if( 
4110: 70 54 61 62 6c 65 21 3d 30 20 26 26 20 28 70 54  pTable!=0 && (pT
4120: 61 62 6c 65 2d 3e 69 44 62 3d 3d 69 44 62 20 7c  able->iDb==iDb |
4130: 7c 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  | !pParse->initF
4140: 6c 61 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  lag) ){.    sqli
4150: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
4160: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
4170: 74 61 62 6c 65 20 22 2c 20 30 2c 20 70 4e 61 6d  table ", 0, pNam
4180: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 0a  e->z, pName->n,.
4190: 20 20 20 20 20 20 20 20 22 20 61 6c 72 65 61 64          " alread
41a0: 79 20 65 78 69 73 74 73 22 2c 20 30 2c 20 30 29  y exists", 0, 0)
41b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
41c0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 50 61  (zName);.    pPa
41d0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
41e0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
41f0: 66 28 20 28 70 49 64 78 20 3d 20 73 71 6c 69 74  f( (pIdx = sqlit
4200: 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  eFindIndex(db, z
4210: 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 26 26 0a  Name, 0))!=0 &&.
4220: 20 20 20 20 20 20 20 20 20 20 28 70 49 64 78 2d            (pIdx-
4230: 3e 69 44 62 3d 3d 30 20 7c 7c 20 21 70 50 61 72  >iDb==0 || !pPar
4240: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 29 20 29 7b  se->initFlag) ){
4250: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
4260: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
4270: 72 72 4d 73 67 2c 20 22 74 68 65 72 65 20 69 73  rrMsg, "there is
4280: 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65   already an inde
4290: 78 20 6e 61 6d 65 64 20 22 2c 20 0a 20 20 20 20  x named ", .    
42a0: 20 20 20 7a 4e 61 6d 65 2c 20 28 63 68 61 72 2a     zName, (char*
42b0: 29 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  )0);.    sqliteF
42c0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
42d0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
42e0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
42f0: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
4300: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
4310: 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20  Table) );.  if( 
4320: 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  pTable==0 ){.   
4330: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
4340: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
4350: 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e    }.  pTable->zN
4360: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70  ame = zName;.  p
4370: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
4380: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
4390: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69  = 0;.  pTable->i
43a0: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61  PKey = -1;.  pTa
43b0: 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b  ble->pIndex = 0;
43c0: 0a 20 20 70 54 61 62 6c 65 2d 3e 69 44 62 20 3d  .  pTable->iDb =
43d0: 20 69 44 62 3b 0a 20 20 69 66 28 20 70 50 61 72   iDb;.  if( pPar
43e0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 20  se->pNewTable ) 
43f0: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
4400: 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e  e(db, pParse->pN
4410: 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72  ewTable);.  pPar
4420: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
4430: 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 42 65  pTable;..  /* Be
4440: 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74  gin generating t
4450: 68 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  he code that wil
4460: 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62  l insert the tab
4470: 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20  le record into. 
4480: 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   ** the SQLITE_M
4490: 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f  ASTER table.  No
44a0: 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72  te in particular
44b0: 20 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f   that we must go
44c0: 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20   ahead.  ** and 
44d0: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63  allocate the rec
44e0: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
44f0: 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e  he table entry n
4500: 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a  ow.  Before any.
4510: 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    ** PRIMARY KEY
4520: 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f   or UNIQUE keywo
4530: 72 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20  rds are parsed. 
4540: 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20   Those keywords 
4550: 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20  will cause.  ** 
4560: 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72  indices to be cr
4570: 65 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61  eated and the ta
4580: 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20  ble record must 
4590: 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20  come before the 
45a0: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20  .  ** indices.  
45b0: 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72  Hence, the recor
45c0: 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  d number for the
45d0: 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61   table must be a
45e0: 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f  llocated.  ** no
45f0: 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  w..  */.  if( !p
4600: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20  Parse->initFlag 
4610: 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 47 65  && (v = sqliteGe
4620: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
4630: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 42  0 ){.    sqliteB
4640: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
4650: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 73  on(pParse, 0, is
4660: 54 65 6d 70 29 3b 0a 20 20 20 20 69 66 28 20 21  Temp);.    if( !
4670: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
4680: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4690: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64  v, OP_Integer, d
46a0: 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20  b->file_format, 
46b0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
46c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
46d0: 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 31 29  SetCookie, 0, 1)
46e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
46f0: 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  teOpenMasterTabl
4700: 65 28 76 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20  e(v, isTemp);.  
4710: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4720: 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f  p(v, OP_NewRecno
4730: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
4740: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4750: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
4760: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4770: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
4780: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
4790: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
47a0: 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20  P_PutIntKey, 0, 
47b0: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
47c0: 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d   Add a new colum
47d0: 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  n to the table c
47e0: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
47f0: 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a  onstructed..**.*
4800: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
4810: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
4820: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f  once for each co
4830: 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  lumn declaration
4840: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
4850: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
4860: 20 20 73 71 6c 69 74 65 53 74 61 72 74 54 61 62    sqliteStartTab
4870: 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64  le() gets called
4880: 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74  .** first to get
4890: 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20   things going.  
48a0: 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  Then this routin
48b0: 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
48c0: 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a  each.** column..
48d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64  */.void sqliteAd
48e0: 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70  dColumn(Parse *p
48f0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
4900: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
4910: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
4920: 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 43 6f 6c 75  r *z = 0;.  Colu
4930: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20  mn *pCol;.  if( 
4940: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
4950: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
4960: 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 53 65 74  urn;.  sqliteSet
4970: 4e 53 74 72 69 6e 67 28 26 7a 2c 20 70 4e 61 6d  NString(&z, pNam
4980: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20  e->z, pName->n, 
4990: 30 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  0);.  if( z==0 )
49a0: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
49b0: 65 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66  eDequote(z);.  f
49c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
49d0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
49e0: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
49f0: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  , p->aCol[i].zNa
4a00: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
4a10: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
4a20: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
4a30: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
4a40: 75 6d 6e 20 6e 61 6d 65 3a 20 22 2c 20 7a 2c 20  umn name: ", z, 
4a50: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
4a60: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
4a70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
4a80: 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(z);.      retu
4a90: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
4aa0: 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30  if( (p->nCol & 0
4ab0: 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f  x7)==0 ){.    Co
4ac0: 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20  lumn *aNew;.    
4ad0: 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61  aNew = sqliteRea
4ae0: 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28  lloc( p->aCol, (
4af0: 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f  p->nCol+8)*sizeo
4b00: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
4b10: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
4b20: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 2d  ) return;.    p-
4b30: 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20  >aCol = aNew;.  
4b40: 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61  }.  pCol = &p->a
4b50: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20  Col[p->nCol];.  
4b60: 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20  memset(pCol, 0, 
4b70: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
4b80: 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61  ]));.  pCol->zNa
4b90: 6d 65 20 3d 20 7a 3b 0a 20 20 70 43 6f 6c 2d 3e  me = z;.  pCol->
4ba0: 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49  sortOrder = SQLI
4bb0: 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 70 2d 3e  TE_SO_NUM;.  p->
4bc0: 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nCol++;.}../*.**
4bd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4be0: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
4bf0: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
4c00: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
4c10: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
4c20: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
4c30: 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20  .  A "NOT NULL" 
4c40: 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a  constraint has.*
4c50: 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61  * been seen on a
4c60: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72   column.  This r
4c70: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
4c80: 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a  notNull flag on.
4c90: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75  ** the column cu
4ca0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
4cb0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
4cc0: 6f 69 64 20 73 71 6c 69 74 65 41 64 64 4e 6f 74  oid sqliteAddNot
4cd0: 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72  Null(Parse *pPar
4ce0: 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
4cf0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
4d00: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20  int i;.  if( (p 
4d10: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
4d20: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
4d30: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
4d40: 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20  1;.  if( i>=0 ) 
4d50: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75  p->aCol[i].notNu
4d60: 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a  ll = onError;.}.
4d70: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4d80: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
4d90: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
4da0: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
4db0: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
4dc0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
4dd0: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69  tement.  The pFi
4de0: 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  rst token is the
4df0: 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20   first.** token 
4e00: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  in the sequence 
4e10: 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64  of tokens that d
4e20: 65 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65  escribe the type
4e30: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   of the.** colum
4e40: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
4e50: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
4e60: 20 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c    pLast is the l
4e70: 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20  ast token.** in 
4e80: 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55  the sequence.  U
4e90: 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  se this informat
4ea0: 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ion to construct
4eb0: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61   a string.** tha
4ec0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
4ed0: 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  ypename of the c
4ee0: 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20  olumn and store 
4ef0: 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69  that string.** i
4f00: 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69  n zType..*/ .voi
4f10: 64 20 73 71 6c 69 74 65 41 64 64 43 6f 6c 75 6d  d sqliteAddColum
4f20: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
4f30: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 46 69 72  rse, Token *pFir
4f40: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74  st, Token *pLast
4f50: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
4f60: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
4f70: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a   n;.  char *z, *
4f80: 2a 70 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  *pz;.  Column *p
4f90: 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  Col;.  if( (p = 
4fa0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4fb0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
4fc0: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
4fd0: 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74  .  if( i<0 ) ret
4fe0: 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70  urn;.  pCol = &p
4ff0: 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 70 7a 20  ->aCol[i];.  pz 
5000: 3d 20 26 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a  = &pCol->zType;.
5010: 20 20 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b    n = pLast->n +
5020: 20 41 64 64 72 28 70 4c 61 73 74 2d 3e 7a 29 20   Addr(pLast->z) 
5030: 2d 20 41 64 64 72 28 70 46 69 72 73 74 2d 3e 7a  - Addr(pFirst->z
5040: 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 74 4e 53  );.  sqliteSetNS
5050: 74 72 69 6e 67 28 70 7a 2c 20 70 46 69 72 73 74  tring(pz, pFirst
5060: 2d 3e 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 7a 20  ->z, n, 0);.  z 
5070: 3d 20 2a 70 7a 3b 0a 20 20 69 66 28 20 7a 3d 3d  = *pz;.  if( z==
5080: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
5090: 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69  r(i=j=0; z[i]; i
50a0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d  ++){.    int c =
50b0: 20 7a 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 69   z[i];.    if( i
50c0: 73 73 70 61 63 65 28 63 29 20 29 20 63 6f 6e 74  sspace(c) ) cont
50d0: 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d  inue;.    z[j++]
50e0: 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d   = c;.  }.  z[j]
50f0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 72   = 0;.  if( pPar
5100: 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72  se->db->file_for
5110: 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 70 43  mat>=4 ){.    pC
5120: 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  ol->sortOrder = 
5130: 73 71 6c 69 74 65 43 6f 6c 6c 61 74 65 54 79 70  sqliteCollateTyp
5140: 65 28 7a 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65  e(z, n);.  }else
5150: 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 6f 72 74  {.    pCol->sort
5160: 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53  Order = SQLITE_S
5170: 4f 5f 4e 55 4d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  O_NUM;.  }.}../*
5180: 0a 2a 2a 20 54 68 65 20 67 69 76 65 6e 20 74 6f  .** The given to
5190: 6b 65 6e 20 69 73 20 74 68 65 20 64 65 66 61 75  ken is the defau
51a0: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
51b0: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64   last column add
51c0: 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62  ed to.** the tab
51d0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
51e0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
51f0: 20 20 49 66 20 22 6d 69 6e 75 73 46 6c 61 67 22    If "minusFlag"
5200: 20 69 73 20 74 72 75 65 2c 20 69 74 0a 2a 2a 20   is true, it.** 
5210: 6d 65 61 6e 73 20 74 68 65 20 76 61 6c 75 65 20  means the value 
5220: 74 6f 6b 65 6e 20 77 61 73 20 70 72 65 63 65 64  token was preced
5230: 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69  ed by a minus si
5240: 67 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  gn..**.** This r
5250: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
5260: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
5270: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
5280: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
5290: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
52a0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
52b0: 69 64 20 73 71 6c 69 74 65 41 64 64 44 65 66 61  id sqliteAddDefa
52c0: 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a  ultValue(Parse *
52d0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
52e0: 56 61 6c 2c 20 69 6e 74 20 6d 69 6e 75 73 46 6c  Val, int minusFl
52f0: 61 67 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  ag){.  Table *p;
5300: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
5310: 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20 28 70 20   **pz;.  if( (p 
5320: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
5330: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
5340: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
5350: 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72  1;.  if( i<0 ) r
5360: 65 74 75 72 6e 3b 0a 20 20 70 7a 20 3d 20 26 70  eturn;.  pz = &p
5370: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 3b  ->aCol[i].zDflt;
5380: 0a 20 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67  .  if( minusFlag
5390: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
53a0: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 22 2d 22  tNString(pz, "-"
53b0: 2c 20 31 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56  , 1, pVal->z, pV
53c0: 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c  al->n, 0);.  }el
53d0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65  se{.    sqliteSe
53e0: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 56 61  tNString(pz, pVa
53f0: 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30  l->z, pVal->n, 0
5400: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 44  );.  }.  sqliteD
5410: 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a  equote(*pz);.}..
5420: 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20  /*.** Designate 
5430: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
5440: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20  for the table.  
5450: 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
5460: 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  of names .** of 
5470: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72  columns that for
5480: 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  m the primary ke
5490: 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20  y.  If pList is 
54a0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a  NULL, then the.*
54b0: 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  * most recently 
54c0: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20  added column of 
54d0: 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65  the table is the
54e0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a   primary key..**
54f0: 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20  .** A table can 
5500: 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65  have at most one
5510: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
5520: 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
5530: 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69  ady has.** a pri
5540: 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68  mary key (and th
5550: 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
5560: 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68   primary key) th
5570: 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20  en create an.** 
5580: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
5590: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
55a0: 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63  is on a single c
55b0: 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61  olumn whose data
55c0: 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c  type is INTEGER,
55d0: 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  .** then we will
55e0: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74   try to use that
55f0: 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72   column as the r
5600: 6f 77 20 69 64 2e 20 20 28 45 78 63 65 70 74 69  ow id.  (Excepti
5610: 6f 6e 3a 0a 2a 2a 20 46 6f 72 20 62 61 63 6b 77  on:.** For backw
5620: 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
5630: 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 64 61  ty with older da
5640: 74 61 62 61 73 65 73 2c 20 64 6f 20 6e 6f 74 20  tabases, do not 
5650: 64 6f 20 74 68 69 73 0a 2a 2a 20 69 66 20 74 68  do this.** if th
5660: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 76 65  e file format ve
5670: 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 73 20  rsion number is 
5680: 6c 65 73 73 20 74 68 61 6e 20 31 2e 29 20 20 53  less than 1.)  S
5690: 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b  et the Table.iPK
56a0: 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ey.** field of t
56b0: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
56c0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  onstruction to b
56d0: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  e the index of t
56e0: 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52  he.** INTEGER PR
56f0: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
5700: 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69  .  Table.iPKey i
5710: 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74  s set to -1 if t
5720: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e  here is.** no IN
5730: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
5740: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  Y..**.** If the 
5750: 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e  key is not an IN
5760: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
5770: 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  Y, then create a
5780: 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78   unique.** index
5790: 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e   for the key.  N
57a0: 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  o index is creat
57b0: 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50  ed for INTEGER P
57c0: 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a  RIMARY KEYs..*/.
57d0: 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 50 72  void sqliteAddPr
57e0: 69 6d 61 72 79 4b 65 79 28 50 61 72 73 65 20 2a  imaryKey(Parse *
57f0: 70 50 61 72 73 65 2c 20 49 64 4c 69 73 74 20 2a  pParse, IdList *
5800: 70 4c 69 73 74 2c 20 69 6e 74 20 6f 6e 45 72 72  pList, int onErr
5810: 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  or){.  Table *pT
5820: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
5830: 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  wTable;.  char *
5840: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zType = 0;.  int
5850: 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20   iCol = -1, i;. 
5860: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67   if( pTab==0 ) g
5870: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
5880: 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62  exit;.  if( pTab
5890: 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a  ->hasPrimKey ){.
58a0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
58b0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
58c0: 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 5c 22 22  rMsg, "table \""
58d0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a  , pTab->zName, .
58e0: 20 20 20 20 20 20 20 20 22 5c 22 20 68 61 73 20          "\" has 
58f0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72  more than one pr
5900: 69 6d 61 72 79 20 6b 65 79 22 2c 20 28 63 68 61  imary key", (cha
5910: 72 2a 29 30 29 3b 0a 20 20 20 20 70 50 61 72 73  r*)0);.    pPars
5920: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67  e->nErr++;.    g
5930: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
5940: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62  exit;.  }.  pTab
5950: 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31  ->hasPrimKey = 1
5960: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
5970: 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
5980: 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20  Tab->nCol - 1;. 
5990: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43     pTab->aCol[iC
59a0: 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20  ol].isPrimKey = 
59b0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
59c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
59d0: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
59e0: 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
59f0: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
5a00: 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iCol++){.       
5a10: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
5a20: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
5a30: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
5a40: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  [iCol].zName)==0
5a50: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
5a60: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  }.      if( iCol
5a70: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 20 70 54  <pTab->nCol ) pT
5a80: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69  ab->aCol[iCol].i
5a90: 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20  sPrimKey = 1;.  
5aa0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73    }.    if( pLis
5ab0: 74 2d 3e 6e 49 64 3e 31 20 29 20 69 43 6f 6c 20  t->nId>1 ) iCol 
5ac0: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  = -1;.  }.  if( 
5ad0: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
5ae0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
5af0: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
5b00: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
5b10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
5b20: 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72  se->db->file_for
5b30: 6d 61 74 3e 3d 31 20 26 26 20 0a 20 20 20 20 20  mat>=1 && .     
5b40: 20 20 20 20 20 20 7a 54 79 70 65 20 26 26 20 73        zType && s
5b50: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 54 79  qliteStrICmp(zTy
5b60: 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d  pe, "INTEGER")==
5b70: 30 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69  0 ){.    pTab->i
5b80: 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  PKey = iCol;.   
5b90: 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d   pTab->keyConf =
5ba0: 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 7d 65 6c 73   onError;.  }els
5bb0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 43 72 65  e{.    sqliteCre
5bc0: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
5bd0: 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e   0, 0, pList, on
5be0: 45 72 72 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20  Error, 0, 0);.  
5bf0: 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d    pList = 0;.  }
5c00: 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  ..primary_key_ex
5c10: 69 74 3a 0a 20 20 73 71 6c 69 74 65 49 64 4c 69  it:.  sqliteIdLi
5c20: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
5c30: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
5c40: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
5c50: 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61  ppropriate colla
5c60: 74 69 6e 67 20 74 79 70 65 20 67 69 76 65 6e 20  ting type given 
5c70: 61 20 74 79 70 65 20 6e 61 6d 65 2e 0a 2a 2a 0a  a type name..**.
5c80: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ** The collation
5c90: 20 74 79 70 65 20 69 73 20 74 65 78 74 20 28 53   type is text (S
5ca0: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 29 20 69  QLITE_SO_TEXT) i
5cb0: 66 20 74 68 65 20 74 79 70 65 0a 2a 2a 20 6e 61  f the type.** na
5cc0: 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  me contains the 
5cd0: 63 68 61 72 61 63 74 65 72 20 73 74 72 65 61 6d  character stream
5ce0: 20 22 74 65 78 74 22 20 6f 72 20 22 62 6c 6f 62   "text" or "blob
5cf0: 22 20 6f 72 0a 2a 2a 20 22 63 6c 6f 62 22 2e 20  " or.** "clob". 
5d00: 20 41 6e 79 20 6f 74 68 65 72 20 74 79 70 65 20   Any other type 
5d10: 6e 61 6d 65 20 69 73 20 63 6f 6c 6c 61 74 65 64  name is collated
5d20: 20 61 73 20 6e 75 6d 65 72 69 63 0a 2a 2a 20 28   as numeric.** (
5d30: 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 29 2e 0a  SQLITE_SO_NUM)..
5d40: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 43 6f 6c  */.int sqliteCol
5d50: 6c 61 74 65 54 79 70 65 28 63 6f 6e 73 74 20 63  lateType(const c
5d60: 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20  har *zType, int 
5d70: 6e 54 79 70 65 29 7b 0a 20 20 69 6e 74 20 69 3b  nType){.  int i;
5d80: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54  .  for(i=0; i<nT
5d90: 79 70 65 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  ype-1; i++){.   
5da0: 20 73 77 69 74 63 68 28 20 7a 54 79 70 65 5b 69   switch( zType[i
5db0: 5d 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  ] ){.      case 
5dc0: 27 62 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20  'b':.      case 
5dd0: 27 42 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  'B': {.        i
5de0: 66 28 20 69 3c 6e 54 79 70 65 2d 33 20 26 26 20  f( i<nType-3 && 
5df0: 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 26  sqliteStrNICmp(&
5e00: 7a 54 79 70 65 5b 69 5d 2c 22 62 6c 6f 62 22 2c  zType[i],"blob",
5e10: 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  4)==0 ){.       
5e20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5e30: 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 20 20  _SO_TEXT;.      
5e40: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
5e50: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5e60: 20 63 61 73 65 20 27 63 27 3a 0a 20 20 20 20 20   case 'c':.     
5e70: 20 63 61 73 65 20 27 43 27 3a 20 7b 0a 20 20 20   case 'C': {.   
5e80: 20 20 20 20 20 69 66 28 20 69 3c 6e 54 79 70 65       if( i<nType
5e90: 2d 33 20 26 26 20 28 73 71 6c 69 74 65 53 74 72  -3 && (sqliteStr
5ea0: 4e 49 43 6d 70 28 26 7a 54 79 70 65 5b 69 5d 2c  NICmp(&zType[i],
5eb0: 22 63 68 61 72 22 2c 34 29 3d 3d 30 20 7c 7c 0a  "char",4)==0 ||.
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ed0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
5ee0: 65 53 74 72 4e 49 43 6d 70 28 26 7a 54 79 70 65  eStrNICmp(&zType
5ef0: 5b 69 5d 2c 22 63 6c 6f 62 22 2c 34 29 3d 3d 30  [i],"clob",4)==0
5f00: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
5f10: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
5f20: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20  LITE_SO_TEXT;.  
5f30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5f40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5f50: 20 20 20 20 20 63 61 73 65 20 27 78 27 3a 0a 20       case 'x':. 
5f60: 20 20 20 20 20 63 61 73 65 20 27 58 27 3a 20 7b       case 'X': {
5f70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d  .        if( i>=
5f80: 32 20 26 26 20 73 71 6c 69 74 65 53 74 72 4e 49  2 && sqliteStrNI
5f90: 43 6d 70 28 26 7a 54 79 70 65 5b 69 2d 32 5d 2c  Cmp(&zType[i-2],
5fa0: 22 74 65 78 74 22 2c 34 29 3d 3d 30 20 29 7b 0a  "text",4)==0 ){.
5fb0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5fc0: 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b   SQLITE_SO_TEXT;
5fd0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5fe0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5ff0: 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  }.      default:
6000: 20 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   {.        break
6010: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6020: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
6030: 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 7d 0a 0a 2f  ITE_SO_NUM;.}../
6040: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6050: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
6060: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
6070: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
6080: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
6090: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
60a0: 6d 65 6e 74 2e 20 20 41 20 22 43 4f 4c 4c 41 54  ment.  A "COLLAT
60b0: 45 22 20 63 6c 61 75 73 65 20 68 61 73 0a 2a 2a  E" clause has.**
60c0: 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20   been seen on a 
60d0: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f  column.  This ro
60e0: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 43  utine sets the C
60f0: 6f 6c 75 6d 6e 2e 73 6f 72 74 4f 72 64 65 72 20  olumn.sortOrder 
6100: 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  on.** the column
6110: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
6120: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
6130: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64  /.void sqliteAdd
6140: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
6150: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 63  e *pParse, int c
6160: 6f 6c 6c 54 79 70 65 29 7b 0a 20 20 54 61 62 6c  ollType){.  Tabl
6170: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
6180: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
6190: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
61a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
61b0: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
61c0: 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b   i>=0 ) p->aCol[
61d0: 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 63  i].sortOrder = c
61e0: 6f 6c 6c 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ollType;.}../*.*
61f0: 2a 20 43 6f 6d 65 20 75 70 20 77 69 74 68 20 61  * Come up with a
6200: 20 6e 65 77 20 72 61 6e 64 6f 6d 20 76 61 6c 75   new random valu
6210: 65 20 66 6f 72 20 74 68 65 20 73 63 68 65 6d 61  e for the schema
6220: 20 63 6f 6f 6b 69 65 2e 20 20 4d 61 6b 65 20 73   cookie.  Make s
6230: 75 72 65 0a 2a 2a 20 74 68 65 20 6e 65 77 20 76  ure.** the new v
6240: 61 6c 75 65 20 69 73 20 64 69 66 66 65 72 65 6e  alue is differen
6250: 74 20 66 72 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a  t from the old..
6260: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  **.** The schema
6270: 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20   cookie is used 
6280: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
6290: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  n the schema for
62a0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
62b0: 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72   changes.  After
62c0: 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61   each schema cha
62d0: 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20  nge, the cookie 
62e0: 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73  value.** changes
62f0: 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73  .  When a proces
6300: 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68  s first reads th
6310: 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f  e schema it reco
6320: 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69  rds the.** cooki
6330: 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20  e.  Thereafter, 
6340: 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73  whenever it goes
6350: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
6360: 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63  atabase,.** it c
6370: 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65  hecks the cookie
6380: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
6390: 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74  e schema has not
63a0: 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63   changed.** sinc
63b0: 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65  e it was last re
63c0: 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70  ad..**.** This p
63d0: 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c  lan is not compl
63e0: 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f  etely bullet-pro
63f0: 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69  of.  It is possi
6400: 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ble for.** the s
6410: 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20  chema to change 
6420: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61  multiple times a
6430: 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69  nd for the cooki
6440: 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62  e to be.** set b
6450: 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c  ack to prior val
6460: 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20  ue.  But schema 
6470: 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72  changes are infr
6480: 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68  equent.** and th
6490: 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
64a0: 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d   hitting the sam
64b0: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69  e cookie value i
64c0: 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e  s only.** 1 chan
64d0: 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20  ce in 2^32.  So 
64e0: 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67  we're safe enoug
64f0: 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  h..*/.void sqlit
6500: 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71  eChangeCookie(sq
6510: 6c 69 74 65 20 2a 64 62 2c 20 56 64 62 65 20 2a  lite *db, Vdbe *
6520: 76 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 65  v){.  if( db->ne
6530: 78 74 5f 63 6f 6f 6b 69 65 3d 3d 64 62 2d 3e 61  xt_cookie==db->a
6540: 44 62 5b 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f  Db[0].schema_coo
6550: 6b 69 65 20 29 7b 0a 20 20 20 20 75 6e 73 69 67  kie ){.    unsig
6560: 6e 65 64 20 63 68 61 72 20 72 3b 0a 20 20 20 20  ned char r;.    
6570: 73 71 6c 69 74 65 52 61 6e 64 6f 6d 6e 65 73 73  sqliteRandomness
6580: 28 31 2c 20 26 72 29 3b 0a 20 20 20 20 64 62 2d  (1, &r);.    db-
6590: 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 20 3d 20 64  >next_cookie = d
65a0: 62 2d 3e 61 44 62 5b 30 5d 2e 73 63 68 65 6d 61  b->aDb[0].schema
65b0: 5f 63 6f 6f 6b 69 65 20 2b 20 72 20 2b 20 31 3b  _cookie + r + 1;
65c0: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
65d0: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
65e0: 68 61 6e 67 65 73 3b 0a 20 20 20 20 73 71 6c 69  hanges;.    sqli
65f0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6600: 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 6e  P_Integer, db->n
6610: 65 78 74 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a  ext_cookie, 0);.
6620: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6630: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  dOp(v, OP_SetCoo
6640: 6b 69 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  kie, 0, 0);.  }.
6650: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65  }../*.** Measure
6660: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
6670: 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65 64  haracters needed
6680: 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67   to output the g
6690: 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69  iven.** identifi
66a0: 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  er.  The number 
66b0: 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65  returned include
66c0: 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65  s any quotes use
66d0: 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f  d.** but does no
66e0: 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75  t include the nu
66f0: 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a  ll terminator..*
6700: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65  /.static int ide
6710: 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63  ntLength(const c
6720: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e  har *z){.  int n
6730: 3b 0a 20 20 69 6e 74 20 6e 65 65 64 51 75 6f 74  ;.  int needQuot
6740: 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6e 3d 30  e = 0;.  for(n=0
6750: 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b  ; *z; n++, z++){
6760: 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 27  .    if( *z=='\'
6770: 27 20 29 7b 20 6e 2b 2b 3b 20 6e 65 65 64 51 75  ' ){ n++; needQu
6780: 6f 74 65 3d 31 3b 20 7d 0a 20 20 7d 0a 20 20 72  ote=1; }.  }.  r
6790: 65 74 75 72 6e 20 6e 20 2b 20 6e 65 65 64 51 75  eturn n + needQu
67a0: 6f 74 65 2a 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ote*2;.}../*.** 
67b0: 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69 66  Write an identif
67c0: 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ier onto the end
67d0: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73 74   of the given st
67e0: 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75  ring.  Add.** qu
67f0: 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20 61  ote characters a
6800: 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  s needed..*/.sta
6810: 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75  tic void identPu
6820: 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a  t(char *z, int *
6830: 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 49 64 65  pIdx, char *zIde
6840: 6e 74 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  nt){.  int i, j,
6850: 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20   needQuote;.  i 
6860: 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a  = *pIdx;.  for(j
6870: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
6880: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73  ++){.    if( !is
6890: 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29  alnum(zIdent[j])
68a0: 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27   && zIdent[j]!='
68b0: 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  _' ) break;.  }.
68c0: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a    needQuote =  z
68d0: 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69  Ident[j]!=0 || i
68e0: 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d  sdigit(zIdent[0]
68f0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
6900: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 4b 65 79      || sqliteKey
6910: 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c  wordCode(zIdent,
6920: 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66   j)!=TK_ID;.  if
6930: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
6940: 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 66  i++] = '\'';.  f
6950: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
6960: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69  ]; j++){.    z[i
6970: 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b  ++] = zIdent[j];
6980: 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b  .    if( zIdent[
6990: 6a 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b 69 2b 2b  j]=='\'' ) z[i++
69a0: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a 20 20  ] = '\'';.  }.  
69b0: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
69c0: 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20  z[i++] = '\'';. 
69d0: 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49   z[i] = 0;.  *pI
69e0: 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx = i;.}../*.**
69f0: 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41   Generate a CREA
6a00: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
6a10: 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  nt appropriate f
6a20: 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
6a30: 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74  table.  Memory t
6a40: 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20  o hold the text 
6a50: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
6a60: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
6a70: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
6a80: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
6a90: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
6aa0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
6ab0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
6ac0: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 54  reateTableStmt(T
6ad0: 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  able *p){.  int 
6ae0: 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20  i, k, n;.  char 
6af0: 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a  *zStmt;.  char *
6b00: 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a  zSep, *zSep2, *z
6b10: 45 6e 64 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  End;.  n = 0;.  
6b20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
6b30: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20  ol; i++){.    n 
6b40: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
6b50: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
6b60: 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65  ;.  }.  n += ide
6b70: 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d  ntLength(p->zNam
6b80: 65 29 3b 0a 20 20 69 66 28 20 6e 3c 34 30 20 29  e);.  if( n<40 )
6b90: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b  {.    zSep = "";
6ba0: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22  .    zSep2 = ","
6bb0: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22  ;.    zEnd = ")"
6bc0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
6bd0: 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20  Sep = "\n  ";.  
6be0: 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20    zSep2 = ",\n  
6bf0: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c  ";.    zEnd = "\
6c00: 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  n)";.  }.  n += 
6c10: 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a  35 + 6*p->nCol;.
6c20: 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
6c30: 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b 0a  MallocRaw( n );.
6c40: 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29    if( zStmt==0 )
6c50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 74 72   return 0;.  str
6c60: 63 70 79 28 7a 53 74 6d 74 2c 20 70 2d 3e 69 44  cpy(zStmt, p->iD
6c70: 62 3d 3d 31 20 3f 20 22 43 52 45 41 54 45 20 54  b==1 ? "CREATE T
6c80: 45 4d 50 20 54 41 42 4c 45 20 22 20 3a 20 22 43  EMP TABLE " : "C
6c90: 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a  REATE TABLE ");.
6ca0: 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74    k = strlen(zSt
6cb0: 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28  mt);.  identPut(
6cc0: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e  zStmt, &k, p->zN
6cd0: 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b  ame);.  zStmt[k+
6ce0: 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28  +] = '(';.  for(
6cf0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
6d00: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63 70 79  i++){.    strcpy
6d10: 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70  (&zStmt[k], zSep
6d20: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c  );.    k += strl
6d30: 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20  en(&zStmt[k]);. 
6d40: 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b     zSep = zSep2;
6d50: 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53  .    identPut(zS
6d60: 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 61 43 6f 6c  tmt, &k, p->aCol
6d70: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
6d80: 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b    strcpy(&zStmt[
6d90: 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74  k], zEnd);.  ret
6da0: 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a  urn zStmt;.}../*
6db0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6dc0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
6dd0: 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22  port the final "
6de0: 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  )" that terminat
6df0: 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54  es.** a CREATE T
6e00: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
6e10: 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
6e20: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f  structure that o
6e30: 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74  ther action rout
6e40: 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62  ines have been b
6e50: 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64  uilding.** is ad
6e60: 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ded to the inter
6e70: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c  nal hash tables,
6e80: 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   assuming no err
6e90: 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75  ors have.** occu
6ea0: 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  rred..**.** An e
6eb0: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62  ntry for the tab
6ec0: 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68  le is made in th
6ed0: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f  e master table o
6ee0: 6e 20 64 69 73 6b 2c 0a 2a 2a 20 75 6e 6c 65 73  n disk,.** unles
6ef0: 73 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  s this is a temp
6f00: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 69  orary table or i
6f10: 6e 69 74 46 6c 61 67 3d 3d 31 2e 20 20 57 68 65  nitFlag==1.  Whe
6f20: 6e 20 69 6e 69 74 46 6c 61 67 3d 3d 31 2c 0a 2a  n initFlag==1,.*
6f30: 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  * it means we ar
6f40: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  e reading the sq
6f50: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
6f60: 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  e because we jus
6f70: 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74  t.** connected t
6f80: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  o the database o
6f90: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71  r because the sq
6fa0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
6fb0: 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c  e has.** recentl
6fc0: 79 20 63 68 61 6e 67 65 73 2c 20 73 6f 20 74 68  y changes, so th
6fd0: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73  e entry for this
6fe0: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
6ff0: 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20  xists in.** the 
7000: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
7010: 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ble.  We do not 
7020: 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69  want to create i
7030: 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49  t again..**.** I
7040: 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72  f the pSelect ar
7050: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
7060: 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  LL, it means tha
7070: 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
7080: 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  * was called to 
7090: 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67  create a table g
70a0: 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20  enerated from a 
70b0: 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c  .** "CREATE TABL
70c0: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20  E ... AS SELECT 
70d0: 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20  ..." statement. 
70e0: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   The column name
70f0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  s of.** the new 
7100: 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68  table will match
7110: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
7120: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  of the SELECT..*
7130: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 6e 64  /.void sqliteEnd
7140: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
7150: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  rse, Token *pEnd
7160: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
7170: 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  t){.  Table *p;.
7180: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
7190: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
71a0: 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53  ( (pEnd==0 && pS
71b0: 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61  elect==0) || pPa
71c0: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
71d0: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
71e0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20  d ) return;.  p 
71f0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
7200: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
7210: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
7220: 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  If the table is 
7230: 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61  generated from a
7240: 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 63 6f   SELECT, then co
7250: 6e 73 74 72 75 63 74 20 74 68 65 0a 20 20 2a 2a  nstruct the.  **
7260: 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
7270: 20 61 6e 64 20 74 68 65 20 74 65 78 74 20 6f 66   and the text of
7280: 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2f   the table..  */
7290: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29  .  if( pSelect )
72a0: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65  {.    Table *pSe
72b0: 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 52 65 73  lTab = sqliteRes
72c0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
72d0: 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 65 63  Parse, 0, pSelec
72e0: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c  t);.    if( pSel
72f0: 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Tab==0 ) return;
7300: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
7310: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70  aCol==0 );.    p
7320: 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
7330: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61  ->nCol;.    p->a
7340: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
7350: 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  Col;.    pSelTab
7360: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
7370: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
7380: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c  0;.    sqliteDel
7390: 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c  eteTable(0, pSel
73a0: 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Tab);.  }..  /* 
73b0: 49 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20  If the initFlag 
73c0: 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65  is 1 it means we
73d0: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
73e0: 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a   SQL off the.  *
73f0: 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  * "sqlite_master
7400: 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d  " or "sqlite_tem
7410: 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20  p_master" table 
7420: 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a  on the disk..  *
7430: 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74  * So do not writ
7440: 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67  e to the disk ag
7450: 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68  ain.  Extract th
7460: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
7470: 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  er.  ** for the 
7480: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70  table from the p
7490: 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20 66  Parse->newTnum f
74a0: 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65  ield.  (The page
74b0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f   number.  ** sho
74c0: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75  uld have been pu
74d0: 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73  t there by the s
74e0: 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74  qliteOpenCb rout
74f0: 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ine.).  */.  if(
7500: 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61   pParse->initFla
7510: 67 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d  g ){.    p->tnum
7520: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e   = pParse->newTn
7530: 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  um;.  }..  /* If
7540: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   not initializin
7550: 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  g, then create a
7560: 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20   record for the 
7570: 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69  new table.  ** i
7580: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  n the SQLITE_MAS
7590: 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65  TER table of the
75a0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
75b0: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20  record number.  
75c0: 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  ** for the new t
75d0: 61 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c  able entry shoul
75e0: 64 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20  d already be on 
75f0: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a  the stack..  **.
7600: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
7610: 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c  a TEMPORARY tabl
7620: 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74  e, write the ent
7630: 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69  ry into the auxi
7640: 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20  liary.  ** file 
7650: 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20  instead of into 
7660: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
7670: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  e file..  */.  i
7680: 66 28 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74  f( !pParse->init
7690: 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 6e 74 20  Flag ){.    int 
76a0: 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  n;.    Vdbe *v;.
76b0: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47  .    v = sqliteG
76c0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
76d0: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
76e0: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70  eturn;.    if( p
76f0: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
7700: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c        /* A regul
7710: 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ar table */.    
7720: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7730: 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61  p(v, OP_CreateTa
7740: 62 6c 65 2c 20 30 2c 20 70 2d 3e 69 44 62 29 3b  ble, 0, p->iDb);
7750: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
7760: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
7770: 20 28 63 68 61 72 20 2a 29 26 70 2d 3e 74 6e 75   (char *)&p->tnu
7780: 6d 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a  m, P3_POINTER);.
7790: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
77a0: 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20   /* A view */.  
77b0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
77c0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
77d0: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  r, 0, 0);.    }.
77e0: 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 30 3b      p->tnum = 0;
77f0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
7800: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c  ddOp(v, OP_Pull,
7810: 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   1, 0);.    sqli
7820: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7830: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
7840: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c  .    if( p->pSel
7850: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect==0 ){.      
7860: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
7870: 50 33 28 76 2c 20 2d 31 2c 20 22 74 61 62 6c 65  P3(v, -1, "table
7880: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
7890: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
78a0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
78b0: 50 33 28 76 2c 20 2d 31 2c 20 22 76 69 65 77 22  P3(v, -1, "view"
78c0: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
78d0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64    }.    sqliteVd
78e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
78f0: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
7900: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
7910: 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e  eP3(v, -1, p->zN
7920: 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
7930: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
7940: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
7950: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  g, 0, 0);.    sq
7960: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
7970: 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65  (v, -1, p->zName
7980: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
7990: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
79a0: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 34 2c 20  p(v, OP_Dup, 4, 
79b0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
79c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
79d0: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
79e0: 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
79f0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
7a00: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
7a10: 70 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 7a 20  p);.      n = z 
7a20: 3f 20 73 74 72 6c 65 6e 28 7a 29 20 3a 20 30 3b  ? strlen(z) : 0;
7a30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
7a40: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
7a50: 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71   z, n);.      sq
7a60: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
7a70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
7a80: 73 65 72 74 28 20 70 45 6e 64 21 3d 30 20 29 3b  sert( pEnd!=0 );
7a90: 0a 20 20 20 20 20 20 6e 20 3d 20 41 64 64 72 28  .      n = Addr(
7aa0: 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28  pEnd->z) - Addr(
7ab0: 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54 6f  pParse->sFirstTo
7ac0: 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20 20 20  ken.z) + 1;.    
7ad0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
7ae0: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 50 61 72  geP3(v, -1, pPar
7af0: 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e  se->sFirstToken.
7b00: 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  z, n);.    }.   
7b10: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7b20: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
7b30: 64 2c 20 35 2c 20 30 29 3b 0a 20 20 20 20 73 71  d, 5, 0);.    sq
7b40: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7b50: 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30   OP_PutIntKey, 0
7b60: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 70  , 0);.    if( !p
7b70: 2d 3e 69 44 62 20 29 7b 0a 20 20 20 20 20 20 73  ->iDb ){.      s
7b80: 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69  qliteChangeCooki
7b90: 65 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a  e(db, v);.    }.
7ba0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
7bb0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
7bc0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
7bd0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
7be0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7bf0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
7c00: 70 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20  p->iDb, 0);.    
7c10: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7c20: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  p(v, OP_OpenWrit
7c30: 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 1, 0);.      
7c40: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32  pParse->nTab = 2
7c50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  ;.      sqliteSe
7c60: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
7c70: 6c 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c  lect, SRT_Table,
7c80: 20 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   1, 0, 0, 0);.  
7c90: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 45 6e    }.    sqliteEn
7ca0: 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
7cb0: 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20  pParse);.  }..  
7cc0: 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65  /* Add the table
7cd0: 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   to the in-memor
7ce0: 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
7cf0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
7d00: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
7d10: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 20  rse->explain==0 
7d20: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
7d30: 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  =0 ){.    Table 
7d40: 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65 79 20  *pOld;.    FKey 
7d50: 2a 70 46 4b 65 79 3b 0a 20 20 20 20 70 4f 6c 64  *pFKey;.    pOld
7d60: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73   = sqliteHashIns
7d70: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e  ert(&db->aDb[p->
7d80: 69 44 62 5d 2e 74 62 6c 48 61 73 68 2c 20 0a 20  iDb].tblHash, . 
7d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7da0: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 4e             p->zN
7db0: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a  ame, strlen(p->z
7dc0: 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20  Name)+1, p);.   
7dd0: 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20   if( pOld ){.   
7de0: 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f     assert( p==pO
7df0: 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ld );  /* Malloc
7e00: 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
7e10: 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73  d inside HashIns
7e20: 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 72  ert() */.      r
7e30: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
7e40: 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70 46   for(pFKey=p->pF
7e50: 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65  Key; pFKey; pFKe
7e60: 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72  y=pFKey->pNextFr
7e70: 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  om){.      int n
7e80: 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b 65  To = strlen(pFKe
7e90: 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20  y->zTo) + 1;.   
7ea0: 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54     pFKey->pNextT
7eb0: 6f 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69  o = sqliteHashFi
7ec0: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69  nd(&db->aDb[p->i
7ed0: 44 62 5d 2e 61 46 4b 65 79 2c 20 70 46 4b 65 79  Db].aFKey, pFKey
7ee0: 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20  ->zTo, nTo);.   
7ef0: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73     sqliteHashIns
7f00: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e  ert(&db->aDb[p->
7f10: 69 44 62 5d 2e 61 46 4b 65 79 2c 20 70 46 4b 65  iDb].aFKey, pFKe
7f20: 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b  y->zTo, nTo, pFK
7f30: 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ey);.    }.    p
7f40: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
7f50: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54   = 0;.    db->nT
7f60: 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e  able++;.    db->
7f70: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
7f80: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
7f90: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
7fa0: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
7fb0: 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64  s routine in ord
7fc0: 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  er to create a n
7fd0: 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20  ew VIEW.*/.void 
7fe0: 73 71 6c 69 74 65 43 72 65 61 74 65 56 69 65 77  sqliteCreateView
7ff0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
8000: 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  e,     /* The pa
8010: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
8020: 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e  .  Token *pBegin
8030: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
8040: 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
8050: 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d  egins the statem
8060: 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
8070: 70 4e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 54  pName,      /* T
8080: 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f  he token that ho
8090: 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
80a0: 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65  the view */.  Se
80b0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
80c0: 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61   /* A SELECT sta
80d0: 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c  tement that will
80e0: 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
80f0: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
8100: 54 65 6d 70 20 20 20 20 20 20 20 20 20 2f 2a 20  Temp         /* 
8110: 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f  TRUE for a TEMPO
8120: 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 29 7b 0a  RARY view */.){.
8130: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
8140: 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t n;.  const cha
8150: 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45  r *z;.  Token sE
8160: 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46  nd;.  DbFixer sF
8170: 69 78 3b 0a 0a 20 20 73 71 6c 69 74 65 53 74 61  ix;..  sqliteSta
8180: 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  rtTable(pParse, 
8190: 70 42 65 67 69 6e 2c 20 70 4e 61 6d 65 2c 20 69  pBegin, pName, i
81a0: 73 54 65 6d 70 2c 20 31 29 3b 0a 20 20 70 20 3d  sTemp, 1);.  p =
81b0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
81c0: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  le;.  if( p==0 |
81d0: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
81e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65  {.    sqliteSele
81f0: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
8200: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
8210: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 46   }.  if( sqliteF
8220: 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50  ixInit(&sFix, pP
8230: 61 72 73 65 2c 20 70 2d 3e 69 44 62 2c 20 22 76  arse, p->iDb, "v
8240: 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20  iew", pName).   
8250: 20 26 26 20 73 71 6c 69 74 65 46 69 78 53 65 6c   && sqliteFixSel
8260: 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65  ect(&sFix, pSele
8270: 63 74 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  ct).  ){.    sql
8280: 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28  iteSelectDelete(
8290: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
82a0: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
82b0: 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  Make a copy of t
82c0: 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54  he entire SELECT
82d0: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
82e0: 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
82f0: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c  ..  ** This will
8300: 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45   force all the E
8310: 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75  xpr.token.z valu
8320: 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  es to be dynamic
8330: 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  ally.  ** alloca
8340: 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e 20  ted rather than 
8350: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70  point to the inp
8360: 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63  ut string - whic
8370: 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a  h means that.  *
8380: 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73  * they will pers
8390: 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63 75  ist after the cu
83a0: 72 72 65 6e 74 20 73 71 6c 69 74 65 5f 65 78 65  rrent sqlite_exe
83b0: 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  c() call returns
83c0: 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c  ..  */.  p->pSel
83d0: 65 63 74 20 3d 20 73 71 6c 69 74 65 53 65 6c 65  ect = sqliteSele
83e0: 63 74 44 75 70 28 70 53 65 6c 65 63 74 29 3b 0a  ctDup(pSelect);.
83f0: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65    sqliteSelectDe
8400: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
8410: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 69 6e   if( !pParse->in
8420: 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71  itFlag ){.    sq
8430: 6c 69 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d  liteViewGetColum
8440: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
8450: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  );.  }..  /* Loc
8460: 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
8470: 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73  he CREATE VIEW s
8480: 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20  tatement.  Make 
8490: 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20  sEnd point to.  
84a0: 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f  ** the end..  */
84b0: 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65  .  sEnd = pParse
84c0: 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20  ->sLastToken;.  
84d0: 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30  if( sEnd.z[0]!=0
84e0: 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27   && sEnd.z[0]!='
84f0: 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a  ;' ){.    sEnd.z
8500: 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a   += sEnd.n;.  }.
8510: 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20    sEnd.n = 0;.  
8520: 6e 20 3d 20 28 28 69 6e 74 29 73 45 6e 64 2e 7a  n = ((int)sEnd.z
8530: 29 20 2d 20 28 69 6e 74 29 70 42 65 67 69 6e 2d  ) - (int)pBegin-
8540: 3e 7a 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e  >z;.  z = pBegin
8550: 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e  ->z;.  while( n>
8560: 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b  0 && (z[n-1]==';
8570: 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e  ' || isspace(z[n
8580: 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  -1])) ){ n--; }.
8590: 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d    sEnd.z = &z[n-
85a0: 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31  1];.  sEnd.n = 1
85b0: 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69  ;..  /* Use sqli
85c0: 74 65 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20  teEndTable() to 
85d0: 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20  add the view to 
85e0: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
85f0: 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  R table */.  sql
8600: 69 74 65 45 6e 64 54 61 62 6c 65 28 70 50 61 72  iteEndTable(pPar
8610: 73 65 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20  se, &sEnd, 0);. 
8620: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
8630: 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
8640: 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20  cture pTable is 
8650: 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20  really a VIEW.  
8660: 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65  Fill in the name
8670: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  s of.** the colu
8680: 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20  mns of the view 
8690: 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74  in the pTable st
86a0: 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e  ructure.  Return
86b0: 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
86c0: 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
86d0: 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c   error is seen l
86e0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
86f0: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
8700: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  >zErrMsg..*/.int
8710: 20 73 71 6c 69 74 65 56 69 65 77 47 65 74 43 6f   sqliteViewGetCo
8720: 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20  lumnNames(Parse 
8730: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
8740: 70 54 61 62 6c 65 29 7b 0a 20 20 45 78 70 72 4c  pTable){.  ExprL
8750: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 53  ist *pEList;.  S
8760: 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 54  elect *pSel;.  T
8770: 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20  able *pSelTab;. 
8780: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a   int nErr = 0;..
8790: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
87a0: 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69   );..  /* A posi
87b0: 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20  tive nCol means 
87c0: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65  the columns name
87d0: 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20  s for this view 
87e0: 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79  are.  ** already
87f0: 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69   known..  */.  i
8800: 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  f( pTable->nCol>
8810: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
8820: 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e   /* A negative n
8830: 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c  Col is a special
8840: 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20   marker meaning 
8850: 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72  that we are curr
8860: 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e  ently.  ** tryin
8870: 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  g to compute the
8880: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20   column names.  
8890: 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73  If we enter this
88a0: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20   routine with.  
88b0: 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43  ** a negative nC
88c0: 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f  ol, it means two
88d0: 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66   or more views f
88e0: 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65  orm a loop, like
88f0: 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   this:.  **.  **
8900: 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
8910: 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a   one AS SELECT *
8920: 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20   FROM two;.  ** 
8930: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
8940: 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20  two AS SELECT * 
8950: 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20  FROM one;.  **. 
8960: 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68   ** Actually, th
8970: 69 73 20 65 72 72 6f 72 20 69 73 20 63 61 75 67  is error is caug
8980: 68 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6e  ht previously an
8990: 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d so the followi
89a0: 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f  ng test.  ** sho
89b0: 75 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c 2e  uld always fail.
89c0: 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65    But we will le
89d0: 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20  ave it in place 
89e0: 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
89f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
8a00: 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20  le->nCol<0 ){.  
8a10: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
8a20: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
8a30: 73 67 2c 20 22 76 69 65 77 20 22 2c 20 70 54 61  sg, "view ", pTa
8a40: 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  ble->zName,.    
8a50: 20 20 20 20 20 22 20 69 73 20 63 69 72 63 75 6c       " is circul
8a60: 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 28  arly defined", (
8a70: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 70 50  char*)0);.    pP
8a80: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
8a90: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
8aa0: 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20  .  /* If we get 
8ab0: 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
8ac0: 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f  ns we need to co
8ad0: 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20  mpute the table 
8ae0: 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73  names..  */.  as
8af0: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53  sert( pTable->pS
8b00: 65 6c 65 63 74 20 29 3b 20 2f 2a 20 49 66 20 6e  elect ); /* If n
8b10: 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 70 54 61  Col==0, then pTa
8b20: 62 6c 65 20 6d 75 73 74 20 62 65 20 61 20 56 49  ble must be a VI
8b30: 45 57 20 2a 2f 0a 20 20 70 53 65 6c 20 3d 20 70  EW */.  pSel = p
8b40: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3b 0a  Table->pSelect;.
8b50: 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  /* Note that 
8b60: 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
8b70: 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  teResultSetOfSel
8b80: 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e  ect() will expan
8b90: 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65  d any.  ** "*" e
8ba0: 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20  lements in this 
8bb0: 6c 69 73 74 2e 20 20 42 75 74 20 77 65 20 77 69  list.  But we wi
8bc0: 6c 6c 20 6e 65 65 64 20 74 6f 20 72 65 73 74 6f  ll need to resto
8bd0: 72 65 20 74 68 65 20 6c 69 73 74 0a 20 20 2a 2a  re the list.  **
8be0: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
8bf0: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
8c00: 69 6f 6e 20 61 66 74 65 72 77 61 72 64 73 2c 20  ion afterwards, 
8c10: 73 6f 20 77 65 20 73 61 76 65 20 61 20 63 6f 70  so we save a cop
8c20: 79 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 6f 72  y of.  ** the or
8c30: 69 67 69 6e 61 6c 20 69 6e 20 70 45 4c 69 73 74  iginal in pEList
8c40: 2e 0a 20 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20  ..  */.  pEList 
8c50: 3d 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3b 0a  = pSel->pEList;.
8c60: 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d    pSel->pEList =
8c70: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
8c80: 75 70 28 70 45 4c 69 73 74 29 3b 0a 20 20 69 66  up(pEList);.  if
8c90: 28 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3d 3d  ( pSel->pEList==
8ca0: 30 20 29 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70  0 ){.    pSel->p
8cb0: 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a  EList = pEList;.
8cc0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f      return 1;  /
8cd0: 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20  * Malloc failed 
8ce0: 2a 2f 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d  */.  }.  pTable-
8cf0: 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 70 53  >nCol = -1;.  pS
8d00: 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 52 65  elTab = sqliteRe
8d10: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
8d20: 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29  pParse, 0, pSel)
8d30: 3b 0a 20 20 69 66 28 20 70 53 65 6c 54 61 62 20  ;.  if( pSelTab 
8d40: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
8d50: 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29  Table->aCol==0 )
8d60: 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43  ;.    pTable->nC
8d70: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
8d80: 6f 6c 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e  ol;.    pTable->
8d90: 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
8da0: 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61  aCol;.    pSelTa
8db0: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
8dc0: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
8dd0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65   0;.    sqliteDe
8de0: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65  leteTable(0, pSe
8df0: 6c 54 61 62 29 3b 0a 20 20 20 20 44 62 53 65 74  lTab);.    DbSet
8e00: 50 72 6f 70 65 72 74 79 28 70 50 61 72 73 65 2d  Property(pParse-
8e10: 3e 64 62 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62  >db, pTable->iDb
8e20: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
8e30: 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  s);.  }else{.   
8e40: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
8e50: 30 3b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20  0;.    nErr++;. 
8e60: 20 7d 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63   }.  sqliteSelec
8e70: 74 55 6e 62 69 6e 64 28 70 53 65 6c 29 3b 0a 20  tUnbind(pSel);. 
8e80: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
8e90: 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70 45 4c 69  elete(pSel->pELi
8ea0: 73 74 29 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c  st);.  pSel->pEL
8eb0: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
8ec0: 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
8ed0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
8ee0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
8ef0: 72 6f 6d 20 74 68 65 20 56 49 45 57 20 70 54 61  rom the VIEW pTa
8f00: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ble..**.** This 
8f10: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
8f20: 64 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 6f  d whenever any o
8f30: 74 68 65 72 20 74 61 62 6c 65 20 6f 72 20 76 69  ther table or vi
8f40: 65 77 20 69 73 20 6d 6f 64 69 66 69 65 64 2e 0a  ew is modified..
8f50: 2a 2a 20 54 68 65 20 76 69 65 77 20 70 61 73 73  ** The view pass
8f60: 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75  ed into this rou
8f70: 74 69 6e 65 20 6d 69 67 68 74 20 64 65 70 65 6e  tine might depen
8f80: 64 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e  d directly or in
8f90: 64 69 72 65 63 74 6c 79 0a 2a 2a 20 6f 6e 20 74  directly.** on t
8fa0: 68 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 64  he modified or d
8fb0: 65 6c 65 74 65 64 20 74 61 62 6c 65 20 73 6f 20  eleted table so 
8fc0: 77 65 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 72  we need to clear
8fd0: 20 74 68 65 20 6f 6c 64 20 63 6f 6c 75 6d 6e 0a   the old column.
8fe0: 2a 2a 20 6e 61 6d 65 73 20 73 6f 20 74 68 61 74  ** names so that
8ff0: 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20 72 65   they will be re
9000: 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61  computed..*/.sta
9010: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56  tic void sqliteV
9020: 69 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61  iewResetColumnNa
9030: 6d 65 73 28 54 61 62 6c 65 20 2a 70 54 61 62 6c  mes(Table *pTabl
9040: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  e){.  int i;.  i
9050: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 7c 7c 20  f( pTable==0 || 
9060: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3d  pTable->pSelect=
9070: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
9080: 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d  f( pTable->nCol=
9090: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
90a0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65  or(i=0; i<pTable
90b0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
90c0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
90d0: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  ble->aCol[i].zNa
90e0: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
90f0: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
9100: 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20  [i].zDflt);.    
9110: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
9120: 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65  e->aCol[i].zType
9130: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
9140: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
9150: 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f  );.  pTable->aCo
9160: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  l = 0;.  pTable-
9170: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  >nCol = 0;.}../*
9180: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f  .** Clear the co
9190: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
91a0: 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61  every VIEW in da
91b0: 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73  tabase idx..*/.s
91c0: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
91d0: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71  eViewResetAll(sq
91e0: 6c 69 74 65 20 2a 64 62 2c 20 69 6e 74 20 69 64  lite *db, int id
91f0: 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  x){.  HashElem *
9200: 69 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50  i;.  if( !DbHasP
9210: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
9220: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
9230: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  ) ) return;.  fo
9240: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
9250: 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78  rst(&db->aDb[idx
9260: 5d 2e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69  ].tblHash); i; i
9270: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
9280: 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  i)){.    Table *
9290: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
92a0: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
92b0: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
92c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
92d0: 69 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61  iewResetColumnNa
92e0: 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d  mes(pTab);.    }
92f0: 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72  .  }.  DbClearPr
9300: 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20  operty(db, idx, 
9310: 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
9320: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
9330: 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75   a token, look u
9340: 70 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  p a table with t
9350: 68 61 74 20 6e 61 6d 65 2e 20 20 49 66 20 6e 6f  hat name.  If no
9360: 74 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65 0a 2a  t found, leave.*
9370: 2a 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 74  * an error for t
9380: 68 65 20 70 61 72 73 65 72 20 74 6f 20 66 69 6e  he parser to fin
9390: 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  d and return NUL
93a0: 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  L..*/.Table *sql
93b0: 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65  iteTableFromToke
93c0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
93d0: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20   Token *pTok){. 
93e0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
93f0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 7a  Table *pTab;.  z
9400: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62  Name = sqliteTab
9410: 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  leNameFromToken(
9420: 70 54 6f 6b 29 3b 0a 20 20 69 66 28 20 7a 4e 61  pTok);.  if( zNa
9430: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  me==0 ) return 0
9440: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
9450: 65 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  eFindTable(pPars
9460: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  e->db, zName, 0)
9470: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
9480: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61  Name);.  if( pTa
9490: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  b==0 ){.    sqli
94a0: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
94b0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
94c0: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22  no such table: "
94d0: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 70 54  , 0, .        pT
94e0: 6f 6b 2d 3e 7a 2c 20 70 54 6f 6b 2d 3e 6e 2c 20  ok->z, pTok->n, 
94f0: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
9500: 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nErr++;.  }.  re
9510: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
9520: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9530: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f   is called to do
9540: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44   the work of a D
9550: 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ROP TABLE statem
9560: 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73  ent..** pName is
9570: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
9580: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f   table to be dro
9590: 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  pped..*/.void sq
95a0: 6c 69 74 65 44 72 6f 70 54 61 62 6c 65 28 50 61  liteDropTable(Pa
95b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
95c0: 65 6e 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  en *pName, int i
95d0: 73 56 69 65 77 29 7b 0a 20 20 54 61 62 6c 65 20  sView){.  Table 
95e0: 2a 70 54 61 62 6c 65 3b 0a 20 20 56 64 62 65 20  *pTable;.  Vdbe 
95f0: 2a 76 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a  *v;.  int base;.
9600: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
9610: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
9620: 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61   iDb;..  if( pPa
9630: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
9640: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
9650: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54  d ) return;.  pT
9660: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 54 61 62  able = sqliteTab
9670: 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  leFromToken(pPar
9680: 73 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  se, pName);.  if
9690: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65  ( pTable==0 ) re
96a0: 74 75 72 6e 3b 0a 20 20 69 44 62 20 3d 20 70 54  turn;.  iDb = pT
96b0: 61 62 6c 65 2d 3e 69 44 62 3b 0a 20 20 61 73 73  able->iDb;.  ass
96c0: 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
96d0: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 23 69  Db<db->nDb );.#i
96e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
96f0: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
9700: 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
9710: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
9720: 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
9730: 54 41 42 4c 45 28 70 54 61 62 6c 65 2d 3e 69 44  TABLE(pTable->iD
9740: 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  b);.    const ch
9750: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
9760: 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62 5d 2e 7a  b[pTable->iDb].z
9770: 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
9780: 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50  liteAuthCheck(pP
9790: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
97a0: 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
97b0: 62 29 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  b)){.      retur
97c0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
97d0: 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20   isView ){.     
97e0: 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20   if( iDb==1 ){. 
97f0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
9800: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56  LITE_DROP_TEMP_V
9810: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
9820: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
9830: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45   SQLITE_DROP_VIE
9840: 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  W;.      }.    }
9850: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
9860: 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
9870: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
9880: 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b  DROP_TEMP_TABLE;
9890: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
98a0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
98b0: 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a  ITE_DROP_TABLE;.
98c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
98d0: 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68    if( sqliteAuth
98e0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
98f0: 64 65 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  de, pTable->zNam
9900: 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
9910: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
9920: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
9930: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
9940: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
9950: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20   pTable->zName, 
9960: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
9970: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
9980: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
9990: 70 54 61 62 6c 65 2d 3e 72 65 61 64 4f 6e 6c 79  pTable->readOnly
99a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
99b0: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
99c0: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65  >zErrMsg, "table
99d0: 20 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d   ", pTable->zNam
99e0: 65 2c 20 0a 20 20 20 20 20 20 20 22 20 6d 61 79  e, .       " may
99f0: 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22   not be dropped"
9a00: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
9a10: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
9a20: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
9a30: 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26  .  if( isView &&
9a40: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
9a50: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
9a60: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
9a70: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 73  se->zErrMsg, "us
9a80: 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20  e DROP TABLE to 
9a90: 64 65 6c 65 74 65 20 74 61 62 6c 65 20 22 2c 0a  delete table ",.
9aa0: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 7a 4e        pTable->zN
9ab0: 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
9ac0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
9ad0: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
9ae0: 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65    }.  if( !isVie
9af0: 77 20 26 26 20 70 54 61 62 6c 65 2d 3e 70 53 65  w && pTable->pSe
9b00: 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
9b10: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
9b20: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75  rse->zErrMsg, "u
9b30: 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20  se DROP VIEW to 
9b40: 64 65 6c 65 74 65 20 76 69 65 77 20 22 2c 0a 20  delete view ",. 
9b50: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61       pTable->zNa
9b60: 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  me, (char*)0);. 
9b70: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
9b80: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
9b90: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
9ba0: 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
9bb0: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
9bc0: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
9bd0: 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20  .  ** on disk.. 
9be0: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
9bf0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
9c00: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
9c10: 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 72  static VdbeOp dr
9c20: 6f 70 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20  opTable[] = {.  
9c30: 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c      { OP_Rewind,
9c40: 20 20 20 20 20 30 2c 20 41 44 44 52 28 38 29 2c       0, ADDR(8),
9c50: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
9c60: 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20  _String,     0, 
9c70: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a  0,        0}, /*
9c80: 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   1 */.      { OP
9c90: 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20  _MemStore,   1, 
9ca0: 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  1,        0},.  
9cb0: 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64      { OP_MemLoad
9cc0: 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
9cd0: 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20    0}, /* 3 */.  
9ce0: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
9cf0: 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20       0, 2,      
9d00: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
9d10: 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 30 2c 20  _Ne,         0, 
9d20: 41 44 44 52 28 37 29 2c 20 20 30 7d 2c 0a 20 20  ADDR(7),  0},.  
9d30: 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c      { OP_Delete,
9d40: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
9d50: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
9d60: 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20  _Next,       0, 
9d70: 41 44 44 52 28 33 29 2c 20 20 30 7d 2c 20 2f 2a  ADDR(3),  0}, /*
9d80: 20 37 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20   7 */.    };.   
9d90: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
9da0: 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
9db0: 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 42  ger;.    sqliteB
9dc0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
9dd0: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54  on(pParse, 0, pT
9de0: 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 0a 20 20 20  able->iDb);..   
9df0: 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69   /* Drop all tri
9e00: 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64  ggers associated
9e10: 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
9e20: 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 2a 2f  being dropped */
9e30: 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20  .    pTrigger = 
9e40: 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72  pTable->pTrigger
9e50: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54 72  ;.    while( pTr
9e60: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 61  igger ){.      a
9e70: 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d  ssert( pTrigger-
9e80: 3e 69 44 62 3d 3d 70 54 61 62 6c 65 2d 3e 69 44  >iDb==pTable->iD
9e90: 62 20 7c 7c 20 70 54 72 69 67 67 65 72 2d 3e 69  b || pTrigger->i
9ea0: 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  Db==1 );.      s
9eb0: 71 6c 69 74 65 44 72 6f 70 54 72 69 67 67 65 72  qliteDropTrigger
9ec0: 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69  Ptr(pParse, pTri
9ed0: 67 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  gger, 1);.      
9ee0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
9ef0: 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ain ){.        p
9f00: 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67  Trigger = pTrigg
9f10: 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
9f20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9f30: 70 54 72 69 67 67 65 72 20 3d 20 70 54 61 62 6c  pTrigger = pTabl
9f40: 65 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20  e->pTrigger;.   
9f50: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
9f60: 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49  /* Drop all SQLI
9f70: 54 45 5f 4d 41 53 54 45 52 20 65 6e 74 72 69 65  TE_MASTER entrie
9f80: 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
9f90: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
9fa0: 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65   sqliteOpenMaste
9fb0: 72 54 61 62 6c 65 28 76 2c 20 70 54 61 62 6c 65  rTable(v, pTable
9fc0: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 62 61 73 65  ->iDb);.    base
9fd0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
9fe0: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
9ff0: 69 7a 65 28 64 72 6f 70 54 61 62 6c 65 29 2c 20  ize(dropTable), 
a000: 64 72 6f 70 54 61 62 6c 65 29 3b 0a 20 20 20 20  dropTable);.    
a010: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
a020: 50 33 28 76 2c 20 62 61 73 65 2b 31 2c 20 70 54  P3(v, base+1, pT
a030: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  able->zName, 0);
a040: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c  ..    /* Drop al
a050: 6c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 4d 41  l SQLITE_TEMP_MA
a060: 53 54 45 52 20 65 6e 74 72 69 65 73 20 74 68 61  STER entries tha
a070: 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 74  t refer to the t
a080: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  able */.    if( 
a090: 70 54 61 62 6c 65 2d 3e 69 44 62 21 3d 31 20 29  pTable->iDb!=1 )
a0a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 70  {.      sqliteOp
a0b0: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c  enMasterTable(v,
a0c0: 20 31 29 3b 0a 20 20 20 20 20 20 62 61 73 65 20   1);.      base 
a0d0: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
a0e0: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
a0f0: 7a 65 28 64 72 6f 70 54 61 62 6c 65 29 2c 20 64  ze(dropTable), d
a100: 72 6f 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ropTable);.     
a110: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
a120: 65 50 33 28 76 2c 20 62 61 73 65 2b 31 2c 20 70  eP3(v, base+1, p
a130: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Table->zName, 0)
a140: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
a150: 20 70 54 61 62 6c 65 2d 3e 69 44 62 3d 3d 30 20   pTable->iDb==0 
a160: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43  ){.      sqliteC
a170: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20  hangeCookie(db, 
a180: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  v);.    }.    sq
a190: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
a1a0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
a1b0: 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65  ;.    if( !isVie
a1c0: 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  w ){.      sqlit
a1d0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
a1e0: 5f 44 65 73 74 72 6f 79 2c 20 70 54 61 62 6c 65  _Destroy, pTable
a1f0: 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 6c 65 2d 3e  ->tnum, pTable->
a200: 69 44 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  iDb);.      for(
a210: 70 49 64 78 3d 70 54 61 62 6c 65 2d 3e 70 49 6e  pIdx=pTable->pIn
a220: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
a230: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
a240: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
a250: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74  AddOp(v, OP_Dest
a260: 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  roy, pIdx->tnum,
a270: 20 70 49 64 78 2d 3e 69 44 62 29 3b 0a 20 20 20   pIdx->iDb);.   
a280: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
a290: 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65  qliteEndWriteOpe
a2a0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a  ration(pParse);.
a2b0: 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
a2c0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   the in-memory d
a2d0: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
a2e0: 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  e table..  **.  
a2f0: 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 69 66  ** Exception: if
a300: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
a310: 6e 74 20 62 65 67 61 6e 20 77 69 74 68 20 74 68  nt began with th
a320: 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72  e EXPLAIN keywor
a330: 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6e 6f 20  d,.  ** then no 
a340: 63 68 61 6e 67 65 73 20 73 68 6f 75 6c 64 20 62  changes should b
a350: 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69  e made..  */.  i
a360: 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  f( !pParse->expl
a370: 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ain ){.    sqlit
a380: 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  eUnlinkAndDelete
a390: 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 6c 65  Table(db, pTable
a3a0: 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  );.    db->flags
a3b0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
a3c0: 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 20 20  nChanges;.  }.  
a3d0: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
a3e0: 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a  ll(db, iDb);.}..
a3f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
a400: 6e 65 20 63 6f 6e 73 74 72 75 63 74 73 20 61 20  ne constructs a 
a410: 50 33 20 73 74 72 69 6e 67 20 73 75 69 74 61 62  P3 string suitab
a420: 6c 65 20 66 6f 72 20 61 6e 20 4f 50 5f 4d 61 6b  le for an OP_Mak
a430: 65 49 64 78 4b 65 79 0a 2a 2a 20 6f 70 63 6f 64  eIdxKey.** opcod
a440: 65 20 61 6e 64 20 61 64 64 73 20 74 68 61 74 20  e and adds that 
a450: 50 33 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65  P3 string to the
a460: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69   most recently i
a470: 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74  nserted instruct
a480: 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 76 69  ion.** in the vi
a490: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20  rtual machine.  
a4a0: 54 68 65 20 50 33 20 73 74 72 69 6e 67 20 63 6f  The P3 string co
a4b0: 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67  nsists of a sing
a4c0: 6c 65 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20  le character.** 
a4d0: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
a4e0: 69 6e 20 74 68 65 20 69 6e 64 65 78 20 70 49 64  in the index pId
a4f0: 78 20 6f 66 20 74 61 62 6c 65 20 70 54 61 62 2e  x of table pTab.
a500: 20 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20    If the column 
a510: 75 73 65 73 0a 2a 2a 20 61 20 6e 75 6d 65 72 69  uses.** a numeri
a520: 63 20 73 6f 72 74 20 6f 72 64 65 72 2c 20 74 68  c sort order, th
a530: 65 6e 20 74 68 65 20 50 33 20 73 74 72 69 6e 67  en the P3 string
a540: 20 63 68 61 72 61 63 74 65 72 20 63 6f 72 72 65   character corre
a550: 73 70 6f 6e 64 69 6e 67 20 74 6f 0a 2a 2a 20 74  sponding to.** t
a560: 68 61 74 20 63 6f 6c 75 6d 6e 20 69 73 20 27 6e  hat column is 'n
a570: 27 2e 20 20 49 66 20 74 68 65 20 63 6f 6c 75 6d  '.  If the colum
a580: 6e 20 75 73 65 73 20 61 20 74 65 78 74 20 73 6f  n uses a text so
a590: 72 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74  rt order, then t
a5a0: 68 65 0a 2a 2a 20 50 33 20 73 74 72 69 6e 67 20  he.** P3 string 
a5b0: 69 73 20 27 74 27 2e 20 20 53 65 65 20 74 68 65  is 't'.  See the
a5c0: 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 20 6f   OP_MakeIdxKey o
a5d0: 70 63 6f 64 65 20 64 6f 63 75 6d 65 6e 74 61 74  pcode documentat
a5e0: 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 64 64 69 74  ion for.** addit
a5f0: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
a600: 6e 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65  n.  See also the
a610: 20 73 71 6c 69 74 65 41 64 64 4b 65 79 54 79 70   sqliteAddKeyTyp
a620: 65 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  e() routine..*/.
a630: 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 49 64  void sqliteAddId
a640: 78 4b 65 79 54 79 70 65 28 56 64 62 65 20 2a 76  xKeyType(Vdbe *v
a650: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
a660: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20    char *zType;. 
a670: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
a680: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61 73 73 65  int i, n;.  asse
a690: 72 74 28 20 70 49 64 78 21 3d 30 20 26 26 20 70  rt( pIdx!=0 && p
a6a0: 49 64 78 2d 3e 70 54 61 62 6c 65 21 3d 30 20 29  Idx->pTable!=0 )
a6b0: 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 64 78 2d  ;.  pTab = pIdx-
a6c0: 3e 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 70  >pTable;.  n = p
a6d0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Idx->nColumn;.  
a6e0: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 4d 61  zType = sqliteMa
a6f0: 6c 6c 6f 63 52 61 77 28 20 6e 2b 31 20 29 3b 0a  llocRaw( n+1 );.
a700: 20 20 69 66 28 20 7a 54 79 70 65 3d 3d 30 20 29    if( zType==0 )
a710: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
a720: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
a730: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49     int iCol = pI
a740: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
a750: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f  .    assert( iCo
a760: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
a770: 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 69  b->nCol );.    i
a780: 66 28 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  f( (pTab->aCol[i
a790: 43 6f 6c 5d 2e 73 6f 72 74 4f 72 64 65 72 20 26  Col].sortOrder &
a7a0: 20 53 51 4c 49 54 45 5f 53 4f 5f 54 59 50 45 4d   SQLITE_SO_TYPEM
a7b0: 41 53 4b 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  ASK)==SQLITE_SO_
a7c0: 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 7a 54  TEXT ){.      zT
a7d0: 79 70 65 5b 69 5d 20 3d 20 27 74 27 3b 0a 20 20  ype[i] = 't';.  
a7e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
a7f0: 54 79 70 65 5b 69 5d 20 3d 20 27 6e 27 3b 0a 20  Type[i] = 'n';. 
a800: 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 54 79 70 65     }.  }.  zType
a810: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  [n] = 0;.  sqlit
a820: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
a830: 20 2d 31 2c 20 7a 54 79 70 65 2c 20 6e 29 3b 0a   -1, zType, n);.
a840: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 79    sqliteFree(zTy
a850: 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  pe);.}../*.** Th
a860: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
a870: 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
a880: 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79   new foreign key
a890: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a   on the table.**
a8a0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
a8b0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
a8c0: 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69  pFromCol determi
a8d0: 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e  nes which column
a8e0: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72  s.** in the curr
a8f0: 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20  ent table point 
a900: 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  to the foreign k
a910: 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c  ey.  If pFromCol
a920: 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e  ==0 then.** conn
a930: 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74  ect the key to t
a940: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69  he last column i
a950: 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73  nserted.  pTo is
a960: 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20   the name of.** 
a970: 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72  the table referr
a980: 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69  ed to.  pToCol i
a990: 73 20 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c  s a list of tabl
a9a0: 65 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 0a  es in the other.
a9b0: 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20 74 68 61  ** pTo table tha
a9c0: 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  t the foreign ke
a9d0: 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c  y points to.  fl
a9e0: 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ags contains all
a9f0: 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
aa00: 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69  about the confli
aa10: 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
aa20: 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69  gorithms specifi
aa30: 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20  ed.** in the ON 
aa40: 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54  DELETE, ON UPDAT
aa50: 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20  E and ON INSERT 
aa60: 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  clauses..**.** A
aa70: 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65  n FKey structure
aa80: 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
aa90: 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
aaa0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  le currently.** 
aab0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
aac0: 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  on in the pParse
aad0: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c  ->pNewTable fiel
aae0: 64 2e 20 20 54 68 65 20 6e 65 77 20 46 4b 65 79  d.  The new FKey
aaf0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e 6b 65  .** is not linke
ab00: 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b 65 79  d into db->aFKey
ab10: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 2d   at this point -
ab20: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 68   that does not h
ab30: 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73  appen.** until s
ab40: 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 29 2e  qliteEndTable().
ab50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69  .**.** The forei
ab60: 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f  gn key is set fo
ab70: 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63  r IMMEDIATE proc
ab80: 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65  essing.  A subse
ab90: 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f  quent call.** to
aba0: 20 73 71 6c 69 74 65 44 65 66 65 72 46 6f 72 65   sqliteDeferFore
abb0: 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63  ignKey() might c
abc0: 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45  hange this to DE
abd0: 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20  FERRED..*/.void 
abe0: 73 71 6c 69 74 65 43 72 65 61 74 65 46 6f 72 65  sqliteCreateFore
abf0: 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20  ignKey(.  Parse 
ac00: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
ac10: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
ac20: 74 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70  t */.  IdList *p
ac30: 46 72 6f 6d 43 6f 6c 2c 20 20 20 20 2f 2a 20 43  FromCol,    /* C
ac40: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74  olumns in this t
ac50: 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20  able that point 
ac60: 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  to other table *
ac70: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20  /.  Token *pTo, 
ac80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
ac90: 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61   of the other ta
aca0: 62 6c 65 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20  ble */.  IdList 
acb0: 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 20 20 2f 2a  *pToCol,      /*
acc0: 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   Columns in the 
acd0: 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
ace0: 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
acf0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63        /* Conflic
ad00: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
ad10: 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20  orithms. */.){. 
ad20: 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72   Table *p = pPar
ad30: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
ad40: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e   int nByte;.  in
ad50: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  t i;.  int nCol;
ad60: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 46 4b  .  char *z;.  FK
ad70: 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 0a  ey *pFKey = 0;..
ad80: 20 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30    assert( pTo!=0
ad90: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c   );.  if( p==0 |
ada0: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
adb0: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
adc0: 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
add0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  ){.    int iCol 
ade0: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20  = p->nCol-1;.   
adf0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 67 6f   if( iCol<0 ) go
ae00: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69  to fk_end;.    i
ae10: 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
ae20: 43 6f 6c 2d 3e 6e 49 64 21 3d 31 20 29 7b 0a 20  Col->nId!=1 ){. 
ae30: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53       sqliteSetNS
ae40: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
ae50: 45 72 72 4d 73 67 2c 20 22 66 6f 72 65 69 67 6e  ErrMsg, "foreign
ae60: 20 6b 65 79 20 6f 6e 20 22 2c 20 2d 31 2c 0a 20   key on ", -1,. 
ae70: 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b          p->aCol[
ae80: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 2d 31 2c  iCol].zName, -1,
ae90: 20 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f   .         " sho
aea0: 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  uld reference on
aeb0: 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66  ly one column of
aec0: 20 74 61 62 6c 65 20 22 2c 20 2d 31 2c 0a 20 20   table ", -1,.  
aed0: 20 20 20 20 20 20 20 70 54 6f 2d 3e 7a 2c 20 70         pTo->z, p
aee0: 54 6f 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 20  To->n, 0);.     
aef0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
af00: 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  .      goto fk_e
af10: 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43  nd;.    }.    nC
af20: 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ol = 1;.  }else 
af30: 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54  if( pToCol && pT
af40: 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 70 46 72 6f 6d  oCol->nId!=pFrom
af50: 43 6f 6c 2d 3e 6e 49 64 20 29 7b 0a 20 20 20 20  Col->nId ){.    
af60: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
af70: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
af80: 2c 20 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62  , .        "numb
af90: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
afa0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65   foreign key doe
afb0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
afc0: 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20  number of ".    
afd0: 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20      "columns in 
afe0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
aff0: 61 62 6c 65 22 2c 20 28 63 68 61 72 2a 29 30 29  able", (char*)0)
b000: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
b010: 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 66  rr++;.    goto f
b020: 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  k_end;.  }else{.
b030: 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d      nCol = pFrom
b040: 43 6f 6c 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 20 20  Col->nId;.  }.  
b050: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
b060: 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69  pFKey) + nCol*si
b070: 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
b080: 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
b090: 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
b0a0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
b0b0: 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 49 64 3b 20 69  i<pToCol->nId; i
b0c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  ++){.      nByte
b0d0: 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f   += strlen(pToCo
b0e0: 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b  l->a[i].zName) +
b0f0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
b100: 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d 61  pFKey = sqliteMa
b110: 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20  lloc( nByte );. 
b120: 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 20   if( pFKey==0 ) 
b130: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 70  goto fk_end;.  p
b140: 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b  FKey->pFrom = p;
b150: 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  .  pFKey->pNextF
b160: 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a  rom = p->pFKey;.
b170: 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46    z = (char*)&pF
b180: 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d  Key[1];.  pFKey-
b190: 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75 63 74 20  >aCol = (struct 
b1a0: 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20  sColMap*)z;.  z 
b1b0: 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  += sizeof(struct
b1c0: 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a   sColMap)*nCol;.
b1d0: 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a    pFKey->zTo = z
b1e0: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54  ;.  memcpy(z, pT
b1f0: 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20  o->z, pTo->n);. 
b200: 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a   z[pTo->n] = 0;.
b210: 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b    z += pTo->n+1;
b220: 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54  .  pFKey->pNextT
b230: 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e  o = 0;.  pFKey->
b240: 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69  nCol = nCol;.  i
b250: 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
b260: 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f  {.    pFKey->aCo
b270: 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e  l[0].iFrom = p->
b280: 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  nCol-1;.  }else{
b290: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
b2a0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
b2b0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
b2c0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f  or(j=0; j<p->nCo
b2d0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
b2e0: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
b2f0: 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  mp(p->aCol[j].zN
b300: 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61  ame, pFromCol->a
b310: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
b320: 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79  .          pFKey
b330: 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20  ->aCol[i].iFrom 
b340: 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = j;.          b
b350: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
b360: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
b370: 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a  ( j>=p->nCol ){.
b380: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
b390: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
b3a0: 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e 6b 6e 6f  >zErrMsg, "unkno
b3b0: 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 22 2c 20 0a  wn column \"", .
b3c0: 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43            pFromC
b3d0: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  ol->a[i].zName, 
b3e0: 22 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  "\" in foreign k
b3f0: 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20  ey definition", 
b400: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
b410: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
b420: 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  +;.        goto 
b430: 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  fk_end;.      }.
b440: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
b450: 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
b460: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
b470: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ++){.      int n
b480: 20 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c   = strlen(pToCol
b490: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
b4a0: 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c       pFKey->aCol
b4b0: 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20  [i].zCol = z;.  
b4c0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54      memcpy(z, pT
b4d0: 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
b4e0: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d  , n);.      z[n]
b4f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d   = 0;.      z +=
b500: 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n+1;.    }.  }.
b510: 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
b520: 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79  red = 0;.  pFKey
b530: 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20 66  ->deleteConf = f
b540: 6c 61 67 73 20 26 20 30 78 66 66 3b 0a 20 20 70  lags & 0xff;.  p
b550: 46 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66  FKey->updateConf
b560: 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 38 20 29   = (flags >> 8 )
b570: 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79   & 0xff;.  pFKey
b580: 2d 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28  ->insertConf = (
b590: 66 6c 61 67 73 20 3e 3e 20 31 36 20 29 20 26 20  flags >> 16 ) & 
b5a0: 30 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b  0xff;..  /* Link
b5b0: 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
b5c0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73   to the table as
b5d0: 20 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a   the last step..
b5e0: 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20    */.  p->pFKey 
b5f0: 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79  = pFKey;.  pFKey
b600: 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20   = 0;..fk_end:. 
b610: 20 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65   sqliteFree(pFKe
b620: 79 29 3b 0a 20 20 73 71 6c 69 74 65 49 64 4c 69  y);.  sqliteIdLi
b630: 73 74 44 65 6c 65 74 65 28 70 46 72 6f 6d 43 6f  stDelete(pFromCo
b640: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 49 64 4c 69  l);.  sqliteIdLi
b650: 73 74 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29  stDelete(pToCol)
b660: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
b670: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
b680: 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41  d when an INITIA
b690: 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72  LLY IMMEDIATE or
b6a0: 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
b6b0: 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73  RED.** clause is
b6c0: 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66   seen as part of
b6d0: 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64   a foreign key d
b6e0: 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20  efinition.  The 
b6f0: 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61  isDeferred.** pa
b700: 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72  rameter is 1 for
b710: 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
b720: 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e  RED and 0 for IN
b730: 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
b740: 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69  E..** The behavi
b750: 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  or of the most r
b760: 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20  ecently created 
b770: 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61  foreign key is a
b780: 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72  djusted.** accor
b790: 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  dingly..*/.void 
b7a0: 73 71 6c 69 74 65 44 65 66 65 72 46 6f 72 65 69  sqliteDeferForei
b7b0: 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61  gnKey(Parse *pPa
b7c0: 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72  rse, int isDefer
b7d0: 72 65 64 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  red){.  Table *p
b7e0: 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b  Tab;.  FKey *pFK
b7f0: 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20  ey;.  if( (pTab 
b800: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
b810: 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65  ble)==0 || (pFKe
b820: 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29  y = pTab->pFKey)
b830: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
b840: 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
b850: 64 20 3d 20 69 73 44 65 66 65 72 72 65 64 3b 0a  d = isDeferred;.
b860: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
b870: 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20  a new index for 
b880: 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70  an SQL table.  p
b890: 49 6e 64 65 78 20 69 73 20 74 68 65 20 6e 61 6d  Index is the nam
b8a0: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a  e of the index .
b8b0: 2a 2a 20 61 6e 64 20 70 54 61 62 6c 65 20 69 73  ** and pTable is
b8c0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
b8d0: 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
b8e0: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42  o be indexed.  B
b8f0: 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20  oth will .** be 
b900: 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61  NULL for a prima
b910: 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64  ry key or an ind
b920: 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74  ex that is creat
b930: 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a  ed to satisfy a.
b940: 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  ** UNIQUE constr
b950: 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65  aint.  If pTable
b960: 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20   and pIndex are 
b970: 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65  NULL, use pParse
b980: 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61  ->pNewTable.** a
b990: 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  s the table to b
b9a0: 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72  e indexed.  pPar
b9b0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73  se->pNewTable is
b9c0: 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73   a table that is
b9d0: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65  .** currently be
b9e0: 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
b9f0: 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  by a CREATE TABL
ba00: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
ba10: 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  ** pList is a li
ba20: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
ba30: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c   be indexed.  pL
ba40: 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ist will be NULL
ba50: 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61   if this.** is a
ba60: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
ba70: 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e  unique-constrain
ba80: 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
ba90: 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  cent column adde
baa0: 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c  d.** to the tabl
bab0: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
bac0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
bad0: 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
bae0: 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50  CreateIndex(.  P
baf0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
bb00: 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  /* All informati
bb10: 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61  on about this pa
bb20: 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  rse */.  Token *
bb30: 70 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d  pName,    /* Nam
bb40: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  e of the index. 
bb50: 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
bb60: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 6c    SrcList *pTabl
bb70: 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  e, /* Name of th
bb80: 65 20 74 61 62 6c 65 20 74 6f 20 69 6e 64 65 78  e table to index
bb90: 2e 20 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70  .  Use pParse->p
bba0: 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f  NewTable if 0 */
bbb0: 0a 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  .  IdList *pList
bbc0: 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66  ,   /* A list of
bbd0: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
bbe0: 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
bbf0: 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20  onError,     /* 
bc00: 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e  OE_Abort, OE_Ign
bc10: 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c  ore, OE_Replace,
bc20: 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20   or OE_None */. 
bc30: 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20   Token *pStart, 
bc40: 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
bc50: 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
bc60: 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  s a CREATE TABLE
bc70: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
bc80: 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20  Token *pEnd     
bc90: 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74   /* The ")" that
bca0: 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41   closes the CREA
bcb0: 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
bcc0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  nt */.){.  Table
bcd0: 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54   *pTab;     /* T
bce0: 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
bcf0: 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
bd00: 49 6e 64 65 78 3b 20 20 20 2f 2a 20 54 68 65 20  Index;   /* The 
bd10: 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61  index to be crea
bd20: 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ted */.  char *z
bd30: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Name = 0;.  int 
bd40: 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75  i, j;.  Token nu
bd50: 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b 65  llId;    /* Fake
bd60: 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d   token for an em
bd70: 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20  pty ID list */. 
bd80: 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20   DbFixer sFix;  
bd90: 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69    /* For assigni
bda0: 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ng database name
bdb0: 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20  s to pTable */. 
bdc0: 20 69 6e 74 20 69 73 54 65 6d 70 3b 20 20 20 20   int isTemp;    
bdd0: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
bde0: 74 65 6d 70 6f 72 61 72 79 20 69 6e 64 65 78 20  temporary index 
bdf0: 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  */.  sqlite *db 
be00: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
be10: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
be20: 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c  r || sqlite_mall
be30: 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f  oc_failed ) goto
be40: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
be50: 65 78 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  ex;.  if( pParse
be60: 2d 3e 69 6e 69 74 46 6c 61 67 20 0a 20 20 20 20  ->initFlag .    
be70: 20 26 26 20 73 71 6c 69 74 65 46 69 78 49 6e 69   && sqliteFixIni
be80: 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
be90: 20 70 50 61 72 73 65 2d 3e 69 44 62 2c 20 22 69   pParse->iDb, "i
bea0: 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 0a 20 20  ndex", pName).  
beb0: 20 20 20 26 26 20 73 71 6c 69 74 65 46 69 78 53     && sqliteFixS
bec0: 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54  rcList(&sFix, pT
bed0: 61 62 6c 65 29 0a 20 20 29 7b 0a 20 20 20 20 67  able).  ){.    g
bee0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
bef0: 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
bf00: 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74  .  ** Find the t
bf10: 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
bf20: 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74  be indexed.  Ret
bf30: 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74  urn early if not
bf40: 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69   found..  */.  i
bf50: 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a  f( pTable!=0 ){.
bf60: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
bf70: 65 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e!=0 );.    asse
bf80: 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 53 72 63  rt( pTable->nSrc
bf90: 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61 62 20  ==1 );.    pTab 
bfa0: 3d 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74  =  sqliteSrcList
bfb0: 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
bfc0: 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  Table);.  }else{
bfd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
bfe0: 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  me==0 );.    pTa
bff0: 62 20 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  b =  pParse->pNe
c000: 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  wTable;.  }.  if
c010: 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61  ( pTab==0 || pPa
c020: 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
c030: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
c040: 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  ex;.  if( pTab->
c050: 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
c060: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
c070: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
c080: 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62  , "table ", pTab
c090: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 22  ->zName,.      "
c0a0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
c0b0: 78 65 64 22 2c 20 28 63 68 61 72 2a 29 30 29 3b  xed", (char*)0);
c0c0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
c0d0: 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  r++;.    goto ex
c0e0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
c0f0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d  .  }.  if( pTab-
c100: 3e 69 44 62 3e 3d 32 20 26 26 20 70 50 61 72 73  >iDb>=2 && pPars
c110: 65 2d 3e 69 6e 69 74 46 6c 61 67 3d 3d 30 20 29  e->initFlag==0 )
c120: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
c130: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
c140: 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22  ErrMsg, "table "
c150: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a  , pTab->zName, .
c160: 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20        " may not 
c170: 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 64 64  have indices add
c180: 65 64 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ed", (char*)0);.
c190: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
c1a0: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ++;.    goto exi
c1b0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
c1c0: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e    }.  if( pTab->
c1d0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
c1e0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
c1f0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
c200: 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20   "views may not 
c210: 62 65 20 69 6e 64 65 78 65 64 22 2c 20 28 63 68  be indexed", (ch
c220: 61 72 2a 29 30 29 3b 0a 20 20 20 20 70 50 61 72  ar*)0);.    pPar
c230: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
c240: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
c250: 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 73  _index;.  }.  is
c260: 54 65 6d 70 20 3d 20 70 54 61 62 2d 3e 69 44 62  Temp = pTab->iDb
c270: 3d 3d 31 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ==1;..  /*.  ** 
c280: 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  Find the name of
c290: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b   the index.  Mak
c2a0: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
c2b0: 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74  not already anot
c2c0: 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  her.  ** index o
c2d0: 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  r table with the
c2e0: 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20   same name.  .  
c2f0: 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
c300: 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65  n:  If we are re
c310: 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ading the names 
c320: 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64  of permanent ind
c330: 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ices from the.  
c340: 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
c350: 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20   table (because 
c360: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
c370: 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73  ss changed the s
c380: 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20  chema) and.  ** 
c390: 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
c3a0: 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20   names collides 
c3b0: 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
c3c0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
c3d0: 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78  le or.  ** index
c3e0: 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63  , then we will c
c3f0: 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65  ontinue to proce
c400: 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  ss this index.. 
c410: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d   **.  ** If pNam
c420: 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
c430: 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64  at we are.  ** d
c440: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72  ealing with a pr
c450: 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49  imary key or UNI
c460: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
c470: 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65   We have to inve
c480: 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20  nt our.  ** own 
c490: 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
c4a0: 20 70 4e 61 6d 65 20 26 26 20 21 70 50 61 72 73   pName && !pPars
c4b0: 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20  e->initFlag ){. 
c4c0: 20 20 20 49 6e 64 65 78 20 2a 70 49 53 61 6d 65     Index *pISame
c4d0: 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 6e 6f 74  Name;    /* Anot
c4e0: 68 65 72 20 69 6e 64 65 78 20 77 69 74 68 20 74  her index with t
c4f0: 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a  he same name */.
c500: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 53 61 6d      Table *pTSam
c510: 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74  eName;    /* A t
c520: 61 62 6c 65 20 77 69 74 68 20 73 61 6d 65 20 6e  able with same n
c530: 61 6d 65 20 61 73 20 74 68 65 20 69 6e 64 65 78  ame as the index
c540: 20 2a 2f 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   */.    zName = 
c550: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e  sqliteStrNDup(pN
c560: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
c570: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
c580: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
c590: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
c5a0: 20 20 69 66 28 20 28 70 49 53 61 6d 65 4e 61 6d    if( (pISameNam
c5b0: 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e  e = sqliteFindIn
c5c0: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  dex(db, zName, 0
c5d0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ))!=0 ){.      s
c5e0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
c5f0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
c600: 20 22 69 6e 64 65 78 20 22 2c 20 7a 4e 61 6d 65   "index ", zName
c610: 2c 20 0a 20 20 20 20 20 20 20 20 20 22 20 61 6c  , .         " al
c620: 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 28  ready exists", (
c630: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
c640: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
c650: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
c660: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
c670: 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 54 53    }.    if( (pTS
c680: 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ameName = sqlite
c690: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
c6a0: 61 6d 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20  ame, 0))!=0 ){. 
c6b0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
c6c0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
c6d0: 72 72 4d 73 67 2c 20 22 74 68 65 72 65 20 69 73  rrMsg, "there is
c6e0: 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65   already a table
c6f0: 20 6e 61 6d 65 64 20 22 2c 0a 20 20 20 20 20 20   named ",.      
c700: 20 20 20 7a 4e 61 6d 65 2c 20 28 63 68 61 72 2a     zName, (char*
c710: 29 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  )0);.      pPars
c720: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
c730: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
c740: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
c750: 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65   }else if( pName
c760: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
c770: 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e  zBuf[30];.    in
c780: 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  t n;.    Index *
c790: 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70  pLoop;.    for(p
c7a0: 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65  Loop=pTab->pInde
c7b0: 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70  x, n=1; pLoop; p
c7c0: 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78  Loop=pLoop->pNex
c7d0: 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70  t, n++){}.    sp
c7e0: 72 69 6e 74 66 28 7a 42 75 66 2c 22 25 64 29 22  rintf(zBuf,"%d)"
c7f0: 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  ,n);.    zName =
c800: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   0;.    sqliteSe
c810: 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20  tString(&zName, 
c820: 22 28 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  "(", pTab->zName
c830: 2c 20 22 20 61 75 74 6f 69 6e 64 65 78 20 22 2c  , " autoindex ",
c840: 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29   zBuf, (char*)0)
c850: 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
c860: 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
c870: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
c880: 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  else{.    zName 
c890: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
c8a0: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
c8b0: 3e 6e 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  >n);.  }..  /* C
c8c0: 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69  heck for authori
c8d0: 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65  zation to create
c8e0: 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a   an index..  */.
c8f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c900: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
c910: 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  N.  {.    const 
c920: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
c930: 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a  aDb[pTab->iDb].z
c940: 4e 61 6d 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  Name;..    asser
c950: 74 28 20 70 54 61 62 2d 3e 69 44 62 3d 3d 70 50  t( pTab->iDb==pP
c960: 61 72 73 65 2d 3e 69 44 62 20 7c 7c 20 69 73 54  arse->iDb || isT
c970: 65 6d 70 20 29 3b 0a 20 20 20 20 69 66 28 20 73  emp );.    if( s
c980: 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70  qliteAuthCheck(p
c990: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
c9a0: 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
c9b0: 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a  LE(isTemp), 0, z
c9c0: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
c9d0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
c9e0: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
c9f0: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
ca00: 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
ca10: 69 73 54 65 6d 70 20 29 20 69 20 3d 20 53 51 4c  isTemp ) i = SQL
ca20: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
ca30: 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
ca40: 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70  qliteAuthCheck(p
ca50: 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c  Parse, i, zName,
ca60: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
ca70: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
ca80: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
ca90: 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
caa0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c  ndif..  /* If pL
cab0: 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73  ist==0, it means
cac0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
cad0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65  s called to make
cae0: 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20   a primary.  ** 
caf0: 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  key out of the l
cb00: 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ast column added
cb10: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e   to the table un
cb20: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
cb30: 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65  ..  ** So create
cb40: 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20   a fake list to 
cb50: 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20  simulate this.. 
cb60: 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   */.  if( pList=
cb70: 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64  =0 ){.    nullId
cb80: 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  .z = pTab->aCol[
cb90: 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e  pTab->nCol-1].zN
cba0: 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  ame;.    nullId.
cbb0: 6e 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c 6c 49  n = strlen(nullI
cbc0: 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  d.z);.    pList 
cbd0: 3d 20 73 71 6c 69 74 65 49 64 4c 69 73 74 41 70  = sqliteIdListAp
cbe0: 70 65 6e 64 28 30 2c 20 26 6e 75 6c 6c 49 64 29  pend(0, &nullId)
cbf0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
cc00: 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
cc10: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
cc20: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c  ..  /* .  ** All
cc30: 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
cc40: 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f  structure. .  */
cc50: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
cc60: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
cc70: 28 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e  (Index) + strlen
cc80: 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20 20  (zName) + 1 +.  
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cca0: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74        sizeof(int
ccb0: 29 2a 70 4c 69 73 74 2d 3e 6e 49 64 20 29 3b 0a  )*pList->nId );.
ccc0: 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20    if( pIndex==0 
ccd0: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
cce0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49 6e 64  te_index;.  pInd
ccf0: 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28  ex->aiColumn = (
cd00: 69 6e 74 2a 29 26 70 49 6e 64 65 78 5b 31 5d 3b  int*)&pIndex[1];
cd10: 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
cd20: 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65   = (char*)&pInde
cd30: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73  x->aiColumn[pLis
cd40: 74 2d 3e 6e 49 64 5d 3b 0a 20 20 73 74 72 63 70  t->nId];.  strcp
cd50: 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  y(pIndex->zName,
cd60: 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65   zName);.  pInde
cd70: 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
cd80: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ;.  pIndex->nCol
cd90: 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 49 64  umn = pList->nId
cda0: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ;.  pIndex->onEr
cdb0: 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20  ror = onError;. 
cdc0: 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
cdd0: 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20  ex = pName==0;. 
cde0: 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 3d 20 69   pIndex->iDb = i
cdf0: 73 54 65 6d 70 20 3f 20 31 20 3a 20 70 50 61 72  sTemp ? 1 : pPar
ce00: 73 65 2d 3e 69 44 62 3b 0a 0a 20 20 2f 2a 20 53  se->iDb;..  /* S
ce10: 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  can the names of
ce20: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
ce30: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
ce40: 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a  indexed and.  **
ce50: 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e   load the column
ce60: 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68   indices into th
ce70: 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  e Index structur
ce80: 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72  e.  Report an er
ce90: 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  ror.  ** if any 
cea0: 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f  column is not fo
ceb0: 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  und..  */.  for(
cec0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
ced0: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  d; i++){.    for
cee0: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
cef0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
cf00: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
cf10: 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
cf20: 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ame, pTab->aCol[
cf30: 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  j].zName)==0 ) b
cf40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
cf50: 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f  if( j>=pTab->nCo
cf60: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
cf70: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
cf80: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61  se->zErrMsg, "ta
cf90: 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  ble ", pTab->zNa
cfa0: 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 22 20 68  me, .        " h
cfb0: 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d  as no column nam
cfc0: 65 64 20 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  ed ", pList->a[i
cfd0: 5d 2e 7a 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29  ].zName, (char*)
cfe0: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
cff0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
d000: 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65  sqliteFree(pInde
d010: 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  x);.      goto e
d020: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
d030: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
d040: 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
d050: 3d 20 6a 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  = j;.  }..  /* L
d060: 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65  ink the new Inde
d070: 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  x structure to i
d080: 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20  ts table and to 
d090: 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69  the other.  ** i
d0a0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
d0b0: 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20  e structures. . 
d0c0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
d0d0: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
d0e0: 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
d0f0: 70 20 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e  p = sqliteHashIn
d100: 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 49  sert(&db->aDb[pI
d110: 6e 64 65 78 2d 3e 69 44 62 5d 2e 69 64 78 48 61  ndex->iDb].idxHa
d120: 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  sh, .           
d130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
d140: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72  ndex->zName, str
d150: 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  len(pIndex->zNam
d160: 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20  e)+1, pIndex);. 
d170: 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
d180: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e    assert( p==pIn
d190: 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  dex );  /* Mallo
d1a0: 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
d1b0: 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ed */.      sqli
d1c0: 74 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a  teFree(pIndex);.
d1d0: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
d1e0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
d1f0: 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67    }.    db->flag
d200: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
d210: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a  rnChanges;.  }..
d220: 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67    /* When adding
d230: 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65   an index to the
d240: 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73   list of indices
d250: 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61   for a table, ma
d260: 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c  ke.  ** sure all
d270: 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64   indices labeled
d280: 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65   OE_Replace come
d290: 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65   after all those
d2a0: 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45   labeled.  ** OE
d2b0: 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69  _Ignore.  This i
d2c0: 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20  s necessary for 
d2d0: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
d2e0: 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a  ation of UPDATE.
d2f0: 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e    ** and INSERT.
d300: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 6e 45 72  .  */.  if( onEr
d310: 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
d320: 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d  || pTab->pIndex=
d330: 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 70 54 61  =0.       || pTa
d340: 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  b->pIndex->onErr
d350: 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b  or==OE_Replace){
d360: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65  .    pIndex->pNe
d370: 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  xt = pTab->pInde
d380: 78 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70 49 6e  x;.    pTab->pIn
d390: 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
d3a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78  }else{.    Index
d3b0: 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d   *pOther = pTab-
d3c0: 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 77 68 69  >pIndex;.    whi
d3d0: 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  le( pOther->pNex
d3e0: 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65  t && pOther->pNe
d3f0: 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  xt->onError!=OE_
d400: 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20  Replace ){.     
d410: 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72   pOther = pOther
d420: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
d430: 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
d440: 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
d450: 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e  ;.    pOther->pN
d460: 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  ext = pIndex;.  
d470: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 69  }..  /* If the i
d480: 6e 69 74 46 6c 61 67 20 69 73 20 31 20 69 74 20  nitFlag is 1 it 
d490: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
d4a0: 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66  ding the SQL off
d4b0: 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74   the.  ** "sqlit
d4c0: 65 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20  e_master" table 
d4d0: 6f 6e 20 74 68 65 20 64 69 73 6b 2e 20 20 53 6f  on the disk.  So
d4e0: 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f   do not write to
d4f0: 20 74 68 65 20 64 69 73 6b 0a 20 20 2a 2a 20 61   the disk.  ** a
d500: 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74  gain.  Extract t
d510: 68 65 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  he table number 
d520: 66 72 6f 6d 20 74 68 65 20 70 50 61 72 73 65 2d  from the pParse-
d530: 3e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 0a  >newTnum field..
d540: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
d550: 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26 20 70  e->initFlag && p
d560: 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20  Table!=0 ){.    
d570: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 70  pIndex->tnum = p
d580: 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a  Parse->newTnum;.
d590: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
d5a0: 20 69 6e 69 74 46 6c 61 67 20 69 73 20 30 20 74   initFlag is 0 t
d5b0: 68 65 6e 20 63 72 65 61 74 65 20 74 68 65 20 69  hen create the i
d5c0: 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54  ndex on disk.  T
d5d0: 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65  his.  ** involve
d5e0: 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e  s writing the in
d5f0: 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73  dex into the mas
d600: 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69  ter table and fi
d610: 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a  lling in the.  *
d620: 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65  * index with the
d630: 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63   current table c
d640: 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20  ontents..  **.  
d650: 2a 2a 20 54 68 65 20 69 6e 69 74 46 6c 61 67 20  ** The initFlag 
d660: 69 73 20 30 20 77 68 65 6e 20 74 68 65 20 75 73  is 0 when the us
d670: 65 72 20 66 69 72 73 74 20 65 6e 74 65 72 73 20  er first enters 
d680: 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a  a CREATE INDEX .
d690: 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 54    ** command.  T
d6a0: 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31  he initFlag is 1
d6b0: 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65   when a database
d6c0: 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a   is opened and .
d6d0: 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45    ** CREATE INDE
d6e0: 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  X statements are
d6f0: 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65   read out of the
d700: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20   master table.  
d710: 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74  In.  ** the latt
d720: 65 72 20 63 61 73 65 20 74 68 65 20 69 6e 64 65  er case the inde
d730: 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
d740: 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20   on disk, which 
d750: 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64  is why.  ** we d
d760: 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63  on't want to rec
d770: 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20  reate it..  **. 
d780: 20 2a 2a 20 49 66 20 70 54 61 62 6c 65 3d 3d 30   ** If pTable==0
d790: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69   it means this i
d7a0: 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65  ndex is generate
d7b0: 64 20 61 73 20 61 20 70 72 69 6d 61 72 79 20 6b  d as a primary k
d7c0: 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55  ey.  ** or UNIQU
d7d0: 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20  E constraint of 
d7e0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
d7f0: 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65  tatement.  Since
d800: 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20   the table.  ** 
d810: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72  has just been cr
d820: 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69  eated, it contai
d830: 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74  ns no data and t
d840: 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c  he index initial
d850: 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65  ization.  ** ste
d860: 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64  p can be skipped
d870: 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
d880: 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c  ( pParse->initFl
d890: 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ag==0 ){.    int
d8a0: 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b   n;.    Vdbe *v;
d8b0: 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31 2c 20 6c  .    int lbl1, l
d8c0: 62 6c 32 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  bl2;.    int i;.
d8d0: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20      int addr;.. 
d8e0: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74     v = sqliteGet
d8f0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
d900: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
d910: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
d920: 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 54 61  dex;.    if( pTa
d930: 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ble!=0 ){.      
d940: 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65  sqliteBeginWrite
d950: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
d960: 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20  , 0, isTemp);.  
d970: 20 20 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61      sqliteOpenMa
d980: 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69 73 54  sterTable(v, isT
d990: 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  emp);.    }.    
d9a0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
d9b0: 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20  v, OP_NewRecno, 
d9c0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
d9d0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
d9e0: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
d9f0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
da00: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 69  angeP3(v, -1, "i
da10: 6e 64 65 78 22 2c 20 50 33 5f 53 54 41 54 49 43  ndex", P3_STATIC
da20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
da30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
da40: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
da50: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
da60: 50 33 28 76 2c 20 2d 31 2c 20 70 49 6e 64 65 78  P3(v, -1, pIndex
da70: 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  ->zName, strlen(
da80: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b  pIndex->zName));
da90: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
daa0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
dab0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  g, 0, 0);.    sq
dac0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
dad0: 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e  (v, -1, pTab->zN
dae0: 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
daf0: 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69  .    addr = sqli
db00: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
db10: 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 30  P_CreateIndex, 0
db20: 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 73  , isTemp);.    s
db30: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
db40: 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72  3(v, addr, (char
db50: 2a 29 26 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  *)&pIndex->tnum,
db60: 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20   P3_POINTER);.  
db70: 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
db80: 20 30 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62   0;.    if( pTab
db90: 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  le ){.      sqli
dba0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
dbb0: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
dbc0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
dbd0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
dbe0: 72 2c 20 69 73 54 65 6d 70 2c 20 30 29 3b 0a 20  r, isTemp, 0);. 
dbf0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
dc00: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  ddOp(v, OP_OpenW
dc10: 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  rite, 1, 0);.   
dc20: 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71   }.    addr = sq
dc30: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
dc40: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
dc50: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 72  );.    if( pStar
dc60: 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20  t && pEnd ){.   
dc70: 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64     n = Addr(pEnd
dc80: 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 53 74 61  ->z) - Addr(pSta
dc90: 72 74 2d 3e 7a 29 20 2b 20 31 3b 0a 20 20 20 20  rt->z) + 1;.    
dca0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
dcb0: 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70 53  geP3(v, addr, pS
dcc0: 74 61 72 74 2d 3e 7a 2c 20 6e 29 3b 0a 20 20 20  tart->z, n);.   
dcd0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62   }.    sqliteVdb
dce0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
dcf0: 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a  eRecord, 5, 0);.
dd00: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
dd10: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74  dOp(v, OP_PutInt
dd20: 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Key, 0, 0);.    
dd30: 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20  if( pTable ){.  
dd40: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
dd50: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
dd60: 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20 30 29  r, pTab->iDb, 0)
dd70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
dd80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
dd90: 65 6e 52 65 61 64 2c 20 32 2c 20 70 54 61 62 2d  enRead, 2, pTab-
dda0: 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 73 71  >tnum);.      sq
ddb0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
ddc0: 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e  (v, -1, pTab->zN
ddd0: 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
dde0: 0a 20 20 20 20 20 20 6c 62 6c 32 20 3d 20 73 71  .      lbl2 = sq
ddf0: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
de00: 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
de10: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
de20: 50 5f 52 65 77 69 6e 64 2c 20 32 2c 20 6c 62 6c  P_Rewind, 2, lbl
de30: 32 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d  2);.      lbl1 =
de40: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
de50: 28 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20 32 2c  (v, OP_Recno, 2,
de60: 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   0);.      for(i
de70: 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43  =0; i<pIndex->nC
de80: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
de90: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
dea0: 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
deb0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
dec0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43   pTab->iPKey==iC
ded0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ol ){.          
dee0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
def0: 76 2c 20 4f 50 5f 44 75 70 2c 20 69 2c 20 30 29  v, OP_Dup, i, 0)
df00: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
df10: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
df20: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
df30: 5f 43 6f 6c 75 6d 6e 2c 20 32 2c 20 69 43 6f 6c  _Column, 2, iCol
df40: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
df50: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
df60: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
df70: 5f 4d 61 6b 65 49 64 78 4b 65 79 2c 20 70 49 6e  _MakeIdxKey, pIn
df80: 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 30 29  dex->nColumn, 0)
df90: 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
dfa0: 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29  file_format>=4 )
dfb0: 20 73 71 6c 69 74 65 41 64 64 49 64 78 4b 65 79   sqliteAddIdxKey
dfc0: 54 79 70 65 28 76 2c 20 70 49 6e 64 65 78 29 3b  Type(v, pIndex);
dfd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
dfe0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
dff0: 50 75 74 2c 20 31 2c 20 70 49 6e 64 65 78 2d 3e  Put, 1, pIndex->
e000: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
e010: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
e020: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
e030: 31 2c 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75  1, "indexed colu
e040: 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71  mns are not uniq
e050: 75 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ue", P3_STATIC);
e060: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
e070: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
e080: 74 2c 20 32 2c 20 6c 62 6c 31 29 3b 0a 20 20 20  t, 2, lbl1);.   
e090: 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73     sqliteVdbeRes
e0a0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
e0b0: 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
e0c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e0d0: 43 6c 6f 73 65 2c 20 32 2c 20 30 29 3b 0a 20 20  Close, 2, 0);.  
e0e0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
e0f0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
e100: 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 0);.    }.  
e110: 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20    if( pTable!=0 
e120: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  ){.      if( !is
e130: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
e140: 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b  sqliteChangeCook
e150: 69 65 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 20  ie(db, v);.     
e160: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   }.      sqliteV
e170: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
e180: 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lose, 0, 0);.   
e190: 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74     sqliteEndWrit
e1a0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
e1b0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
e1c0: 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66   /* Clean up bef
e1d0: 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65  ore exiting */.e
e1e0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
e1f0: 3a 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74  :.  sqliteIdList
e200: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
e210: 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65   sqliteSrcListDe
e220: 6c 65 74 65 28 70 54 61 62 6c 65 29 3b 0a 20 20  lete(pTable);.  
e230: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
e240: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
e250: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
e260: 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20  ne will drop an 
e270: 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69  existing named i
e280: 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74  ndex.  This rout
e290: 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  ine.** implement
e2a0: 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58  s the DROP INDEX
e2b0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
e2c0: 6f 69 64 20 73 71 6c 69 74 65 44 72 6f 70 49 6e  oid sqliteDropIn
e2d0: 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
e2e0: 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d  e, SrcList *pNam
e2f0: 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  e){.  Index *pIn
e300: 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  dex;.  Vdbe *v;.
e310: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
e320: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
e330: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
e340: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
e350: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
e360: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
e370: 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70  ->nSrc==1 );.  p
e380: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 46 69  Index = sqliteFi
e390: 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d  ndIndex(db, pNam
e3a0: 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70  e->a[0].zName, p
e3b0: 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
e3c0: 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e  base);.  if( pIn
e3d0: 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  dex==0 ){.    sq
e3e0: 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61  liteErrorMsg(pPa
e3f0: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  rse, "no such in
e400: 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c  dex: %S", pName,
e410: 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78   0);.    goto ex
e420: 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
e430: 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d   }.  if( pIndex-
e440: 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20  >autoIndex ){.  
e450: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
e460: 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
e470: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
e480: 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22  UNIQUE ".      "
e490: 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
e4a0: 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74  onstraint cannot
e4b0: 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29   be dropped", 0)
e4c0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
e4d0: 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
e4e0: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 44    if( pIndex->iD
e4f0: 62 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  b>1 ){.    sqlit
e500: 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
e510: 2c 20 22 63 61 6e 6e 6f 74 20 61 6c 74 65 72 20  , "cannot alter 
e520: 73 63 68 65 6d 61 20 6f 66 20 61 74 74 61 63 68  schema of attach
e530: 65 64 20 22 0a 20 20 20 20 20 20 20 22 64 61 74  ed ".       "dat
e540: 61 62 61 73 65 73 22 2c 20 30 29 3b 0a 20 20 20  abases", 0);.   
e550: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
e560: 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64  index;.  }.#ifnd
e570: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e580: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
e590: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20  .    int code = 
e5a0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45  SQLITE_DROP_INDE
e5b0: 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  X;.    Table *pT
e5c0: 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61  ab = pIndex->pTa
e5d0: 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ble;.    const c
e5e0: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
e5f0: 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e  Db[pIndex->iDb].
e600: 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  zName;.    const
e610: 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43   char *zTab = SC
e620: 48 45 4d 41 5f 54 41 42 4c 45 28 70 49 6e 64 65  HEMA_TABLE(pInde
e630: 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 69 66 28  x->iDb);.    if(
e640: 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b   sqliteAuthCheck
e650: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
e660: 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c  DELETE, zTab, 0,
e670: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
e680: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
e690: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
e6a0: 66 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 29  f( pIndex->iDb )
e6b0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
e6c0: 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ROP_TEMP_INDEX;.
e6d0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75      if( sqliteAu
e6e0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
e6f0: 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  code, pIndex->zN
e700: 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
e710: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
e720: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
e730: 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
e740: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
e750: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
e760: 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61  move the index a
e770: 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  nd from the mast
e780: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20  er table */.  v 
e790: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
e7a0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
e7b0: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56   ){.    static V
e7c0: 64 62 65 4f 70 20 64 72 6f 70 49 6e 64 65 78 5b  dbeOp dropIndex[
e7d0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
e7e0: 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20  _Rewind,     0, 
e7f0: 41 44 44 52 28 39 29 2c 20 30 7d 2c 20 0a 20 20  ADDR(9), 0}, .  
e800: 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c      { OP_String,
e810: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
e820: 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20   0}, /* 1 */.   
e830: 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65     { OP_MemStore
e840: 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20  ,   1, 1,       
e850: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d  0},.      { OP_M
e860: 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c  emLoad,    1, 0,
e870: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20         0}, /* 3 
e880: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  */.      { OP_Co
e890: 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20  lumn,     0, 1, 
e8a0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
e8b0: 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20 20 20 20  { OP_Eq,        
e8c0: 20 30 2c 20 41 44 44 52 28 38 29 2c 20 30 7d 2c   0, ADDR(8), 0},
e8d0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74  .      { OP_Next
e8e0: 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28  ,       0, ADDR(
e8f0: 33 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  3), 0},.      { 
e900: 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20 30  OP_Goto,       0
e910: 2c 20 41 44 44 52 28 39 29 2c 20 30 7d 2c 0a 20  , ADDR(9), 0},. 
e920: 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65       { OP_Delete
e930: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
e940: 20 20 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20    0}, /* 8 */.  
e950: 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 62 61 73    };.    int bas
e960: 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 42 65  e;..    sqliteBe
e970: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
e980: 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70 49 6e  n(pParse, 0, pIn
e990: 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73  dex->iDb);.    s
e9a0: 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54  qliteOpenMasterT
e9b0: 61 62 6c 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e  able(v, pIndex->
e9c0: 69 44 62 29 3b 0a 20 20 20 20 62 61 73 65 20 3d  iDb);.    base =
e9d0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
e9e0: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
e9f0: 65 28 64 72 6f 70 49 6e 64 65 78 29 2c 20 64 72  e(dropIndex), dr
ea00: 6f 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71  opIndex);.    sq
ea10: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
ea20: 28 76 2c 20 62 61 73 65 2b 31 2c 20 70 49 6e 64  (v, base+1, pInd
ea30: 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ex->zName, 0);. 
ea40: 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69     if( pIndex->i
ea50: 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  Db==0 ){.      s
ea60: 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69  qliteChangeCooki
ea70: 65 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a  e(db, v);.    }.
ea80: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
ea90: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
eaa0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
eab0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
eac0: 50 5f 44 65 73 74 72 6f 79 2c 20 70 49 6e 64 65  P_Destroy, pInde
ead0: 78 2d 3e 74 6e 75 6d 2c 20 70 49 6e 64 65 78 2d  x->tnum, pIndex-
eae0: 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  >iDb);.    sqlit
eaf0: 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  eEndWriteOperati
eb00: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  on(pParse);.  }.
eb10: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65  .  /* Delete the
eb20: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 63 72   in-memory descr
eb30: 69 70 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 69  iption of this i
eb40: 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ndex..  */.  if(
eb50: 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
eb60: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 55  n ){.    sqliteU
eb70: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e  nlinkAndDeleteIn
eb80: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
eb90: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
eba0: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
ebb0: 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 65 78 69  hanges;.  }..exi
ebc0: 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20  t_drop_index:.  
ebd0: 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c  sqliteSrcListDel
ebe0: 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  ete(pName);.}../
ebf0: 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
ec00: 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
ec10: 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20   given IdList.  
ec20: 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c  Create a new IdL
ec30: 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
ec40: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49  e..**.** A new I
ec50: 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  dList is returne
ec60: 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61  d, or NULL if ma
ec70: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
ec80: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 49  .IdList *sqliteI
ec90: 64 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c 69  dListAppend(IdLi
eca0: 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
ecb0: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28   *pToken){.  if(
ecc0: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
ecd0: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d   pList = sqliteM
ece0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64  alloc( sizeof(Id
ecf0: 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
ed00: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
ed10: 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
ed20: 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d  >nAlloc = 0;.  }
ed30: 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49  .  if( pList->nI
ed40: 64 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  d>=pList->nAlloc
ed50: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49   ){.    struct I
ed60: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  dList_item *a;. 
ed70: 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
ed80: 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63   = pList->nAlloc
ed90: 2a 32 20 2b 20 35 3b 0a 20 20 20 20 61 20 3d 20  *2 + 5;.    a = 
eda0: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
edb0: 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e  ist->a, pList->n
edc0: 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 4c 69  Alloc*sizeof(pLi
edd0: 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20  st->a[0]) );.   
ede0: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
edf0: 20 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44     sqliteIdListD
ee00: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
ee10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ee20: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61    }.    pList->a
ee30: 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73   = a;.  }.  mems
ee40: 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69  et(&pList->a[pLi
ee50: 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73 69 7a  st->nId], 0, siz
ee60: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
ee70: 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  );.  if( pToken 
ee80: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a  ){.    char **pz
ee90: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
eea0: 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 3b 0a  st->nId].zName;.
eeb0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
eec0: 72 69 6e 67 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d  ring(pz, pToken-
eed0: 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30  >z, pToken->n, 0
eee0: 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d  );.    if( *pz==
eef0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
ef00: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  eIdListDelete(pL
ef10: 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ist);.      retu
ef20: 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rn 0;.    }else{
ef30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 71  .      sqliteDeq
ef40: 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d  uote(*pz);.    }
ef50: 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e 49  .  }.  pList->nI
ef60: 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  d++;.  return pL
ef70: 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  ist;.}../*.** Ap
ef80: 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65  pend a new table
ef90: 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76   name to the giv
efa0: 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65  en SrcList.  Cre
efb0: 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73  ate a new SrcLis
efc0: 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
efd0: 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
efe0: 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
eff0: 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20  SrcList even if 
f000: 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a  pToken is NULL..
f010: 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c  **.** A new SrcL
f020: 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
f030: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c   or NULL if mall
f040: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a  oc() fails..**.*
f050: 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69  * If pDatabase i
f060: 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d  s not null, it m
f070: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61  eans that the ta
f080: 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f  ble has an optio
f090: 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  nal.** database 
f0a0: 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69  name prefix.  Li
f0b0: 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62  ke this:  "datab
f0c0: 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65  ase.table".  The
f0d0: 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f   pDatabase.** po
f0e0: 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c  ints to the tabl
f0f0: 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70  e name and the p
f100: 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  Table points to 
f110: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
f120: 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73  e..** The SrcLis
f130: 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c  t.a[].zName fiel
f140: 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  d is filled with
f150: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
f160: 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63  which might.** c
f170: 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20  ome from pTable 
f180: 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73  (if pDatabase is
f190: 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70   NULL) or from p
f1a0: 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53  Database.  .** S
f1b0: 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61  rcList.a[].zData
f1c0: 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77  base is filled w
f1d0: 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
f1e0: 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   name from pTabl
f1f0: 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55  e,.** or with NU
f200: 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73  LL if no databas
f210: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a  e is specified..
f220: 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
f230: 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69  ords, if call li
f240: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
f250: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 72 63         sqliteSrc
f260: 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 30  ListAppend(A,B,0
f270: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20  );.**.** Then B 
f280: 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20  is a table name 
f290: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
f2a0: 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69   name is unspeci
f2b0: 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64  fied.  If called
f2c0: 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  .** like this:.*
f2d0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
f2e0: 69 74 65 53 72 63 4c 69 73 74 41 70 70 65 6e 64  iteSrcListAppend
f2f0: 28 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54  (A,B,C);.**.** T
f300: 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62  hen C is the tab
f310: 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73  le name and B is
f320: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
f330: 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a  me..*/.SrcList *
f340: 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41 70 70  sqliteSrcListApp
f350: 65 6e 64 28 53 72 63 4c 69 73 74 20 2a 70 4c 69  end(SrcList *pLi
f360: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  st, Token *pTabl
f370: 65 2c 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62  e, Token *pDatab
f380: 61 73 65 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ase){.  if( pLis
f390: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
f3a0: 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
f3b0: 28 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74  ( sizeof(SrcList
f3c0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
f3d0: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
f3e0: 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
f3f0: 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  loc = 1;.  }.  i
f400: 66 28 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d  f( pList->nSrc>=
f410: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  pList->nAlloc ){
f420: 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  .    SrcList *pN
f430: 65 77 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e  ew;.    pList->n
f440: 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20  Alloc *= 2;.    
f450: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61  pNew = sqliteRea
f460: 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a 20 20 20 20  lloc(pList,.    
f470: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
f480: 66 28 2a 70 4c 69 73 74 29 20 2b 20 28 70 4c 69  f(*pList) + (pLi
f490: 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69  st->nAlloc-1)*si
f4a0: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
f4b0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ) );.    if( pNe
f4c0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  w==0 ){.      sq
f4d0: 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74  liteSrcListDelet
f4e0: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
f4f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
f500: 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77      pList = pNew
f510: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
f520: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
f530: 6e 53 72 63 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  nSrc], 0, sizeof
f540: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
f550: 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
f560: 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d  && pDatabase->z=
f570: 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62  =0 ){.    pDatab
f580: 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ase = 0;.  }.  i
f590: 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20  f( pDatabase && 
f5a0: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f  pTable ){.    To
f5b0: 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61  ken *pTemp = pDa
f5c0: 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74  tabase;.    pDat
f5d0: 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a  abase = pTable;.
f5e0: 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65      pTable = pTe
f5f0: 6d 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54  mp;.  }.  if( pT
f600: 61 62 6c 65 20 29 7b 0a 20 20 20 20 63 68 61 72  able ){.    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: 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Name;.    sqlite
f640: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70  SetNString(pz, p
f650: 54 61 62 6c 65 2d 3e 7a 2c 20 70 54 61 62 6c 65  Table->z, pTable
f660: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ->n, 0);.    if(
f670: 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20   *pz==0 ){.     
f680: 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65   sqliteSrcListDe
f690: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
f6a0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
f6b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
f6c0: 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29  liteDequote(*pz)
f6d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
f6e0: 28 20 70 44 61 74 61 62 61 73 65 20 29 7b 0a 20  ( pDatabase ){. 
f6f0: 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26     char **pz = &
f700: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
f710: 6e 53 72 63 5d 2e 7a 44 61 74 61 62 61 73 65 3b  nSrc].zDatabase;
f720: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53  .    sqliteSetNS
f730: 74 72 69 6e 67 28 70 7a 2c 20 70 44 61 74 61 62  tring(pz, pDatab
f740: 61 73 65 2d 3e 7a 2c 20 70 44 61 74 61 62 61 73  ase->z, pDatabas
f750: 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66  e->n, 0);.    if
f760: 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  ( *pz==0 ){.    
f770: 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44    sqliteSrcListD
f780: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
f790: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
f7a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
f7b0: 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a  qliteDequote(*pz
f7c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
f7d0: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
f7e0: 53 72 63 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d  Src].iCursor = -
f7f0: 31 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63  1;.  pList->nSrc
f800: 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  ++;.  return pLi
f810: 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  st;.}../*.** Ass
f820: 69 67 6e 20 63 75 72 73 6f 72 73 20 74 6f 20 61  ign cursors to a
f830: 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53  ll tables in a S
f840: 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73  rcList.*/.void s
f850: 71 6c 69 74 65 53 72 63 4c 69 73 74 41 73 73 69  qliteSrcListAssi
f860: 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65 20  gnCursors(Parse 
f870: 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
f880: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
f890: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
f8a0: 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
f8b0: 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  ){.    if( pList
f8c0: 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 30  ->a[i].iCursor<0
f8d0: 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d   ){.      pList-
f8e0: 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20  >a[i].iCursor = 
f8f0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
f900: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
f910: 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20  ** Add an alias 
f920: 74 6f 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e  to the last iden
f930: 74 69 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69  tifier on the gi
f940: 76 65 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c  ven identifier l
f950: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
f960: 69 74 65 53 72 63 4c 69 73 74 41 64 64 41 6c 69  iteSrcListAddAli
f970: 61 73 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  as(SrcList *pLis
f980: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
f990: 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26  ){.  if( pList &
f9a0: 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20  & pList->nSrc>0 
f9b0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70  ){.    int i = p
f9c0: 4c 69 73 74 2d 3e 6e 53 72 63 20 2d 20 31 3b 0a  List->nSrc - 1;.
f9d0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
f9e0: 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69  ring(&pList->a[i
f9f0: 5d 2e 7a 41 6c 69 61 73 2c 20 70 54 6f 6b 65 6e  ].zAlias, pToken
fa00: 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20  ->z, pToken->n, 
fa10: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65  0);.    sqliteDe
fa20: 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  quote(pList->a[i
fa30: 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 7d  ].zAlias);.  }.}
fa40: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
fa50: 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  n IdList..*/.voi
fa60: 64 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65  d sqliteIdListDe
fa70: 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69  lete(IdList *pLi
fa80: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
fa90: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
faa0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
fab0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
fac0: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
fad0: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Free(pList->a[i]
fae0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  .zName);.  }.  s
faf0: 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
fb00: 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  >a);.  sqliteFre
fb10: 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pList);.}../*.
fb20: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
fb30: 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20  dex in pList of 
fb40: 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e  the identifier n
fb50: 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72  amed zId.  Retur
fb60: 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66  n -1.** if not f
fb70: 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
fb80: 69 74 65 49 64 4c 69 73 74 49 6e 64 65 78 28 49  iteIdListIndex(I
fb90: 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f  dList *pList, co
fba0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
fbb0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
fbc0: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
fbd0: 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30  rn -1;.  for(i=0
fbe0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
fbf0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
fc00: 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73  liteStrICmp(pLis
fc10: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  t->a[i].zName, z
fc20: 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
fc30: 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
fc40: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n -1;.}../*.** D
fc50: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
fc60: 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e  SrcList includin
fc70: 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72  g all its substr
fc80: 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20  ucture..*/.void 
fc90: 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c  sqliteSrcListDel
fca0: 65 74 65 28 53 72 63 4c 69 73 74 20 2a 70 4c 69  ete(SrcList *pLi
fcb0: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
fcc0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
fcd0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
fce0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
fcf0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
fd00: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  eFree(pList->a[i
fd10: 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
fd20: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
fd30: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
fd40: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
fd50: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69  pList->a[i].zAli
fd60: 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  as);.    if( pLi
fd70: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 26 26  st->a[i].pTab &&
fd80: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61   pList->a[i].pTa
fd90: 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29  b->isTransient )
fda0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65  {.      sqliteDe
fdb0: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 4c 69  leteTable(0, pLi
fdc0: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 3b 0a  st->a[i].pTab);.
fdd0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
fde0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 4c 69  SelectDelete(pLi
fdf0: 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
fe00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70  );.    sqliteExp
fe10: 72 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61  rDelete(pList->a
fe20: 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 73 71  [i].pOn);.    sq
fe30: 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65  liteIdListDelete
fe40: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 55 73  (pList->a[i].pUs
fe50: 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ing);.  }.  sqli
fe60: 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
fe70: 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
fe80: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
fe90: 6f 69 64 20 73 71 6c 69 74 65 42 65 67 69 6e 54  oid sqliteBeginT
fea0: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
feb0: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e   *pParse, int on
fec0: 45 72 72 6f 72 29 7b 0a 20 20 73 71 6c 69 74 65  Error){.  sqlite
fed0: 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61   *db;..  if( pPa
fee0: 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50  rse==0 || (db=pP
fef0: 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20  arse->db)==0 || 
ff00: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d  db->aDb[0].pBt==
ff10: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
ff20: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
ff30: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
ff40: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
ff50: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74  .  if( sqliteAut
ff60: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
ff70: 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
ff80: 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30  N, "BEGIN", 0, 0
ff90: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  ) ) return;.  if
ffa0: 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
ffb0: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a  LITE_InTrans ){.
ffc0: 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
ffd0: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
ffe0: 6f 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  ot start a trans
fff0: 61 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20  action within a 
10000 74 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20  transaction");. 
10010 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
10020 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74   sqliteBeginWrit
10030 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
10040 65 2c 20 30 2c 20 30 29 3b 0a 20 20 64 62 2d 3e  e, 0, 0);.  db->
10050 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
10060 49 6e 54 72 61 6e 73 3b 0a 20 20 64 62 2d 3e 6f  InTrans;.  db->o
10070 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72  nError = onError
10080 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
10090 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  t a transaction.
100a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f  */.void sqliteCo
100b0 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28  mmitTransaction(
100c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
100d0 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20    sqlite *db;.. 
100e0 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c   if( pParse==0 |
100f0 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62  | (db=pParse->db
10100 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b  )==0 || db->aDb[
10110 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
10120 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
10130 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
10140 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
10150 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
10160 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70  qliteAuthCheck(p
10170 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
10180 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d  ANSACTION, "COMM
10190 49 54 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  IT", 0, 0) ) ret
101a0 75 72 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e  urn;.  if( (db->
101b0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
101c0 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20  nTrans)==0 ){.  
101d0 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
101e0 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
101f0 20 63 6f 6d 6d 69 74 20 2d 20 6e 6f 20 74 72 61   commit - no tra
10200 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
10210 76 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ve");.    return
10220 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  ;.  }.  db->flag
10230 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54  s &= ~SQLITE_InT
10240 72 61 6e 73 3b 0a 20 20 73 71 6c 69 74 65 45 6e  rans;.  sqliteEn
10250 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
10260 70 50 61 72 73 65 29 3b 0a 20 20 64 62 2d 3e 6f  pParse);.  db->o
10270 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61  nError = OE_Defa
10280 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  ult;.}../*.** Ro
10290 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
102a0 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
102b0 69 74 65 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73  iteRollbackTrans
102c0 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
102d0 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20  arse){.  sqlite 
102e0 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
102f0 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
10300 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
10310 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44  db)==0 || db->aD
10320 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  b[0].pBt==0 ) re
10330 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
10340 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
10350 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
10360 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
10370 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b   sqliteAuthCheck
10380 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
10390 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f  TRANSACTION, "RO
103a0 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29  LLBACK", 0, 0) )
103b0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28   return;.  if( (
103c0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
103d0 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29  TE_InTrans)==0 )
103e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f  {.    sqliteErro
103f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61  rMsg(pParse, "ca
10400 6e 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 2d 20  nnot rollback - 
10410 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  no transaction i
10420 73 20 61 63 74 69 76 65 22 29 3b 0a 20 20 20 20  s active");.    
10430 72 65 74 75 72 6e 3b 20 0a 20 20 7d 0a 20 20 76  return; .  }.  v
10440 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
10450 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
10460 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  v ){.    sqliteV
10470 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
10480 6f 6c 6c 62 61 63 6b 2c 20 30 2c 20 30 29 3b 0a  ollback, 0, 0);.
10490 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20    }.  db->flags 
104a0 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61  &= ~SQLITE_InTra
104b0 6e 73 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f  ns;.  db->onErro
104c0 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a  r = OE_Default;.
104d0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
104e0 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
104f0 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65   will verify the
10500 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 66   schema cookie f
10510 6f 72 20 61 6c 6c 0a 2a 2a 20 6e 61 6d 65 64 20  or all.** named 
10520 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a  database files..
10530 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f  */.void sqliteCo
10540 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50  deVerifySchema(P
10550 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
10560 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65  t iDb){.  sqlite
10570 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
10580 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  b;.  Vdbe *v = s
10590 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
105a0 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
105b0 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
105c0 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
105d0 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t( db->aDb[iDb].
105e0 70 42 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  pBt!=0 );.  if( 
105f0 69 44 62 21 3d 31 20 26 26 20 21 44 62 48 61 73  iDb!=1 && !DbHas
10600 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62  Property(db, iDb
10610 2c 20 44 42 5f 43 6f 6f 6b 69 65 29 20 29 7b 0a  , DB_Cookie) ){.
10620 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
10630 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79  dOp(v, OP_Verify
10640 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 64 62 2d  Cookie, iDb, db-
10650 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61  >aDb[iDb].schema
10660 5f 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 44 62  _cookie);.    Db
10670 53 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20  SetProperty(db, 
10680 69 44 62 2c 20 44 42 5f 43 6f 6f 6b 69 65 29 3b  iDb, DB_Cookie);
10690 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
106a0 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
106b0 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66   that prepares f
106c0 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72  or doing an oper
106d0 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69  ation that.** mi
106e0 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64  ght change the d
106f0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
10700 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72  his routine star
10710 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  ts a new transac
10720 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e  tion if we are n
10730 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  ot already withi
10740 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  n.** a transacti
10750 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20 61  on.  If we are a
10760 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61 20  lready within a 
10770 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
10780 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a  n a checkpoint.*
10790 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20  * is set if the 
107a0 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 20 70 61  setCheckpoint pa
107b0 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e  rameter is true.
107c0 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73    A checkpoint s
107d0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20  hould.** be set 
107e0 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  for operations t
107f0 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28  hat might fail (
10800 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61  due to a constra
10810 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20  int) part of.** 
10820 74 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20  the way through 
10830 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e  and which will n
10840 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65  eed to undo some
10850 20 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20   writes without 
10860 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c  having to.** rol
10870 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20  lback the whole 
10880 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f  transaction.  Fo
10890 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65  r operations whe
108a0 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  re all constrain
108b0 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65  ts.** can be che
108c0 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  cked before any 
108d0 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
108e0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
108f0 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a  , it is never.**
10900 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e   necessary to un
10910 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74  do a write and t
10920 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68  he checkpoint sh
10930 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e  ould not be set.
10940 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61  .**.** Only data
10950 62 61 73 65 20 69 44 62 20 61 6e 64 20 74 68 65  base iDb and the
10960 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 61   temp database a
10970 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  re made writable
10980 20 62 79 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a   by this call..*
10990 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20 74 68 65  * If iDb==0, the
109a0 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e 64 20 74  n the main and t
109b0 65 6d 70 20 64 61 74 61 62 61 73 65 73 20 61 72  emp databases ar
109c0 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e  e made writable.
109d0 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20     If.** iDb==1 
109e0 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65  then only the te
109f0 6d 70 20 64 61 74 61 62 61 73 65 20 69 73 20 6d  mp database is m
10a00 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 49  ade writable.  I
10a10 66 20 69 44 62 3e 31 20 74 68 65 6e 20 74 68 65  f iDb>1 then the
10a20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 61 75  .** specified au
10a30 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
10a40 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61   and the temp da
10a50 74 61 62 61 73 65 20 61 72 65 20 6d 61 64 65 20  tabase are made 
10a60 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69  writable..*/.voi
10a70 64 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69  d sqliteBeginWri
10a80 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73  teOperation(Pars
10a90 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73  e *pParse, int s
10aa0 65 74 43 68 65 63 6b 70 6f 69 6e 74 2c 20 69 6e  etCheckpoint, in
10ab0 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
10ac0 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  v;.  sqlite *db 
10ad0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
10ae0 69 66 28 20 44 62 48 61 73 50 72 6f 70 65 72 74  if( DbHasPropert
10af0 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 4c 6f  y(db, iDb, DB_Lo
10b00 63 6b 65 64 29 20 29 20 72 65 74 75 72 6e 3b 0a  cked) ) return;.
10b10 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
10b20 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
10b30 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
10b40 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 61 44 62  ;.  if( !db->aDb
10b50 5b 69 44 62 5d 2e 69 6e 54 72 61 6e 73 20 29 7b  [iDb].inTrans ){
10b60 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
10b70 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73  ddOp(v, OP_Trans
10b80 61 63 74 69 6f 6e 2c 20 69 44 62 2c 20 30 29 3b  action, iDb, 0);
10b90 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72  .    DbSetProper
10ba0 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 4c  ty(db, iDb, DB_L
10bb0 6f 63 6b 65 64 29 3b 0a 20 20 20 20 73 71 6c 69  ocked);.    sqli
10bc0 74 65 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  teCodeVerifySche
10bd0 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
10be0 0a 20 20 20 20 69 66 28 20 69 44 62 21 3d 31 20  .    if( iDb!=1 
10bf0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42  ){.      sqliteB
10c00 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
10c10 6f 6e 28 70 50 61 72 73 65 2c 20 73 65 74 43 68  on(pParse, setCh
10c20 65 63 6b 70 6f 69 6e 74 2c 20 31 29 3b 0a 20 20  eckpoint, 1);.  
10c30 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
10c40 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 20 29 7b  setCheckpoint ){
10c50 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
10c60 64 64 4f 70 28 76 2c 20 4f 50 5f 43 68 65 63 6b  ddOp(v, OP_Check
10c70 70 6f 69 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a  point, iDb, 0);.
10c80 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74      DbSetPropert
10c90 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 4c 6f  y(db, iDb, DB_Lo
10ca0 63 6b 65 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  cked);.  }.}../*
10cb0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
10cc0 65 20 74 68 61 74 20 63 6f 6e 63 6c 75 64 65 73  e that concludes
10cd0 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68   an operation th
10ce0 61 74 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e  at may have chan
10cf0 67 65 64 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ged.** the datab
10d00 61 73 65 2e 20 20 49 66 20 61 20 73 74 61 74 65  ase.  If a state
10d10 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
10d20 20 77 61 73 20 73 74 61 72 74 65 64 2c 20 74 68   was started, th
10d30 65 6e 20 65 6d 69 74 0a 2a 2a 20 61 6e 20 4f 50  en emit.** an OP
10d40 5f 43 6f 6d 6d 69 74 20 74 68 61 74 20 77 69 6c  _Commit that wil
10d50 6c 20 63 61 75 73 65 20 74 68 65 20 63 68 61 6e  l cause the chan
10d60 67 65 73 20 74 6f 20 62 65 20 63 6f 6d 6d 69 74  ges to be commit
10d70 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ted to disk..**.
10d80 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 63 68 65  ** Note that che
10d90 63 6b 70 6f 69 6e 74 73 20 61 72 65 20 61 75 74  ckpoints are aut
10da0 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6d 6d 69  omatically commi
10db0 74 74 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  tted at the end 
10dc0 6f 66 0a 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e  of.** a statemen
10dd0 74 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  t.  Note also th
10de0 61 74 20 74 68 65 72 65 20 63 61 6e 20 62 65 20  at there can be 
10df0 6d 75 6c 74 69 70 6c 65 20 63 61 6c 6c 73 20 74  multiple calls t
10e00 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 42 65 67 69  o .** sqliteBegi
10e10 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
10e20 29 20 62 75 74 20 74 68 65 72 65 20 73 68 6f 75  ) but there shou
10e30 6c 64 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e  ld only be a sin
10e40 67 6c 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73  gle.** call to s
10e50 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65  qliteEndWriteOpe
10e60 72 61 74 69 6f 6e 28 29 20 61 74 20 74 68 65 20  ration() at the 
10e70 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68  conclusion of th
10e80 65 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  e statement..*/.
10e90 76 6f 69 64 20 73 71 6c 69 74 65 45 6e 64 57 72  void sqliteEndWr
10ea0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72  iteOperation(Par
10eb0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
10ec0 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
10ed0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
10ee0 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  b;.  if( pParse-
10ef0 3e 74 72 69 67 53 74 61 63 6b 20 29 20 72 65 74  >trigStack ) ret
10f00 75 72 6e 3b 20 2f 2a 20 69 66 20 74 68 69 73 20  urn; /* if this 
10f10 69 73 20 69 6e 20 61 20 74 72 69 67 67 65 72 20  is in a trigger 
10f20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  */.  v = sqliteG
10f30 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
10f40 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
10f50 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66  urn;.  if( db->f
10f60 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
10f70 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 2f 2a 20  Trans ){.    /* 
10f80 41 20 42 45 47 49 4e 20 68 61 73 20 65 78 65 63  A BEGIN has exec
10f90 75 74 65 64 2e 20 20 44 6f 20 6e 6f 74 20 63 6f  uted.  Do not co
10fa0 6d 6d 69 74 20 75 6e 74 69 6c 20 77 65 20 73 65  mmit until we se
10fb0 65 20 61 6e 20 65 78 70 6c 69 63 69 74 0a 20 20  e an explicit.  
10fc0 20 20 2a 2a 20 43 4f 4d 4d 49 54 20 73 74 61 74    ** COMMIT stat
10fd0 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 7d 65 6c 73  ement. */.  }els
10fe0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  e{.    sqliteVdb
10ff0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d  eAddOp(v, OP_Com
11000 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  mit, 0, 0);.  }.
11010 7d 0a                                            }.