/ Hex Artifact Content
Login

Artifact 9def3a3b8fba59325ed686049b88c2e7aff9af12:


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 30 20 32 30 30 33 2f 30 39 2f 30 36 20 32  160 2003/09/06 2
0300: 32 3a 31 38 3a 30 38 20 64 72 68 20 45 78 70 20  2:18:08 drh Exp 
0310: 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  $.*/.#include "s
0320: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
0330: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a  lude <ctype.h>..
0340: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0350: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
0360: 6e 20 61 20 6e 65 77 20 53 51 4c 20 73 74 61 74  n a new SQL stat
0370: 65 6d 65 6e 74 20 69 73 20 62 65 67 69 6e 6e 69  ement is beginni
0380: 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61 72 73  ng to.** be pars
0390: 65 64 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  ed.  Check to se
03a0: 65 20 69 66 20 74 68 65 20 73 63 68 65 6d 61 20  e if the schema 
03b0: 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
03c0: 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20   needs.** to be 
03d0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 53 51  read from the SQ
03e0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 61 6e 64 20  LITE_MASTER and 
03f0: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 4d 41 53 54  SQLITE_TEMP_MAST
0400: 45 52 20 74 61 62 6c 65 73 2e 0a 2a 2a 20 49 66  ER tables..** If
0410: 20 69 74 20 64 6f 65 73 2c 20 74 68 65 6e 20 72   it does, then r
0420: 65 61 64 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ead it..*/.void 
0430: 73 71 6c 69 74 65 42 65 67 69 6e 50 61 72 73 65  sqliteBeginParse
0440: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
0450: 69 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29  int explainFlag)
0460: 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  {.  sqlite *db =
0470: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
0480: 6e 74 20 69 3b 0a 20 20 70 50 61 72 73 65 2d 3e  nt i;.  pParse->
0490: 65 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61 69  explain = explai
04a0: 6e 46 6c 61 67 3b 0a 20 20 69 66 28 28 64 62 2d  nFlag;.  if((db-
04b0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
04c0: 49 6e 69 74 69 61 6c 69 7a 65 64 29 3d 3d 30 20  Initialized)==0 
04d0: 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  && pParse->initF
04e0: 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  lag==0 ){.    in
04f0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 49 6e 69  t rc = sqliteIni
0500: 74 28 64 62 2c 20 26 70 50 61 72 73 65 2d 3e 7a  t(db, &pParse->z
0510: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28  ErrMsg);.    if(
0520: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
0530: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
0540: 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 70  rc = rc;.      p
0550: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
0560: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
0570: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
0580: 2b 2b 29 7b 0a 20 20 20 20 44 62 43 6c 65 61 72  ++){.    DbClear
0590: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20  Property(db, i, 
05a0: 44 42 5f 4c 6f 63 6b 65 64 29 3b 0a 20 20 20 20  DB_Locked);.    
05b0: 69 66 28 20 21 64 62 2d 3e 61 44 62 5b 69 5d 2e  if( !db->aDb[i].
05c0: 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20  inTrans ){.     
05d0: 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79   DbClearProperty
05e0: 28 64 62 2c 20 69 2c 20 44 42 5f 43 6f 6f 6b 69  (db, i, DB_Cooki
05f0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
0600: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30  pParse->nVar = 0
0610: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
0620: 69 73 20 61 20 66 61 6b 65 20 63 61 6c 6c 62 61  is a fake callba
0630: 63 6b 20 70 72 6f 63 65 64 75 72 65 20 75 73 65  ck procedure use
0640: 64 20 77 68 65 6e 20 73 71 6c 69 74 65 5f 65 78  d when sqlite_ex
0650: 65 63 28 29 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b  ec() is.** invok
0660: 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63  ed with a NULL c
0670: 61 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 65 72 2e  allback pointer.
0680: 20 20 49 66 20 77 65 20 70 61 73 73 20 61 20 4e    If we pass a N
0690: 55 4c 4c 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  ULL callback.** 
06a0: 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 73 71 6c  pointer into sql
06b0: 69 74 65 56 64 62 65 45 78 65 63 28 29 20 69 74  iteVdbeExec() it
06c0: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 74 20   will return at 
06d0: 65 76 65 72 79 20 4f 50 5f 43 61 6c 6c 62 61 63  every OP_Callbac
06e0: 6b 2c 0a 2a 2a 20 77 68 69 63 68 20 77 65 20 64  k,.** which we d
06f0: 6f 20 6e 6f 74 20 77 61 6e 74 20 69 74 20 74 6f  o not want it to
0700: 20 64 6f 2e 20 20 53 6f 20 77 65 20 73 75 62 73   do.  So we subs
0710: 74 69 74 75 74 65 20 61 20 70 6f 69 6e 74 65 72  titute a pointer
0720: 20 74 6f 20 74 68 69 73 0a 2a 2a 20 70 72 6f 63   to this.** proc
0730: 65 64 75 72 65 20 69 6e 20 70 6c 61 63 65 20 6f  edure in place o
0740: 66 20 74 68 65 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  f the NULL..*/.s
0750: 74 61 74 69 63 20 69 6e 74 20 66 61 6b 65 43 61  tatic int fakeCa
0760: 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 4e 6f 74  llback(void *Not
0770: 55 73 65 64 2c 20 69 6e 74 20 6e 2c 20 63 68 61  Used, int n, cha
0780: 72 20 2a 2a 61 7a 31 2c 20 63 68 61 72 20 2a 2a  r **az1, char **
0790: 61 7a 32 29 7b 0a 20 20 72 65 74 75 72 6e 20 30  az2){.  return 0
07a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
07b0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
07c0: 64 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65  d after a single
07d0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68   SQL statement h
07e0: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65  as been.** parse
07f0: 64 20 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f  d and we want to
0800: 20 65 78 65 63 75 74 65 20 74 68 65 20 56 44 42   execute the VDB
0810: 45 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d  E code to implem
0820: 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20 73 74 61  ent .** that sta
0830: 74 65 6d 65 6e 74 2e 20 20 50 72 69 6f 72 20 61  tement.  Prior a
0840: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 73  ction routines s
0850: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
0860: 64 79 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65  dy.** constructe
0870: 64 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 64  d VDBE code to d
0880: 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68  o the work of th
0890: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
08a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
08b0: 20 6a 75 73 74 20 68 61 73 20 74 6f 20 65 78 65   just has to exe
08c0: 63 75 74 65 20 74 68 65 20 56 44 42 45 20 63 6f  cute the VDBE co
08d0: 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  de..**.** Note t
08e0: 68 61 74 20 69 66 20 61 6e 20 65 72 72 6f 72 20  hat if an error 
08f0: 6f 63 63 75 72 72 65 64 2c 20 69 74 20 6d 69 67  occurred, it mig
0900: 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
0910: 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63  hat.** no VDBE c
0920: 6f 64 65 20 77 61 73 20 67 65 6e 65 72 61 74 65  ode was generate
0930: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
0940: 65 45 78 65 63 28 50 61 72 73 65 20 2a 70 50 61  eExec(Parse *pPa
0950: 72 73 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  rse){.  int rc =
0960: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
0970: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
0980: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
0990: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
09a0: 3b 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62  ;.  int (*xCallb
09b0: 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  ack)(void*,int,c
09c0: 68 61 72 2a 2a 2c 63 68 61 72 2a 2a 29 3b 0a 0a  har**,char**);..
09d0: 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c    if( sqlite_mal
09e0: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
09f0: 75 72 6e 3b 0a 20 20 78 43 61 6c 6c 62 61 63 6b  urn;.  xCallback
0a00: 20 3d 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c   = pParse->xCall
0a10: 62 61 63 6b 3b 0a 20 20 69 66 28 20 78 43 61 6c  back;.  if( xCal
0a20: 6c 62 61 63 6b 3d 3d 30 20 26 26 20 70 50 61 72  lback==0 && pPar
0a30: 73 65 2d 3e 75 73 65 43 61 6c 6c 62 61 63 6b 20  se->useCallback 
0a40: 29 20 78 43 61 6c 6c 62 61 63 6b 20 3d 20 66 61  ) xCallback = fa
0a50: 6b 65 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 69 66  keCallback;.  if
0a60: 28 20 76 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  ( v && pParse->n
0a70: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49  Err==0 ){.    FI
0a80: 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d  LE *trace = (db-
0a90: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
0aa0: 56 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20  VdbeTrace)!=0 ? 
0ab0: 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20  stdout : 0;.    
0ac0: 73 71 6c 69 74 65 56 64 62 65 54 72 61 63 65 28  sqliteVdbeTrace(
0ad0: 76 2c 20 74 72 61 63 65 29 3b 0a 20 20 20 20 73  v, trace);.    s
0ae0: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 52 65 61  qliteVdbeMakeRea
0af0: 64 79 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56  dy(v, pParse->nV
0b00: 61 72 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20 70  ar, xCallback, p
0b10: 50 61 72 73 65 2d 3e 70 41 72 67 2c 0a 20 20 20  Parse->pArg,.   
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b30: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 65 78 70       pParse->exp
0b40: 6c 61 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 70  lain);.    if( p
0b50: 50 61 72 73 65 2d 3e 75 73 65 43 61 6c 6c 62 61  Parse->useCallba
0b60: 63 6b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ck ){.      if( 
0b70: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
0b80: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
0b90: 73 71 6c 69 74 65 56 64 62 65 4c 69 73 74 28 76  sqliteVdbeList(v
0ba0: 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  );.        db->n
0bb0: 65 78 74 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d  ext_cookie = db-
0bc0: 3e 61 44 62 5b 30 5d 2e 73 63 68 65 6d 61 5f 63  >aDb[0].schema_c
0bd0: 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 7d 65 6c  ookie;.      }el
0be0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
0bf0: 74 65 56 64 62 65 45 78 65 63 28 76 29 3b 0a 20  teVdbeExec(v);. 
0c00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
0c10: 3d 20 73 71 6c 69 74 65 56 64 62 65 46 69 6e 61  = sqliteVdbeFina
0c20: 6c 69 7a 65 28 76 2c 20 26 70 50 61 72 73 65 2d  lize(v, &pParse-
0c30: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  >zErrMsg);.     
0c40: 20 69 66 28 20 72 63 20 29 20 70 50 61 72 73 65   if( rc ) pParse
0c50: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
0c60: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
0c70: 30 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  0;.      pParse-
0c80: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
0c90: 69 66 28 20 72 63 20 29 20 70 50 61 72 73 65 2d  if( rc ) pParse-
0ca0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 65 6c  >nErr++;.    }el
0cb0: 73 65 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65  se{.      pParse
0cc0: 2d 3e 72 63 20 3d 20 70 50 61 72 73 65 2d 3e 6e  ->rc = pParse->n
0cd0: 45 72 72 20 3f 20 53 51 4c 49 54 45 5f 45 52 52  Err ? SQLITE_ERR
0ce0: 4f 52 20 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  OR : SQLITE_DONE
0cf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
0d00: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
0d10: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
0d20: 20 70 50 61 72 73 65 2d 3e 75 73 65 43 61 6c 6c   pParse->useCall
0d30: 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 70  back==0 ){.    p
0d40: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
0d50: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
0d60: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30  pParse->nTab = 0
0d70: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
0d80: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
0d90: 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72  nSet = 0;.  pPar
0da0: 73 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a 20 20  se->nAgg = 0;.  
0db0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30  pParse->nVar = 0
0dc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
0dd0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
0de0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
0df0: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
0e00: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
0e10: 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  se table given t
0e20: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68  he name.** of th
0e30: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
0e40: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
0e50: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
0e60: 73 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  se.** containing
0e70: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
0e80: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
0e90: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  found..**.** If 
0ea0: 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20  zDatabase is 0, 
0eb0: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72  all databases ar
0ec0: 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
0ed0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  he.** table and 
0ee0: 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
0ef0: 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75  ng table is retu
0f00: 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b  rned.  (No check
0f10: 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69  ing.** for dupli
0f20: 63 61 74 65 20 74 61 62 6c 65 20 6e 61 6d 65 73  cate table names
0f30: 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20   is done.)  The 
0f40: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a  search order is.
0f50: 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74  ** TEMP first, t
0f60: 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61  hen MAIN, then a
0f70: 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ny auxiliary dat
0f80: 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20  abases added.** 
0f90: 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48  using the ATTACH
0fa0: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
0fb0: 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 4c  See also sqliteL
0fc0: 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f  ocateTable()..*/
0fd0: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 46 69  .Table *sqliteFi
0fe0: 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 20 2a  ndTable(sqlite *
0ff0: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
1000: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
1010: 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20  r *zDatabase){. 
1020: 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20   Table *p = 0;. 
1030: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1040: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
1050: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20  +){.    int j = 
1060: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
1070: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d     /* Search TEM
1080: 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f  P before MAIN */
1090: 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61  .    if( zDataba
10a0: 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 53  se!=0 && sqliteS
10b0: 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65  trICmp(zDatabase
10c0: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61  , db->aDb[j].zNa
10d0: 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  me) ) continue;.
10e0: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 48 61      p = sqliteHa
10f0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b  shFind(&db->aDb[
1100: 6a 5d 2e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d  j].tblHash, zNam
1110: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
1120: 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  +1);.    if( p )
1130: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
1140: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1150: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
1160: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
1170: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a  that describes .
1180: 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ** a particular 
1190: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 67  database table g
11a0: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  iven the name.**
11b0: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
11c0: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
11d0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
11e0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 74  database.** cont
11f0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
1200: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
1210: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 20  f not found..** 
1220: 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 20 65 72  Also leave an er
1230: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
1240: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
1250: 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
1260: 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
1270: 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71  s routine and sq
1280: 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 29 0a  liteFindTable().
1290: 2a 2a 20 69 73 20 74 68 61 74 20 74 68 69 73 20  ** is that this 
12a0: 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61  routine leaves a
12b0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
12c0: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
12d0: 73 67 0a 2a 2a 20 77 68 65 72 65 20 73 71 6c 69  sg.** where sqli
12e0: 74 65 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f  teFindTable() do
12f0: 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65  es not..*/.Table
1300: 20 2a 73 71 6c 69 74 65 4c 6f 63 61 74 65 54 61   *sqliteLocateTa
1310: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
1320: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1330: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
1340: 20 2a 7a 44 62 61 73 65 29 7b 0a 20 20 54 61 62   *zDbase){.  Tab
1350: 6c 65 20 2a 70 3b 0a 0a 20 20 70 20 3d 20 73 71  le *p;..  p = sq
1360: 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50  liteFindTable(pP
1370: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  arse->db, zName,
1380: 20 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20   zDbase);.  if( 
1390: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  p==0 ){.    if( 
13a0: 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  zDbase ){.      
13b0: 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
13c0: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
13d0: 74 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20 7a  table: %s.%s", z
13e0: 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  Dbase, zName);. 
13f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
1400: 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50 61  iteFindTable(pPa
1410: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  rse->db, zName, 
1420: 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  0)!=0 ){.      s
1430: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
1440: 61 72 73 65 2c 20 22 74 61 62 6c 65 20 5c 22 25  arse, "table \"%
1450: 73 5c 22 20 69 73 20 6e 6f 74 20 69 6e 20 64 61  s\" is not in da
1460: 74 61 62 61 73 65 20 5c 22 25 73 5c 22 22 2c 0a  tabase \"%s\"",.
1470: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20           zName, 
1480: 7a 44 62 61 73 65 29 3b 0a 20 20 20 20 7d 65 6c  zDbase);.    }el
1490: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
14a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
14b0: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
14c0: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
14d0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
14e0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63   p;.}../*.** Loc
14f0: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
1500: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
1510: 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61   describes .** a
1520: 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65   particular inde
1530: 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  x given the name
1540: 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a   of that index.*
1550: 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f  * and the name o
1560: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
1570: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
1580: 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72   index..** Retur
1590: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
15a0: 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44  und..**.** If zD
15b0: 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c  atabase is 0, al
15c0: 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  l databases are 
15d0: 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65  searched for the
15e0: 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68  .** table and th
15f0: 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
1600: 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e   index is return
1610: 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e  ed.  (No checkin
1620: 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61  g.** for duplica
1630: 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69  te index names i
1640: 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65  s done.)  The se
1650: 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a  arch order is.**
1660: 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65   TEMP first, the
1670: 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79  n MAIN, then any
1680: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
1690: 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73  ases added.** us
16a0: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
16b0: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78  ommand..*/.Index
16c0: 20 2a 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65   *sqliteFindInde
16d0: 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f  x(sqlite *db, co
16e0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
16f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1700: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
1710: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  0;.  int i;.  fo
1720: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
1730: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
1740: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
1750: 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20  : i;  /* Search 
1760: 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e  TEMP before MAIN
1770: 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 20   */.    if( zDb 
1780: 26 26 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  && sqliteStrICmp
1790: 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d  (zDb, db->aDb[j]
17a0: 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e  .zName) ) contin
17b0: 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  ue;.    p = sqli
17c0: 74 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  teHashFind(&db->
17d0: 61 44 62 5b 6a 5d 2e 69 64 78 48 61 73 68 2c 20  aDb[j].idxHash, 
17e0: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
17f0: 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28  ame)+1);.    if(
1800: 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   p ) break;.  }.
1810: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
1820: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
1830: 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d  given index from
1840: 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20   the index hash 
1850: 74 61 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a  table, and free.
1860: 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74  ** its memory st
1870: 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  ructures..**.** 
1880: 54 68 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d  The index is rem
1890: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  oved from the da
18a0: 74 61 62 61 73 65 20 68 61 73 68 20 74 61 62 6c  tabase hash tabl
18b0: 65 73 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20  es but.** it is 
18c0: 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  not unlinked fro
18d0: 6d 20 74 68 65 20 54 61 62 6c 65 20 74 68 61 74  m the Table that
18e0: 20 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20   it indexes..** 
18f0: 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74  Unlinking from t
1900: 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65  he Table must be
1910: 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c   done by the cal
1920: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
1930: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
1940: 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28  liteDeleteIndex(
1950: 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65  sqlite *db, Inde
1960: 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a  x *p){.  Index *
1970: 70 4f 6c 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  pOld;..  assert(
1980: 20 64 62 21 3d 30 20 26 26 20 70 2d 3e 7a 4e 61   db!=0 && p->zNa
1990: 6d 65 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20  me!=0 );.  pOld 
19a0: 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65  = sqliteHashInse
19b0: 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69  rt(&db->aDb[p->i
19c0: 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 2d 3e  Db].idxHash, p->
19d0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65   strlen(p->zName
1a00: 29 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  )+1, 0);.  if( p
1a10: 4f 6c 64 21 3d 30 20 26 26 20 70 4f 6c 64 21 3d  Old!=0 && pOld!=
1a20: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 48  p ){.    sqliteH
1a30: 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61  ashInsert(&db->a
1a40: 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61  Db[p->iDb].idxHa
1a50: 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c  sh, pOld->zName,
1a60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a70: 20 20 20 20 20 20 73 74 72 6c 65 6e 28 70 4f 6c        strlen(pOl
1a80: 64 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c  d->zName)+1, pOl
1a90: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
1aa0: 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Free(p);.}../*.*
1ab0: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
1ac0: 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74  en index from it
1ad0: 73 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65  s table, then re
1ae0: 6d 6f 76 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65  move.** the inde
1af0: 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  x from the index
1b00: 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20   hash table and 
1b10: 66 72 65 65 20 69 74 73 20 6d 65 6d 6f 72 79 0a  free its memory.
1b20: 2a 2a 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  ** structures..*
1b30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 55 6e 6c  /.void sqliteUnl
1b40: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65  inkAndDeleteInde
1b50: 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e  x(sqlite *db, In
1b60: 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20  dex *pIndex){.  
1b70: 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  if( pIndex->pTab
1b80: 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64  le->pIndex==pInd
1b90: 65 78 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78  ex ){.    pIndex
1ba0: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
1bb0: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
1bc0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49  ;.  }else{.    I
1bd0: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 66 6f 72  ndex *p;.    for
1be0: 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  (p=pIndex->pTabl
1bf0: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20  e->pIndex; p && 
1c00: 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78  p->pNext!=pIndex
1c10: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a  ; p=p->pNext){}.
1c20: 20 20 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e      if( p && p->
1c30: 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b  pNext==pIndex ){
1c40: 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20  .      p->pNext 
1c50: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
1c60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1c70: 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64  iteDeleteIndex(d
1c80: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f  b, pIndex);.}../
1c90: 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73  *.** Erase all s
1ca0: 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f  chema informatio
1cb0: 6e 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65  n from the in-me
1cc0: 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73  mory hash tables
1cd0: 20 6f 66 0a 2a 2a 20 64 61 74 61 62 61 73 65 20   of.** database 
1ce0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69  connection.  Thi
1cf0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1d00: 6c 65 64 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d  led to reclaim m
1d10: 65 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20  emory.** before 
1d20: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  the connection c
1d30: 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61 6c  loses.  It is al
1d40: 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67  so called during
1d50: 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69   a rollback.** i
1d60: 66 20 74 68 65 72 65 20 77 65 72 65 20 73 63 68  f there were sch
1d70: 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72 69  ema changes duri
1d80: 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ng the transacti
1d90: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  on..**.** If iDb
1da0: 3c 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20 74  <=0 then reset t
1db0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
1dc0: 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c  ma tables for al
1dd0: 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  l database.** fi
1de0: 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20  les.  If iDb>=2 
1df0: 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69  then reset the i
1e00: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66  nternal schema f
1e10: 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73  or only the.** s
1e20: 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63  ingle file indic
1e30: 61 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ates..*/.void sq
1e40: 6c 69 74 65 52 65 73 65 74 49 6e 74 65 72 6e 61  liteResetInterna
1e50: 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65 20 2a  lSchema(sqlite *
1e60: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
1e70: 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b  HashElem *pElem;
1e80: 0a 20 20 48 61 73 68 20 74 65 6d 70 31 3b 0a 20  .  Hash temp1;. 
1e90: 20 48 61 73 68 20 74 65 6d 70 32 3b 0a 20 20 69   Hash temp2;.  i
1ea0: 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73 73 65  nt i, j;..  asse
1eb0: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
1ec0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 64  b<db->nDb );.  d
1ed0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
1ee0: 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 3b  ITE_Initialized;
1ef0: 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c  .  for(i=iDb; i<
1f00: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
1f10: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
1f20: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 74 65  ->aDb[i];.    te
1f30: 6d 70 31 20 3d 20 70 44 62 2d 3e 74 62 6c 48 61  mp1 = pDb->tblHa
1f40: 73 68 3b 0a 20 20 20 20 74 65 6d 70 32 20 3d 20  sh;.    temp2 = 
1f50: 70 44 62 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20  pDb->trigHash;. 
1f60: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 69     sqliteHashIni
1f70: 74 28 26 70 44 62 2d 3e 74 72 69 67 48 61 73 68  t(&pDb->trigHash
1f80: 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54  , SQLITE_HASH_ST
1f90: 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73 71  RING, 0);.    sq
1fa0: 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28 26 70  liteHashClear(&p
1fb0: 44 62 2d 3e 61 46 4b 65 79 29 3b 0a 20 20 20 20  Db->aFKey);.    
1fc0: 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28  sqliteHashClear(
1fd0: 26 70 44 62 2d 3e 69 64 78 48 61 73 68 29 3b 0a  &pDb->idxHash);.
1fe0: 20 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71      for(pElem=sq
1ff0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74  liteHashFirst(&t
2000: 65 6d 70 32 29 3b 20 70 45 6c 65 6d 3b 20 70 45  emp2); pElem; pE
2010: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
2020: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
2030: 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
2040: 67 65 72 20 3d 20 73 71 6c 69 74 65 48 61 73 68  ger = sqliteHash
2050: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
2060: 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54     sqliteDeleteT
2070: 72 69 67 67 65 72 28 70 54 72 69 67 67 65 72 29  rigger(pTrigger)
2080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2090: 74 65 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d  teHashClear(&tem
20a0: 70 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 48  p2);.    sqliteH
20b0: 61 73 68 49 6e 69 74 28 26 70 44 62 2d 3e 74 62  ashInit(&pDb->tb
20c0: 6c 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41  lHash, SQLITE_HA
20d0: 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20  SH_STRING, 0);. 
20e0: 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c     for(pElem=sql
20f0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74 65  iteHashFirst(&te
2100: 6d 70 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  mp1); pElem; pEl
2110: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
2120: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20  t(pElem)){.     
2130: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
2140: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
2150: 6c 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lem);.      sqli
2160: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  teDeleteTable(db
2170: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  , pTab);.    }. 
2180: 20 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65     sqliteHashCle
2190: 61 72 28 26 74 65 6d 70 31 29 3b 0a 20 20 20 20  ar(&temp1);.    
21a0: 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
21b0: 64 62 2c 20 69 2c 20 44 42 5f 53 63 68 65 6d 61  db, i, DB_Schema
21c0: 4c 6f 61 64 65 64 29 3b 0a 20 20 20 20 69 66 28  Loaded);.    if(
21d0: 20 69 44 62 3e 30 20 29 20 72 65 74 75 72 6e 3b   iDb>0 ) return;
21e0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69  .  }.  assert( i
21f0: 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66  Db==0 );.  db->f
2200: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
2210: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a  InternChanges;..
2220: 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d    /* If one or m
2230: 6f 72 65 20 6f 66 20 74 68 65 20 61 75 78 69 6c  ore of the auxil
2240: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  iary database fi
2250: 6c 65 73 20 68 61 73 20 62 65 65 6e 20 63 6c 6f  les has been clo
2260: 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  sed,.  ** then r
2270: 65 6d 6f 76 65 20 74 68 65 6e 20 66 72 6f 6d 20  emove then from 
2280: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
2290: 74 61 62 61 73 65 20 6c 69 73 74 2e 20 20 57 65  tabase list.  We
22a0: 20 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a 20 6f   take the.  ** o
22b0: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 64 6f  pportunity to do
22c0: 20 74 68 69 73 20 68 65 72 65 20 73 69 6e 63 65   this here since
22d0: 20 77 65 20 68 61 76 65 20 6a 75 73 74 20 64 65   we have just de
22e0: 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20 74 68 65  leted all of the
22f0: 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 68 61 73  .  ** schema has
2300: 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65  h tables and the
2310: 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20 68 61  refore do not ha
2320: 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 63  ve to make any c
2330: 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 61  hanges.  ** to a
2340: 6e 79 20 6f 66 20 74 68 6f 73 65 20 74 61 62 6c  ny of those tabl
2350: 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
2360: 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  =j=2; i<db->nDb;
2370: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64   i++){.    if( d
2380: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30  b->aDb[i].pBt==0
2390: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
23a0: 46 72 65 65 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  Free(db->aDb[i].
23b0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 64 62  zName);.      db
23c0: 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  ->aDb[i].zName =
23d0: 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   0;.      contin
23e0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
23f0: 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64  ( j<i ){.      d
2400: 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e  b->aDb[j] = db->
2410: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  aDb[i];.    }.  
2420: 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d    j++;.  }.  mem
2430: 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c  set(&db->aDb[j],
2440: 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a   0, (db->nDb-j)*
2450: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a  sizeof(db->aDb[j
2460: 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d  ]));.  db->nDb =
2470: 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44   j;.  if( db->nD
2480: 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21  b<=2 && db->aDb!
2490: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
24a0: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d  {.    memcpy(db-
24b0: 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e  >aDbStatic, db->
24c0: 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62  aDb, 2*sizeof(db
24d0: 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20  ->aDb[0]));.    
24e0: 73 71 6c 69 74 65 46 72 65 65 28 64 62 2d 3e 61  sqliteFree(db->a
24f0: 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Db);.    db->aDb
2500: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
2510: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
2520: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2530: 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61  alled whenever a
2540: 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
2550: 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
2560: 0a 2a 2a 20 73 63 68 65 6d 61 20 63 68 61 6e 67  .** schema chang
2570: 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72  es during the tr
2580: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
2590: 77 65 20 68 61 76 65 20 74 6f 20 72 65 73 65 74  we have to reset
25a0: 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c   the.** internal
25b0: 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64   hash tables and
25c0: 20 72 65 6c 6f 61 64 20 74 68 65 6d 20 66 72 6f   reload them fro
25d0: 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  m disk..*/.void 
25e0: 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 49 6e  sqliteRollbackIn
25f0: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
2600: 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 69 66 28  lite *db){.  if(
2610: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
2620: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
2630: 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 52  s ){.    sqliteR
2640: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
2650: 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d  ma(db, 0);.  }.}
2660: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2670: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
2680: 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63  hen a commit occ
2690: 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
26a0: 69 74 65 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  iteCommitInterna
26b0: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20  lChanges(sqlite 
26c0: 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 61 44 62 5b  *db){.  db->aDb[
26d0: 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  0].schema_cookie
26e0: 20 3d 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b   = db->next_cook
26f0: 69 65 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  ie;.  db->flags 
2700: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
2710: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
2720: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65  ** Remove the me
2730: 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74  mory data struct
2740: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
2750: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a  with the given.*
2760: 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61  * Table.  No cha
2770: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
2780: 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f   disk by this ro
2790: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  utine..**.** Thi
27a0: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64  s routine just d
27b0: 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20  eletes the data 
27c0: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64  structure.  It d
27d0: 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a  oes not unlink.*
27e0: 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61  * the table data
27f0: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
2800: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
2810: 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d   Nor does it rem
2820: 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b  ove.** foreign k
2830: 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  eys from the sql
2840: 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74  ite.aFKey hash t
2850: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
2860: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
2870: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
2880: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
2890: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
28a0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
28b0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
28c0: 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73  *.** Indices ass
28d0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
28e0: 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e   table are unlin
28f0: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62  ked from the "db
2900: 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74  ".** data struct
2910: 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e  ure if db!=NULL.
2920: 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69    If db==NULL, i
2930: 6e 64 69 63 65 73 20 61 74 74 61 63 68 65 64 20  ndices attached 
2940: 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  to.** the table 
2950: 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74  are deleted, but
2960: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
2970: 68 65 79 20 68 61 76 65 20 61 6c 72 65 61 64 79  hey have already
2980: 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65   been.** unlinke
2990: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
29a0: 65 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  eDeleteTable(sql
29b0: 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  ite *db, Table *
29c0: 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  pTable){.  int i
29d0: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ;.  Index *pInde
29e0: 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65  x, *pNext;.  FKe
29f0: 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74  y *pFKey, *pNext
2a00: 46 4b 65 79 3b 0a 0a 20 20 69 66 28 20 70 54 61  FKey;..  if( pTa
2a10: 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ble==0 ) return;
2a20: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  ..  /* Delete al
2a30: 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  l indices associ
2a40: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74  ated with this t
2a50: 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  able.  */.  for(
2a60: 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d  pIndex = pTable-
2a70: 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
2a80: 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a   pIndex=pNext){.
2a90: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64      pNext = pInd
2aa0: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61  ex->pNext;.    a
2ab0: 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 69  ssert( pIndex->i
2ac0: 44 62 3d 3d 70 54 61 62 6c 65 2d 3e 69 44 62 20  Db==pTable->iDb 
2ad0: 7c 7c 20 28 70 54 61 62 6c 65 2d 3e 69 44 62 3d  || (pTable->iDb=
2ae0: 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e 69 44  =0 && pIndex->iD
2af0: 62 3d 3d 31 29 20 29 3b 0a 20 20 20 20 73 71 6c  b==1) );.    sql
2b00: 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64  iteDeleteIndex(d
2b10: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
2b20: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c  .  /* Delete all
2b30: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73   foreign keys as
2b40: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
2b50: 69 73 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6b  is table.  The k
2b60: 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  eys.  ** should 
2b70: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
2b80: 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  n unlinked from 
2b90: 74 68 65 20 64 62 2d 3e 61 46 4b 65 79 20 68 61  the db->aFKey ha
2ba0: 73 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a 20  sh table .  */. 
2bb0: 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61 62 6c   for(pFKey=pTabl
2bc0: 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b  e->pFKey; pFKey;
2bd0: 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79   pFKey=pNextFKey
2be0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b 65 79  ){.    pNextFKey
2bf0: 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46   = pFKey->pNextF
2c00: 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rom;.    assert(
2c10: 20 70 54 61 62 6c 65 2d 3e 69 44 62 3c 64 62 2d   pTable->iDb<db-
2c20: 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65  >nDb );.    asse
2c30: 72 74 28 20 73 71 6c 69 74 65 48 61 73 68 46 69  rt( sqliteHashFi
2c40: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70 54 61 62  nd(&db->aDb[pTab
2c50: 6c 65 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 0a  le->iDb].aFKey,.
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c70: 20 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79             pFKey
2c80: 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46  ->zTo, strlen(pF
2c90: 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46  Key->zTo)+1)!=pF
2ca0: 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  Key );.    sqlit
2cb0: 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20  eFree(pFKey);.  
2cc0: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  }..  /* Delete t
2cd0: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
2ce0: 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a  re itself..  */.
2cf0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
2d00: 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  ble->nCol; i++){
2d10: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2d20: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e  pTable->aCol[i].
2d30: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
2d40: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
2d50: 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20  Col[i].zDflt);. 
2d60: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54     sqliteFree(pT
2d70: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54  able->aCol[i].zT
2d80: 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ype);.  }.  sqli
2d90: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a  teFree(pTable->z
2da0: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  Name);.  sqliteF
2db0: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
2dc0: 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63  );.  sqliteSelec
2dd0: 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e  tDelete(pTable->
2de0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
2df0: 74 65 46 72 65 65 28 70 54 61 62 6c 65 29 3b 0a  teFree(pTable);.
2e00: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
2e10: 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20  the given table 
2e20: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
2e30: 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c  bles and the del
2e40: 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  ete the.** table
2e50: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
2e60: 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20  all its indices 
2e70: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
2e80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2e90: 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64   sqliteUnlinkAnd
2ea0: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
2eb0: 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  te *db, Table *p
2ec0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64  ){.  Table *pOld
2ed0: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a  ;.  FKey *pF1, *
2ee0: 70 46 32 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  pF2;.  int i = p
2ef0: 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65 72 74 28  ->iDb;.  assert(
2f00: 20 64 62 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64   db!=0 );.  pOld
2f10: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73   = sqliteHashIns
2f20: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e  ert(&db->aDb[i].
2f30: 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  tblHash, p->zNam
2f40: 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61  e, strlen(p->zNa
2f50: 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73  me)+1, 0);.  ass
2f60: 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20  ert( pOld==0 || 
2f70: 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 6f 72  pOld==p );.  for
2f80: 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70  (pF1=p->pFKey; p
2f90: 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65  F1; pF1=pF1->pNe
2fa0: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 69 6e 74  xtFrom){.    int
2fb0: 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46   nTo = strlen(pF
2fc0: 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20  1->zTo) + 1;.   
2fd0: 20 70 46 32 20 3d 20 73 71 6c 69 74 65 48 61 73   pF2 = sqliteHas
2fe0: 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 69  hFind(&db->aDb[i
2ff0: 5d 2e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54  ].aFKey, pF1->zT
3000: 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 69 66 28  o, nTo);.    if(
3010: 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20   pF2==pF1 ){.   
3020: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73     sqliteHashIns
3030: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e  ert(&db->aDb[i].
3040: 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c  aFKey, pF1->zTo,
3050: 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78 74   nTo, pF1->pNext
3060: 54 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  To);.    }else{.
3070: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 32        while( pF2
3080: 20 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f   && pF2->pNextTo
3090: 21 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32  !=pF1 ){ pF2=pF2
30a0: 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20  ->pNextTo; }.   
30b0: 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a 20 20     if( pF2 ){.  
30c0: 20 20 20 20 20 20 70 46 32 2d 3e 70 4e 65 78 74        pF2->pNext
30d0: 54 6f 20 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54  To = pF1->pNextT
30e0: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
30f0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 6c  .  }.  sqliteDel
3100: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b  eteTable(db, p);
3110: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
3120: 75 63 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  uct the name of 
3130: 61 20 75 73 65 72 20 74 61 62 6c 65 20 6f 72 20  a user table or 
3140: 69 6e 64 65 78 20 66 72 6f 6d 20 61 20 74 6f 6b  index from a tok
3150: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  en..**.** Space 
3160: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65  to hold the name
3170: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
3180: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
3190: 20 61 6e 64 20 6d 75 73 74 0a 2a 2a 20 62 65 20   and must.** be 
31a0: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
31b0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
31c0: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 54 61  /.char *sqliteTa
31d0: 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  bleNameFromToken
31e0: 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a  (Token *pName){.
31f0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
3200: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e  sqliteStrNDup(pN
3210: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
3220: 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f  );.  sqliteDequo
3230: 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  te(zName);.  ret
3240: 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  urn zName;.}../*
3250: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
3260: 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 61 70  e to open the ap
3270: 70 72 6f 70 72 69 61 74 65 20 6d 61 73 74 65 72  propriate master
3280: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 74 61 62   table.  The tab
3290: 6c 65 0a 2a 2a 20 6f 70 65 6e 65 64 20 77 69 6c  le.** opened wil
32a0: 6c 20 62 65 20 53 51 4c 49 54 45 5f 4d 41 53 54  l be SQLITE_MAST
32b0: 45 52 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  ER for persisten
32c0: 74 20 74 61 62 6c 65 73 20 61 6e 64 20 0a 2a 2a  t tables and .**
32d0: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 4d 41 53   SQLITE_TEMP_MAS
32e0: 54 45 52 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  TER for temporar
32f0: 79 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 74  y tables.  The t
3300: 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 0a 2a  able is opened.*
3310: 2a 20 6f 6e 20 63 75 72 73 6f 72 20 30 2e 0a 2a  * on cursor 0..*
3320: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 4f 70 65  /.void sqliteOpe
3330: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 56 64 62  nMasterTable(Vdb
3340: 65 20 2a 76 2c 20 69 6e 74 20 69 73 54 65 6d 70  e *v, int isTemp
3350: 29 7b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  ){.  sqliteVdbeA
3360: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
3370: 65 72 2c 20 69 73 54 65 6d 70 2c 20 30 29 3b 0a  er, isTemp, 0);.
3380: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3390: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  p(v, OP_OpenWrit
33a0: 65 2c 20 30 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a  e, 0, 2);.}../*.
33b0: 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75  ** Begin constru
33c0: 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  cting a new tabl
33d0: 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
33e0: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
33f0: 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  s is.** the firs
3400: 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74  t of several act
3410: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ion routines tha
3420: 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20  t get called in 
3430: 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61  response.** to a
3440: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
3450: 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72  atement.  In par
3460: 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f  ticular, this ro
3470: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a  utine is called.
3480: 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20  ** after seeing 
3490: 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20  tokens "CREATE" 
34a0: 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20  and "TABLE" and 
34b0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  the table name. 
34c0: 20 54 68 65 0a 2a 2a 20 70 53 74 61 72 74 20 74   The.** pStart t
34d0: 6f 6b 65 6e 20 69 73 20 74 68 65 20 43 52 45 41  oken is the CREA
34e0: 54 45 20 61 6e 64 20 70 4e 61 6d 65 20 69 73 20  TE and pName is 
34f0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  the table name. 
3500: 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66   The isTemp.** f
3510: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
3520: 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  he table should 
3530: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
3540: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
3550: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74  ase.** file inst
3560: 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61  ead of in the ma
3570: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
3580: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
3590: 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20  lly the case.** 
35a0: 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20  when the "TEMP" 
35b0: 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b  or "TEMPORARY" k
35c0: 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e  eyword occurs in
35d0: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41   between.** CREA
35e0: 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a  TE and TABLE..**
35f0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c  .** The new tabl
3600: 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74  e record is init
3610: 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20  ialized and put 
3620: 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  in pParse->pNewT
3630: 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65  able..** As more
3640: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
3650: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
3660: 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69  s parsed, additi
3670: 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72  onal action.** r
3680: 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20  outines will be 
3690: 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f  called to add mo
36a0: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  re information t
36b0: 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a  o this record..*
36c0: 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
36d0: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
36e0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
36f0: 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 29  sqliteEndTable()
3700: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
3710: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74  alled to complet
3720: 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69  e the constructi
3730: 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  on of the new ta
3740: 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76  ble record..*/.v
3750: 6f 69 64 20 73 71 6c 69 74 65 53 74 61 72 74 54  oid sqliteStartT
3760: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
3770: 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
3780: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
3790: 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
37a0: 20 2f 2a 20 54 68 65 20 22 43 52 45 41 54 45 22   /* The "CREATE"
37b0: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65   token */.  Toke
37c0: 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f 2a 20  n *pName,    /* 
37d0: 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72  Name of table or
37e0: 20 76 69 65 77 20 74 6f 20 63 72 65 61 74 65 20   view to create 
37f0: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c  */.  int isTemp,
3800: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3810: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20   this is a TEMP 
3820: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
3830: 73 56 69 65 77 20 20 20 20 20 20 20 2f 2a 20 54  sView       /* T
3840: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
3850: 20 56 49 45 57 20 2a 2f 0a 29 7b 0a 20 20 54 61   VIEW */.){.  Ta
3860: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49  ble *pTable;.  I
3870: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 63 68  ndex *pIdx;.  ch
3880: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c  ar *zName;.  sql
3890: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
38a0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ->db;.  Vdbe *v;
38b0: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 70  .  int iDb;..  p
38c0: 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b  Parse->sFirstTok
38d0: 65 6e 20 3d 20 2a 70 53 74 61 72 74 3b 0a 20 20  en = *pStart;.  
38e0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61  zName = sqliteTa
38f0: 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  bleNameFromToken
3900: 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  (pName);.  if( z
3910: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
3920: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
3930: 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20  iDb==1 ) isTemp 
3940: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
3950: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
3960: 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28  ZATION.  assert(
3970: 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69   (isTemp & 1)==i
3980: 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20  sTemp );.  {.   
3990: 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63   int code;.    c
39a0: 68 61 72 20 2a 7a 44 62 20 3d 20 69 73 54 65 6d  har *zDb = isTem
39b0: 70 20 3f 20 22 74 65 6d 70 22 20 3a 20 22 6d 61  p ? "temp" : "ma
39c0: 69 6e 22 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  in";.    if( sql
39d0: 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61  iteAuthCheck(pPa
39e0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
39f0: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
3a00: 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62  (isTemp), 0, zDb
3a10: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
3a20: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
3a30: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
3a40: 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
3a50: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
3a60: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
3a70: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
3a80: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  EATE_TEMP_VIEW;.
3a90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3aa0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
3ab0: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a  TE_CREATE_VIEW;.
3ac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
3ad0: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54  e{.      if( isT
3ae0: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63  emp ){.        c
3af0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
3b00: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ATE_TEMP_TABLE;.
3b10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3b20: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
3b30: 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b  TE_CREATE_TABLE;
3b40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3b50: 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74     if( sqliteAut
3b60: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
3b70: 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a  ode, zName, 0, z
3b80: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Db) ){.      sql
3b90: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
3ba0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
3bb0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
3bc0: 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 72  ..  /* Before tr
3bd0: 79 69 6e 67 20 74 6f 20 63 72 65 61 74 65 20 61  ying to create a
3be0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
3bf0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
3c00: 42 74 72 65 65 20 66 6f 72 0a 20 20 2a 2a 20 68  Btree for.  ** h
3c10: 6f 6c 64 69 6e 67 20 74 65 6d 70 6f 72 61 72 79  olding temporary
3c20: 20 74 61 62 6c 65 73 20 69 73 20 6f 70 65 6e 2e   tables is open.
3c30: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65  .  */.  if( isTe
3c40: 6d 70 20 26 26 20 64 62 2d 3e 61 44 62 5b 31 5d  mp && db->aDb[1]
3c50: 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72  .pBt==0 && !pPar
3c60: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
3c70: 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
3c80: 74 65 42 74 72 65 65 46 61 63 74 6f 72 79 28 64  teBtreeFactory(d
3c90: 62 2c 20 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47  b, 0, 0, MAX_PAG
3ca0: 45 53 2c 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e  ES, &db->aDb[1].
3cb0: 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pBt);.    if( rc
3cc0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
3cd0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
3ce0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
3cf0: 72 72 4d 73 67 2c 20 22 75 6e 61 62 6c 65 20 74  rrMsg, "unable t
3d00: 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
3d10: 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20  ry database ".  
3d20: 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20        "file for 
3d30: 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72  storing temporar
3d40: 79 20 74 61 62 6c 65 73 22 2c 20 30 29 3b 0a 20  y tables", 0);. 
3d50: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
3d60: 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r++;.      retur
3d70: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
3d80: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
3d90: 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20  ITE_InTrans ){. 
3da0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
3db0: 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
3dc0: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b  db->aDb[1].pBt);
3dd0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
3de0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
3df0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
3e00: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
3e10: 72 72 4d 73 67 2c 20 22 75 6e 61 62 6c 65 20 74  rrMsg, "unable t
3e20: 6f 20 67 65 74 20 61 20 77 72 69 74 65 20 6c 6f  o get a write lo
3e30: 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20 20 20  ck on ".        
3e40: 20 20 22 74 68 65 20 74 65 6d 70 6f 72 61 72 79    "the temporary
3e50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c   database file",
3e60: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
3e70: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
3e80: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
3e90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
3ea0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
3eb0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d  he new table nam
3ec0: 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69  e does not colli
3ed0: 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74  de with an exist
3ee0: 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  ing.  ** index o
3ef0: 72 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 49  r table name.  I
3f00: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
3f10: 73 73 61 67 65 20 69 66 20 69 74 20 64 6f 65 73  ssage if it does
3f20: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ..  **.  ** If w
3f30: 65 20 61 72 65 20 72 65 2d 72 65 61 64 69 6e 67  e are re-reading
3f40: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
3f50: 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65  er table because
3f60: 20 6f 66 20 61 20 73 63 68 65 6d 61 0a 20 20 2a   of a schema.  *
3f70: 2a 20 63 68 61 6e 67 65 20 61 6e 64 20 61 20 6e  * change and a n
3f80: 65 77 20 70 65 72 6d 61 6e 65 6e 74 20 74 61 62  ew permanent tab
3f90: 6c 65 20 69 73 20 66 6f 75 6e 64 20 77 68 6f 73  le is found whos
3fa0: 65 20 6e 61 6d 65 20 63 6f 6c 6c 69 64 65 73 20  e name collides 
3fb0: 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 65 78 69  with.  ** an exi
3fc0: 73 74 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20  sting temporary 
3fd0: 74 61 62 6c 65 2c 20 74 68 61 74 20 69 73 20 6e  table, that is n
3fe0: 6f 74 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a  ot an error..  *
3ff0: 2f 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  /.  pTable = sql
4000: 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  iteFindTable(db,
4010: 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 44   zName, 0);.  iD
4020: 62 20 3d 20 69 73 54 65 6d 70 20 3f 20 31 20 3a  b = isTemp ? 1 :
4030: 20 70 50 61 72 73 65 2d 3e 69 44 62 3b 0a 20 20   pParse->iDb;.  
4040: 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 26 26  if( pTable!=0 &&
4050: 20 28 70 54 61 62 6c 65 2d 3e 69 44 62 3d 3d 69   (pTable->iDb==i
4060: 44 62 20 7c 7c 20 21 70 50 61 72 73 65 2d 3e 69  Db || !pParse->i
4070: 6e 69 74 46 6c 61 67 29 20 29 7b 0a 20 20 20 20  nitFlag) ){.    
4080: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
4090: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
40a0: 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 30 2c 20  g, "table ", 0, 
40b0: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
40c0: 3e 6e 2c 0a 20 20 20 20 20 20 20 20 22 20 61 6c  >n,.        " al
40d0: 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 30  ready exists", 0
40e0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
40f0: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
4100: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
4110: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
4120: 0a 20 20 69 66 28 20 28 70 49 64 78 20 3d 20 73  .  if( (pIdx = s
4130: 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64  qliteFindIndex(d
4140: 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30  b, zName, 0))!=0
4150: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 28 70   &&.          (p
4160: 49 64 78 2d 3e 69 44 62 3d 3d 30 20 7c 7c 20 21  Idx->iDb==0 || !
4170: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
4180: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  ) ){.    sqliteS
4190: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
41a0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 68 65 72  ->zErrMsg, "ther
41b0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
41c0: 69 6e 64 65 78 20 6e 61 6d 65 64 20 22 2c 20 0a  index named ", .
41d0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30 29         zName, 0)
41e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
41f0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 50 61  (zName);.    pPa
4200: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
4210: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
4220: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61  Table = sqliteMa
4230: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62  lloc( sizeof(Tab
4240: 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61  le) );.  if( pTa
4250: 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ble==0 ){.    sq
4260: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
4270: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
4280: 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  .  pTable->zName
4290: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62   = zName;.  pTab
42a0: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->nCol = 0;.  
42b0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30  pTable->aCol = 0
42c0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65  ;.  pTable->iPKe
42d0: 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65  y = -1;.  pTable
42e0: 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  ->pIndex = 0;.  
42f0: 70 54 61 62 6c 65 2d 3e 69 44 62 20 3d 20 69 44  pTable->iDb = iD
4300: 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  b;.  if( pParse-
4310: 3e 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c  >pNewTable ) sql
4320: 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 64  iteDeleteTable(d
4330: 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  b, pParse->pNewT
4340: 61 62 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d  able);.  pParse-
4350: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61  >pNewTable = pTa
4360: 62 6c 65 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  ble;..  /* Begin
4370: 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
4380: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
4390: 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20  nsert the table 
43a0: 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a  record into.  **
43b0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
43c0: 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20  ER table.  Note 
43d0: 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68  in particular th
43e0: 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68  at we must go ah
43f0: 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c  ead.  ** and all
4400: 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64  ocate the record
4410: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
4420: 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e  table entry now.
4430: 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a    Before any.  *
4440: 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  * PRIMARY KEY or
4450: 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73   UNIQUE keywords
4460: 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68   are parsed.  Th
4470: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c  ose keywords wil
4480: 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64  l cause.  ** ind
4490: 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74  ices to be creat
44a0: 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  ed and the table
44b0: 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d   record must com
44c0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20  e before the .  
44d0: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e  ** indices.  Hen
44e0: 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ce, the record n
44f0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
4500: 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  ble must be allo
4510: 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a  cated.  ** now..
4520: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72    */.  if( !pPar
4530: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26 20  se->initFlag && 
4540: 28 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64  (v = sqliteGetVd
4550: 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29  be(pParse))!=0 )
4560: 7b 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67 69  {.    sqliteBegi
4570: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
4580: 70 50 61 72 73 65 2c 20 30 2c 20 69 73 54 65 6d  pParse, 0, isTem
4590: 70 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 54  p);.    if( !isT
45a0: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  emp ){.      sql
45b0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
45c0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e  OP_Integer, db->
45d0: 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 30 29 3b  file_format, 0);
45e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
45f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
4600: 43 6f 6f 6b 69 65 2c 20 30 2c 20 31 29 3b 0a 20  Cookie, 0, 1);. 
4610: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 4f     }.    sqliteO
4620: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76  penMasterTable(v
4630: 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 73  , isTemp);.    s
4640: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4650: 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30  , OP_NewRecno, 0
4660: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4670: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4680: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
4690: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
46a0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
46b0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
46c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
46d0: 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b  utIntKey, 0, 0);
46e0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
46f0: 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74  d a new column t
4700: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
4710: 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
4720: 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  tructed..**.** T
4730: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
4740: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63  this routine onc
4750: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
4760: 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a  n declaration.**
4770: 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
4780: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73  LE statement.  s
4790: 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c 65 28  qliteStartTable(
47a0: 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a  ) gets called.**
47b0: 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68   first to get th
47c0: 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65  ings going.  The
47d0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
47e0: 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63  s called for eac
47f0: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  h.** column..*/.
4800: 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 43 6f  void sqliteAddCo
4810: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
4820: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
4830: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
4840: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
4850: 7a 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20  z = 0;.  Column 
4860: 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20  *pCol;.  if( (p 
4870: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
4880: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
4890: 3b 0a 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74  ;.  sqliteSetNSt
48a0: 72 69 6e 67 28 26 7a 2c 20 70 4e 61 6d 65 2d 3e  ring(&z, pName->
48b0: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b  z, pName->n, 0);
48c0: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
48d0: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 44 65  turn;.  sqliteDe
48e0: 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28  quote(z);.  for(
48f0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
4900: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
4910: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c 20 70  liteStrICmp(z, p
4920: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
4930: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
4940: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
4950: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
4960: 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e  duplicate column
4970: 20 6e 61 6d 65 3a 20 22 2c 20 7a 2c 20 30 29 3b   name: ", z, 0);
4980: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
4990: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  Err++;.      sql
49a0: 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20  iteFree(z);.    
49b0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
49c0: 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43    }.  if( (p->nC
49d0: 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a  ol & 0x7)==0 ){.
49e0: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77      Column *aNew
49f0: 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c  ;.    aNew = sql
4a00: 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e 61  iteRealloc( p->a
4a10: 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29  Col, (p->nCol+8)
4a20: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b  *sizeof(p->aCol[
4a30: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  0]));.    if( aN
4a40: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ew==0 ) return;.
4a50: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e      p->aCol = aN
4a60: 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d  ew;.  }.  pCol =
4a70: 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f   &p->aCol[p->nCo
4a80: 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f  l];.  memset(pCo
4a90: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  l, 0, sizeof(p->
4aa0: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f  aCol[0]));.  pCo
4ab0: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 20  l->zName = z;.  
4ac0: 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72 20  pCol->sortOrder 
4ad0: 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b  = SQLITE_SO_NUM;
4ae0: 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a  .  p->nCol++;.}.
4af0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4b00: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
4b10: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
4b20: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
4b30: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
4b40: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
4b50: 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20  tement.  A "NOT 
4b60: 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74  NULL" constraint
4b70: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65   has.** been see
4b80: 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20  n on a column.  
4b90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
4ba0: 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c  s the notNull fl
4bb0: 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c  ag on.** the col
4bc0: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
4bd0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
4be0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4bf0: 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65  AddNotNull(Parse
4c00: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e   *pParse, int on
4c10: 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20  Error){.  Table 
4c20: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  *p;.  int i;.  i
4c30: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
4c40: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
4c50: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
4c60: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69  >nCol-1;.  if( i
4c70: 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d  >=0 ) p->aCol[i]
4c80: 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72  .notNull = onErr
4c90: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  or;.}../*.** Thi
4ca0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
4cb0: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
4cc0: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
4cd0: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
4ce0: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
4cf0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  LE statement.  T
4d00: 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20  he pFirst token 
4d10: 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
4d20: 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71  token in the seq
4d30: 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20  uence of tokens 
4d40: 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68  that describe th
4d50: 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a  e type of the.**
4d60: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
4d70: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
4d80: 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73  tion.   pLast is
4d90: 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a   the last token.
4da0: 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e  ** in the sequen
4db0: 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e  ce.  Use this in
4dc0: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e  formation to con
4dd0: 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a  struct a string.
4de0: 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ** that contains
4df0: 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66   the typename of
4e00: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   the column and 
4e10: 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e  store that strin
4e20: 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a  g.** in zType..*
4e30: 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64  / .void sqliteAd
4e40: 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73  dColumnType(Pars
4e50: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
4e60: 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e 20   *pFirst, Token 
4e70: 2a 70 4c 61 73 74 29 7b 0a 20 20 54 61 62 6c 65  *pLast){.  Table
4e80: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b   *p;.  int i, j;
4e90: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72  .  int n;.  char
4ea0: 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20 20 43 6f 6c   *z, **pz;.  Col
4eb0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28  umn *pCol;.  if(
4ec0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
4ed0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
4ee0: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
4ef0: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30  Col-1;.  if( i<0
4f00: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f   ) return;.  pCo
4f10: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b  l = &p->aCol[i];
4f20: 0a 20 20 70 7a 20 3d 20 26 70 43 6f 6c 2d 3e 7a  .  pz = &pCol->z
4f30: 54 79 70 65 3b 0a 20 20 6e 20 3d 20 70 4c 61 73  Type;.  n = pLas
4f40: 74 2d 3e 6e 20 2b 20 41 64 64 72 28 70 4c 61 73  t->n + Addr(pLas
4f50: 74 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 46 69  t->z) - Addr(pFi
4f60: 72 73 74 2d 3e 7a 29 3b 0a 20 20 73 71 6c 69 74  rst->z);.  sqlit
4f70: 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20  eSetNString(pz, 
4f80: 70 46 69 72 73 74 2d 3e 7a 2c 20 6e 2c 20 30 29  pFirst->z, n, 0)
4f90: 3b 0a 20 20 7a 20 3d 20 2a 70 7a 3b 0a 20 20 69  ;.  z = *pz;.  i
4fa0: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
4fb0: 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a  ;.  for(i=j=0; z
4fc0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  [i]; i++){.    i
4fd0: 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20  nt c = z[i];.   
4fe0: 20 69 66 28 20 69 73 73 70 61 63 65 28 63 29 20   if( isspace(c) 
4ff0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
5000: 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a  z[j++] = c;.  }.
5010: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 69 66    z[j] = 0;.  if
5020: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69  ( pParse->db->fi
5030: 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a  le_format>=4 ){.
5040: 20 20 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72      pCol->sortOr
5050: 64 65 72 20 3d 20 73 71 6c 69 74 65 43 6f 6c 6c  der = sqliteColl
5060: 61 74 65 54 79 70 65 28 7a 2c 20 6e 29 3b 0a 20  ateType(z, n);. 
5070: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c   }else{.    pCol
5080: 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51  ->sortOrder = SQ
5090: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 7d  LITE_SO_NUM;.  }
50a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67 69  .}../*.** The gi
50b0: 76 65 6e 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  ven token is the
50c0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
50d0: 6f 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  or the last colu
50e0: 6d 6e 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74  mn added to.** t
50f0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
5100: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
5110: 63 74 69 6f 6e 2e 20 20 49 66 20 22 6d 69 6e 75  ction.  If "minu
5120: 73 46 6c 61 67 22 20 69 73 20 74 72 75 65 2c 20  sFlag" is true, 
5130: 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20  it.** means the 
5140: 76 61 6c 75 65 20 74 6f 6b 65 6e 20 77 61 73 20  value token was 
5150: 70 72 65 63 65 64 65 64 20 62 79 20 61 20 6d 69  preceded by a mi
5160: 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20  nus sign..**.** 
5170: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5180: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
5190: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
51a0: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
51b0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
51c0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
51d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41  .*/.void sqliteA
51e0: 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50  ddDefaultValue(P
51f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
5200: 6b 65 6e 20 2a 70 56 61 6c 2c 20 69 6e 74 20 6d  ken *pVal, int m
5210: 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20 54 61 62  inusFlag){.  Tab
5220: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
5230: 20 20 63 68 61 72 20 2a 2a 70 7a 3b 0a 20 20 69    char **pz;.  i
5240: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
5250: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
5260: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
5270: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69  >nCol-1;.  if( i
5280: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <0 ) return;.  p
5290: 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  z = &p->aCol[i].
52a0: 7a 44 66 6c 74 3b 0a 20 20 69 66 28 20 6d 69 6e  zDflt;.  if( min
52b0: 75 73 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71  usFlag ){.    sq
52c0: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70  liteSetNString(p
52d0: 7a 2c 20 22 2d 22 2c 20 31 2c 20 70 56 61 6c 2d  z, "-", 1, pVal-
52e0: 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b  >z, pVal->n, 0);
52f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
5300: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70  liteSetNString(p
5310: 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c  z, pVal->z, pVal
5320: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  ->n, 0);.  }.  s
5330: 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a  qliteDequote(*pz
5340: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69  );.}../*.** Desi
5350: 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41 52  gnate the PRIMAR
5360: 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61  Y KEY for the ta
5370: 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61  ble.  pList is a
5380: 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a   list of names .
5390: 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68  ** of columns th
53a0: 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d  at form the prim
53b0: 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69  ary key.  If pLi
53c0: 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  st is NULL, then
53d0: 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63   the.** most rec
53e0: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
53f0: 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  mn of the table 
5400: 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  is the primary k
5410: 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c  ey..**.** A tabl
5420: 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f  e can have at mo
5430: 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b  st one primary k
5440: 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c  ey.  If the tabl
5450: 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a  e already has.**
5460: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28   a primary key (
5470: 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
5480: 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b  second primary k
5490: 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65 20  ey) then create 
54a0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a  an.** error..**.
54b0: 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52  ** If the PRIMAR
54c0: 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69  Y KEY is on a si
54d0: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73  ngle column whos
54e0: 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49 4e  e datatype is IN
54f0: 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77  TEGER,.** then w
5500: 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73  e will try to us
5510: 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73  e that column as
5520: 20 74 68 65 20 72 6f 77 20 69 64 2e 20 20 28 45   the row id.  (E
5530: 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a 20 46 6f 72  xception:.** For
5540: 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
5550: 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c  tibility with ol
5560: 64 65 72 20 64 61 74 61 62 61 73 65 73 2c 20 64  der databases, d
5570: 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 2a 2a  o not do this.**
5580: 20 69 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   if the file for
5590: 6d 61 74 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  mat version numb
55a0: 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
55b0: 31 2e 29 20 20 53 65 74 20 74 68 65 20 54 61 62  1.)  Set the Tab
55c0: 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c  le.iPKey.** fiel
55d0: 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75  d of the table u
55e0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
55f0: 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65  n to be the inde
5600: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45  x of the.** INTE
5610: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
5620: 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69  column.  Table.i
5630: 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d  PKey is set to -
5640: 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  1 if there is.**
5650: 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d   no INTEGER PRIM
5660: 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49  ARY KEY..**.** I
5670: 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74  f the key is not
5680: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
5690: 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72  ARY KEY, then cr
56a0: 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a  eate a unique.**
56b0: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b   index for the k
56c0: 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73  ey.  No index is
56d0: 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54   created for INT
56e0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
56f0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
5700: 65 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 50  eAddPrimaryKey(P
5710: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 64  arse *pParse, Id
5720: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74  List *pList, int
5730: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
5740: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
5750: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
5760: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b  char *zType = 0;
5770: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31  .  int iCol = -1
5780: 2c 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  , i;.  if( pTab=
5790: 3d 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72  =0 ) goto primar
57a0: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66  y_key_exit;.  if
57b0: 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b  ( pTab->hasPrimK
57c0: 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
57d0: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
57e0: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62  e->zErrMsg, "tab
57f0: 6c 65 20 5c 22 22 2c 20 70 54 61 62 2d 3e 7a 4e  le \"", pTab->zN
5800: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 22 5c  ame, .        "\
5810: 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  " has more than 
5820: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22  one primary key"
5830: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
5840: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
5850: 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  to primary_key_e
5860: 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  xit;.  }.  pTab-
5870: 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b  >hasPrimKey = 1;
5880: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
5890: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54  ){.    iCol = pT
58a0: 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  ab->nCol - 1;.  
58b0: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f    pTab->aCol[iCo
58c0: 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31  l].isPrimKey = 1
58d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
58e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
58f0: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
5900: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
5910: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
5920: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
5930: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
5940: 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
5950: 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ame, pTab->aCol[
5960: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  iCol].zName)==0 
5970: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
5980: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
5990: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 20 70 54 61  pTab->nCol ) pTa
59a0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73  b->aCol[iCol].is
59b0: 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20  PrimKey = 1;.   
59c0: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74   }.    if( pList
59d0: 2d 3e 6e 49 64 3e 31 20 29 20 69 43 6f 6c 20 3d  ->nId>1 ) iCol =
59e0: 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69   -1;.  }.  if( i
59f0: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
5a00: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
5a10: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
5a20: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
5a30: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
5a40: 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d  e->db->file_form
5a50: 61 74 3e 3d 31 20 26 26 20 0a 20 20 20 20 20 20  at>=1 && .      
5a60: 20 20 20 20 20 7a 54 79 70 65 20 26 26 20 73 71       zType && sq
5a70: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 54 79 70  liteStrICmp(zTyp
5a80: 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30  e, "INTEGER")==0
5a90: 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50   ){.    pTab->iP
5aa0: 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  Key = iCol;.    
5ab0: 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20  pTab->keyConf = 
5ac0: 6f 6e 45 72 72 6f 72 3b 0a 20 20 7d 65 6c 73 65  onError;.  }else
5ad0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 43 72 65 61  {.    sqliteCrea
5ae0: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  teIndex(pParse, 
5af0: 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45  0, 0, pList, onE
5b00: 72 72 6f 72 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  rror, 0, 0, 0);.
5b10: 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20      pList = 0;. 
5b20: 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f   }..primary_key_
5b30: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 49 64  exit:.  sqliteId
5b40: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
5b50: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
5b60: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5b70: 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c   appropriate col
5b80: 6c 61 74 69 6e 67 20 74 79 70 65 20 67 69 76 65  lating type give
5b90: 6e 20 61 20 74 79 70 65 20 6e 61 6d 65 2e 0a 2a  n a type name..*
5ba0: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  *.** The collati
5bb0: 6f 6e 20 74 79 70 65 20 69 73 20 74 65 78 74 20  on type is text 
5bc0: 28 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 29  (SQLITE_SO_TEXT)
5bd0: 20 69 66 20 74 68 65 20 74 79 70 65 0a 2a 2a 20   if the type.** 
5be0: 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  name contains th
5bf0: 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72 65  e character stre
5c00: 61 6d 20 22 74 65 78 74 22 20 6f 72 20 22 62 6c  am "text" or "bl
5c10: 6f 62 22 20 6f 72 0a 2a 2a 20 22 63 6c 6f 62 22  ob" or.** "clob"
5c20: 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 74 79 70  .  Any other typ
5c30: 65 20 6e 61 6d 65 20 69 73 20 63 6f 6c 6c 61 74  e name is collat
5c40: 65 64 20 61 73 20 6e 75 6d 65 72 69 63 0a 2a 2a  ed as numeric.**
5c50: 20 28 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 29   (SQLITE_SO_NUM)
5c60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 43  ..*/.int sqliteC
5c70: 6f 6c 6c 61 74 65 54 79 70 65 28 63 6f 6e 73 74  ollateType(const
5c80: 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e   char *zType, in
5c90: 74 20 6e 54 79 70 65 29 7b 0a 20 20 69 6e 74 20  t nType){.  int 
5ca0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
5cb0: 6e 54 79 70 65 2d 31 3b 20 69 2b 2b 29 7b 0a 20  nType-1; i++){. 
5cc0: 20 20 20 73 77 69 74 63 68 28 20 7a 54 79 70 65     switch( zType
5cd0: 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 63 61 73  [i] ){.      cas
5ce0: 65 20 27 62 27 3a 0a 20 20 20 20 20 20 63 61 73  e 'b':.      cas
5cf0: 65 20 27 42 27 3a 20 7b 0a 20 20 20 20 20 20 20  e 'B': {.       
5d00: 20 69 66 28 20 69 3c 6e 54 79 70 65 2d 33 20 26   if( i<nType-3 &
5d10: 26 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70  & sqliteStrNICmp
5d20: 28 26 7a 54 79 70 65 5b 69 5d 2c 22 62 6c 6f 62  (&zType[i],"blob
5d30: 22 2c 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",4)==0 ){.     
5d40: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
5d50: 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20  TE_SO_TEXT;.    
5d60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
5d70: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5d80: 20 20 20 63 61 73 65 20 27 63 27 3a 0a 20 20 20     case 'c':.   
5d90: 20 20 20 63 61 73 65 20 27 43 27 3a 20 7b 0a 20     case 'C': {. 
5da0: 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 54 79         if( i<nTy
5db0: 70 65 2d 33 20 26 26 20 28 73 71 6c 69 74 65 53  pe-3 && (sqliteS
5dc0: 74 72 4e 49 43 6d 70 28 26 7a 54 79 70 65 5b 69  trNICmp(&zType[i
5dd0: 5d 2c 22 63 68 61 72 22 2c 34 29 3d 3d 30 20 7c  ],"char",4)==0 |
5de0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
5e00: 69 74 65 53 74 72 4e 49 43 6d 70 28 26 7a 54 79  iteStrNICmp(&zTy
5e10: 70 65 5b 69 5d 2c 22 63 6c 6f 62 22 2c 34 29 3d  pe[i],"clob",4)=
5e20: 3d 30 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  =0).        ){. 
5e30: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
5e40: 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a  SQLITE_SO_TEXT;.
5e50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5e60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5e70: 0a 20 20 20 20 20 20 63 61 73 65 20 27 78 27 3a  .      case 'x':
5e80: 0a 20 20 20 20 20 20 63 61 73 65 20 27 58 27 3a  .      case 'X':
5e90: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   {.        if( i
5ea0: 3e 3d 32 20 26 26 20 73 71 6c 69 74 65 53 74 72  >=2 && sqliteStr
5eb0: 4e 49 43 6d 70 28 26 7a 54 79 70 65 5b 69 2d 32  NICmp(&zType[i-2
5ec0: 5d 2c 22 74 65 78 74 22 2c 34 29 3d 3d 30 20 29  ],"text",4)==0 )
5ed0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
5ee0: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58  rn SQLITE_SO_TEX
5ef0: 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
5f00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5f10: 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c    }.      defaul
5f20: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 62 72 65  t: {.        bre
5f30: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5f40: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
5f50: 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 7d 0a  QLITE_SO_NUM;.}.
5f60: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
5f70: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
5f80: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
5f90: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
5fa0: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
5fb0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
5fc0: 74 65 6d 65 6e 74 2e 20 20 41 20 22 43 4f 4c 4c  tement.  A "COLL
5fd0: 41 54 45 22 20 63 6c 61 75 73 65 20 68 61 73 0a  ATE" clause has.
5fe0: 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20  ** been seen on 
5ff0: 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20  a column.  This 
6000: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
6010: 20 43 6f 6c 75 6d 6e 2e 73 6f 72 74 4f 72 64 65   Column.sortOrde
6020: 72 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  r on.** the colu
6030: 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  mn currently und
6040: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
6050: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41  .*/.void sqliteA
6060: 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61  ddCollateType(Pa
6070: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
6080: 20 63 6f 6c 6c 54 79 70 65 29 7b 0a 20 20 54 61   collType){.  Ta
6090: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
60a0: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
60b0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
60c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
60d0: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69  = p->nCol-1;.  i
60e0: 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f  f( i>=0 ) p->aCo
60f0: 6c 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  l[i].sortOrder =
6100: 20 63 6f 6c 6c 54 79 70 65 3b 0a 7d 0a 0a 2f 2a   collType;.}../*
6110: 0a 2a 2a 20 43 6f 6d 65 20 75 70 20 77 69 74 68  .** Come up with
6120: 20 61 20 6e 65 77 20 72 61 6e 64 6f 6d 20 76 61   a new random va
6130: 6c 75 65 20 66 6f 72 20 74 68 65 20 73 63 68 65  lue for the sche
6140: 6d 61 20 63 6f 6f 6b 69 65 2e 20 20 4d 61 6b 65  ma cookie.  Make
6150: 20 73 75 72 65 0a 2a 2a 20 74 68 65 20 6e 65 77   sure.** the new
6160: 20 76 61 6c 75 65 20 69 73 20 64 69 66 66 65 72   value is differ
6170: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 6c 64  ent from the old
6180: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65  ..**.** The sche
6190: 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65  ma cookie is use
61a0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  d to determine w
61b0: 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66  hen the schema f
61c0: 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  or the.** databa
61d0: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74  se changes.  Aft
61e0: 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20 63  er each schema c
61f0: 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69  hange, the cooki
6200: 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67  e value.** chang
6210: 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63  es.  When a proc
6220: 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73 20  ess first reads 
6230: 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72 65  the schema it re
6240: 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f  cords the.** coo
6250: 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65 72  kie.  Thereafter
6260: 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f  , whenever it go
6270: 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  es to access the
6280: 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74   database,.** it
6290: 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b   checks the cook
62a0: 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ie to make sure 
62b0: 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e  the schema has n
62c0: 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69  ot changed.** si
62d0: 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20  nce it was last 
62e0: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  read..**.** This
62f0: 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d   plan is not com
6300: 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70  pletely bullet-p
6310: 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73  roof.  It is pos
6320: 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65  sible for.** the
6330: 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67   schema to chang
6340: 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  e multiple times
6350: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f   and for the coo
6360: 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74  kie to be.** set
6370: 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76   back to prior v
6380: 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d  alue.  But schem
6390: 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e  a changes are in
63a0: 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20  frequent.** and 
63b0: 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20  the probability 
63c0: 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20 73  of hitting the s
63d0: 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  ame cookie value
63e0: 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68   is only.** 1 ch
63f0: 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53  ance in 2^32.  S
6400: 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f  o we're safe eno
6410: 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ugh..*/.void sql
6420: 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  iteChangeCookie(
6430: 73 71 6c 69 74 65 20 2a 64 62 2c 20 56 64 62 65  sqlite *db, Vdbe
6440: 20 2a 76 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e   *v){.  if( db->
6450: 6e 65 78 74 5f 63 6f 6f 6b 69 65 3d 3d 64 62 2d  next_cookie==db-
6460: 3e 61 44 62 5b 30 5d 2e 73 63 68 65 6d 61 5f 63  >aDb[0].schema_c
6470: 6f 6f 6b 69 65 20 29 7b 0a 20 20 20 20 64 62 2d  ookie ){.    db-
6480: 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 20 3d 20 64  >next_cookie = d
6490: 62 2d 3e 61 44 62 5b 30 5d 2e 73 63 68 65 6d 61  b->aDb[0].schema
64a0: 5f 63 6f 6f 6b 69 65 20 2b 20 73 71 6c 69 74 65  _cookie + sqlite
64b0: 52 61 6e 64 6f 6d 42 79 74 65 28 29 20 2b 20 31  RandomByte() + 1
64c0: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
64d0: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
64e0: 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 73 71 6c  Changes;.    sql
64f0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6500: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e  OP_Integer, db->
6510: 6e 65 78 74 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b  next_cookie, 0);
6520: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
6530: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
6540: 6f 6b 69 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  okie, 0, 0);.  }
6550: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
6560: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
6570: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
6580: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
6590: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
65a0: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
65b0: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
65c0: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
65d0: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
65e0: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
65f0: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
6600: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64  */.static int id
6610: 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20  entLength(const 
6620: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
6630: 6e 3b 0a 20 20 69 6e 74 20 6e 65 65 64 51 75 6f  n;.  int needQuo
6640: 74 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6e 3d  te = 0;.  for(n=
6650: 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29  0; *z; n++, z++)
6660: 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c  {.    if( *z=='\
6670: 27 27 20 29 7b 20 6e 2b 2b 3b 20 6e 65 65 64 51  '' ){ n++; needQ
6680: 75 6f 74 65 3d 31 3b 20 7d 0a 20 20 7d 0a 20 20  uote=1; }.  }.  
6690: 72 65 74 75 72 6e 20 6e 20 2b 20 6e 65 65 64 51  return n + needQ
66a0: 75 6f 74 65 2a 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  uote*2;.}../*.**
66b0: 20 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69   Write an identi
66c0: 66 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e  fier onto the en
66d0: 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73  d of the given s
66e0: 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71  tring.  Add.** q
66f0: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20  uote characters 
6700: 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  as needed..*/.st
6710: 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50  atic void identP
6720: 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  ut(char *z, int 
6730: 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 49 64  *pIdx, char *zId
6740: 65 6e 74 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  ent){.  int i, j
6750: 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69  , needQuote;.  i
6760: 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28   = *pIdx;.  for(
6770: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
6780: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69  j++){.    if( !i
6790: 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d  salnum(zIdent[j]
67a0: 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d  ) && zIdent[j]!=
67b0: 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  '_' ) break;.  }
67c0: 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20  .  needQuote =  
67d0: 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20  zIdent[j]!=0 || 
67e0: 69 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30  isdigit(zIdent[0
67f0: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]).             
6800: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 4b 65       || sqliteKe
6810: 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74  ywordCode(zIdent
6820: 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69  , j)!=TK_ID;.  i
6830: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
6840: 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  [i++] = '\'';.  
6850: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
6860: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b  j]; j++){.    z[
6870: 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d  i++] = zIdent[j]
6880: 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74  ;.    if( zIdent
6890: 5b 6a 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b 69 2b  [j]=='\'' ) z[i+
68a0: 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a 20  +] = '\'';.  }. 
68b0: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
68c0: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a   z[i++] = '\'';.
68d0: 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70    z[i] = 0;.  *p
68e0: 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  Idx = i;.}../*.*
68f0: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45  * Generate a CRE
6900: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
6910: 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20  ent appropriate 
6920: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
6930: 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20   table.  Memory 
6940: 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74  to hold the text
6950: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
6960: 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  t is obtained.**
6970: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
6980: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
6990: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
69a0: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
69b0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
69c0: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
69d0: 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Table *p){.  int
69e0: 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72   i, k, n;.  char
69f0: 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20   *zStmt;.  char 
6a00: 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a  *zSep, *zSep2, *
6a10: 7a 45 6e 64 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  zEnd;.  n = 0;. 
6a20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
6a30: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  Col; i++){.    n
6a40: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
6a50: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
6a60: 29 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64  );.  }.  n += id
6a70: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61  entLength(p->zNa
6a80: 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 34 30 20  me);.  if( n<40 
6a90: 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22  ){.    zSep = ""
6aa0: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
6ab0: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29  ";.    zEnd = ")
6ac0: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
6ad0: 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20  zSep = "\n  ";. 
6ae0: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20     zSep2 = ",\n 
6af0: 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22   ";.    zEnd = "
6b00: 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d  \n)";.  }.  n +=
6b10: 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b   35 + 6*p->nCol;
6b20: 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  zStmt = sqlit
6b30: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b  eMallocRaw( n );
6b40: 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20  .  if( zStmt==0 
6b50: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 74  ) return 0;.  st
6b60: 72 63 70 79 28 7a 53 74 6d 74 2c 20 70 2d 3e 69  rcpy(zStmt, p->i
6b70: 44 62 3d 3d 31 20 3f 20 22 43 52 45 41 54 45 20  Db==1 ? "CREATE 
6b80: 54 45 4d 50 20 54 41 42 4c 45 20 22 20 3a 20 22  TEMP TABLE " : "
6b90: 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b  CREATE TABLE ");
6ba0: 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53  .  k = strlen(zS
6bb0: 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74  tmt);.  identPut
6bc0: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a  (zStmt, &k, p->z
6bd0: 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b  Name);.  zStmt[k
6be0: 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72  ++] = '(';.  for
6bf0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
6c00: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63 70   i++){.    strcp
6c10: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65  y(&zStmt[k], zSe
6c20: 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72  p);.    k += str
6c30: 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a  len(&zStmt[k]);.
6c40: 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32      zSep = zSep2
6c50: 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a  ;.    identPut(z
6c60: 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 61 43 6f  Stmt, &k, p->aCo
6c70: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  l[i].zName);.  }
6c80: 0a 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74  .  strcpy(&zStmt
6c90: 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65  [k], zEnd);.  re
6ca0: 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f  turn zStmt;.}../
6cb0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6cc0: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  e is called to r
6cd0: 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20  eport the final 
6ce0: 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ")" that termina
6cf0: 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20  tes.** a CREATE 
6d00: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
6d10: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
6d20: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
6d30: 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75  other action rou
6d40: 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20  tines have been 
6d50: 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61  building.** is a
6d60: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65  dded to the inte
6d70: 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73  rnal hash tables
6d80: 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  , assuming no er
6d90: 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63  rors have.** occ
6da0: 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  urred..**.** An 
6db0: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61  entry for the ta
6dc0: 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74  ble is made in t
6dd0: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
6de0: 6f 6e 20 64 69 73 6b 2c 0a 2a 2a 20 75 6e 6c 65  on disk,.** unle
6df0: 73 73 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  ss this is a tem
6e00: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20  porary table or 
6e10: 69 6e 69 74 46 6c 61 67 3d 3d 31 2e 20 20 57 68  initFlag==1.  Wh
6e20: 65 6e 20 69 6e 69 74 46 6c 61 67 3d 3d 31 2c 0a  en initFlag==1,.
6e30: 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61  ** it means we a
6e40: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73  re reading the s
6e50: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
6e60: 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  le because we ju
6e70: 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20  st.** connected 
6e80: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
6e90: 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73  or because the s
6ea0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
6eb0: 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74  le has.** recent
6ec0: 6c 79 20 63 68 61 6e 67 65 73 2c 20 73 6f 20 74  ly changes, so t
6ed0: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69  he entry for thi
6ee0: 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  s table already 
6ef0: 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65  exists in.** the
6f00: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
6f10: 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  able.  We do not
6f20: 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20   want to create 
6f30: 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  it again..**.** 
6f40: 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61  If the pSelect a
6f50: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
6f60: 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ULL, it means th
6f70: 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  at this routine.
6f80: 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ** was called to
6f90: 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   create a table 
6fa0: 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61  generated from a
6fb0: 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42   .** "CREATE TAB
6fc0: 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  LE ... AS SELECT
6fd0: 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e   ..." statement.
6fe0: 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d    The column nam
6ff0: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  es of.** the new
7000: 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63   table will matc
7010: 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  h the result set
7020: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
7030: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 6e  */.void sqliteEn
7040: 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  dTable(Parse *pP
7050: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e  arse, Token *pEn
7060: 64 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  d, Select *pSele
7070: 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  ct){.  Table *p;
7080: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
7090: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
70a0: 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70  f( (pEnd==0 && p
70b0: 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50  Select==0) || pP
70c0: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
70d0: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
70e0: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  ed ) return;.  p
70f0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
7100: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
7110: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
7120: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   If the table is
7130: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
7140: 61 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 63  a SELECT, then c
7150: 6f 6e 73 74 72 75 63 74 20 74 68 65 0a 20 20 2a  onstruct the.  *
7160: 2a 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * list of column
7170: 73 20 61 6e 64 20 74 68 65 20 74 65 78 74 20 6f  s and the text o
7180: 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a  f the table..  *
7190: 2f 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 20  /.  if( pSelect 
71a0: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 53  ){.    Table *pS
71b0: 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 52 65  elTab = sqliteRe
71c0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
71d0: 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 65  pParse, 0, pSele
71e0: 63 74 29 3b 0a 20 20 20 20 69 66 28 20 70 53 65  ct);.    if( pSe
71f0: 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  lTab==0 ) return
7200: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
7210: 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
7220: 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->nCol = pSelTa
7230: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e  b->nCol;.    p->
7240: 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
7250: 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61  aCol;.    pSelTa
7260: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
7270: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
7280: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65   0;.    sqliteDe
7290: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65  leteTable(0, pSe
72a0: 6c 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lTab);.  }..  /*
72b0: 20 49 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67   If the initFlag
72c0: 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77   is 1 it means w
72d0: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
72e0: 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20  e SQL off the.  
72f0: 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65  ** "sqlite_maste
7300: 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65  r" or "sqlite_te
7310: 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65  mp_master" table
7320: 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20   on the disk..  
7330: 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69  ** So do not wri
7340: 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  te to the disk a
7350: 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74  gain.  Extract t
7360: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
7370: 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ber.  ** for the
7380: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
7390: 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20  pParse->newTnum 
73a0: 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67  field.  (The pag
73b0: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68  e number.  ** sh
73c0: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
73d0: 75 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20  ut there by the 
73e0: 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75  sqliteOpenCb rou
73f0: 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66  tine.).  */.  if
7400: 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c  ( pParse->initFl
7410: 61 67 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75  ag ){.    p->tnu
7420: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77 54  m = pParse->newT
7430: 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  num;.  }..  /* I
7440: 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69  f not initializi
7450: 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  ng, then create 
7460: 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65  a record for the
7470: 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20   new table.  ** 
7480: 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
7490: 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68  STER table of th
74a0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
74b0: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20   record number. 
74c0: 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20   ** for the new 
74d0: 74 61 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75  table entry shou
74e0: 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e  ld already be on
74f0: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a   the stack..  **
7500: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73  .  ** If this is
7510: 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62   a TEMPORARY tab
7520: 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e  le, write the en
7530: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78  try into the aux
7540: 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65  iliary.  ** file
7550: 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f   instead of into
7560: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
7570: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
7580: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 69 6e 69  if( !pParse->ini
7590: 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 6e 74  tFlag ){.    int
75a0: 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b   n;.    Vdbe *v;
75b0: 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
75c0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
75d0: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
75e0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20  return;.    if( 
75f0: 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  p->pSelect==0 ){
7600: 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75  .      /* A regu
7610: 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  lar table */.   
7620: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7630: 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54  Op(v, OP_CreateT
7640: 61 62 6c 65 2c 20 30 2c 20 70 2d 3e 69 44 62 29  able, 0, p->iDb)
7650: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
7660: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
7670: 2c 20 28 63 68 61 72 20 2a 29 26 70 2d 3e 74 6e  , (char *)&p->tn
7680: 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b  um, P3_POINTER);
7690: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
76a0: 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20    /* A view */. 
76b0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
76c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
76d0: 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  er, 0, 0);.    }
76e0: 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 30  .    p->tnum = 0
76f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
7700: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
7710: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 1, 0);.    sql
7720: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
7730: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
7740: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65  ;.    if( p->pSe
7750: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lect==0 ){.     
7760: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
7770: 65 50 33 28 76 2c 20 2d 31 2c 20 22 74 61 62 6c  eP3(v, -1, "tabl
7780: 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  e", P3_STATIC);.
7790: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
77a0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
77b0: 65 50 33 28 76 2c 20 2d 31 2c 20 22 76 69 65 77  eP3(v, -1, "view
77c0: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
77d0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
77e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
77f0: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
7800: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
7810: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a  geP3(v, -1, p->z
7820: 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29  Name, P3_STATIC)
7830: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
7840: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
7850: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ng, 0, 0);.    s
7860: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
7870: 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d  3(v, -1, p->zNam
7880: 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  e, P3_STATIC);. 
7890: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
78a0: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 34 2c  Op(v, OP_Dup, 4,
78b0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
78c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
78d0: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
78e0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
78f0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  .      char *z =
7900: 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74   createTableStmt
7910: 28 70 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 7a  (p);.      n = z
7920: 20 3f 20 73 74 72 6c 65 6e 28 7a 29 20 3a 20 30   ? strlen(z) : 0
7930: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
7940: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
7950: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73  , z, n);.      s
7960: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
7970: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
7980: 73 73 65 72 74 28 20 70 45 6e 64 21 3d 30 20 29  ssert( pEnd!=0 )
7990: 3b 0a 20 20 20 20 20 20 6e 20 3d 20 41 64 64 72  ;.      n = Addr
79a0: 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72  (pEnd->z) - Addr
79b0: 28 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54  (pParse->sFirstT
79c0: 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20 20  oken.z) + 1;.   
79d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
79e0: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 50 61  ngeP3(v, -1, pPa
79f0: 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e  rse->sFirstToken
7a00: 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  .z, n);.    }.  
7a10: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7a20: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
7a30: 72 64 2c 20 35 2c 20 30 29 3b 0a 20 20 20 20 73  rd, 5, 0);.    s
7a40: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
7a50: 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20  , OP_PutIntKey, 
7a60: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21  0, 0);.    if( !
7a70: 70 2d 3e 69 44 62 20 29 7b 0a 20 20 20 20 20 20  p->iDb ){.      
7a80: 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b  sqliteChangeCook
7a90: 69 65 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d  ie(db, v);.    }
7aa0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
7ab0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
7ac0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
7ad0: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
7ae0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7af0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
7b00: 20 70 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20   p->iDb, 0);.   
7b10: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7b20: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  Op(v, OP_OpenWri
7b30: 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  te, 1, 0);.     
7b40: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
7b50: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  2;.      sqliteS
7b60: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
7b70: 65 6c 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65  elect, SRT_Table
7b80: 2c 20 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 1, 0, 0, 0);. 
7b90: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 45     }.    sqliteE
7ba0: 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  ndWriteOperation
7bb0: 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20  (pParse);.  }.. 
7bc0: 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c   /* Add the tabl
7bd0: 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e to the in-memo
7be0: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
7bf0: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
7c00: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
7c10: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30  arse->explain==0
7c20: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
7c30: 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  ==0 ){.    Table
7c40: 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65 79   *pOld;.    FKey
7c50: 20 2a 70 46 4b 65 79 3b 0a 20 20 20 20 70 4f 6c   *pFKey;.    pOl
7c60: 64 20 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e  d = sqliteHashIn
7c70: 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d  sert(&db->aDb[p-
7c80: 3e 69 44 62 5d 2e 74 62 6c 48 61 73 68 2c 20 0a  >iDb].tblHash, .
7c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ca0: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a              p->z
7cb0: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e  Name, strlen(p->
7cc0: 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20  zName)+1, p);.  
7cd0: 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20    if( pOld ){.  
7ce0: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
7cf0: 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  Old );  /* Mallo
7d00: 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
7d10: 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e  ed inside HashIn
7d20: 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20  sert() */.      
7d30: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
7d40: 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70    for(pFKey=p->p
7d50: 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b  FKey; pFKey; pFK
7d60: 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  ey=pFKey->pNextF
7d70: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  rom){.      int 
7d80: 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b  nTo = strlen(pFK
7d90: 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20  ey->zTo) + 1;.  
7da0: 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74      pFKey->pNext
7db0: 54 6f 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46  To = sqliteHashF
7dc0: 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e  ind(&db->aDb[p->
7dd0: 69 44 62 5d 2e 61 46 4b 65 79 2c 20 70 46 4b 65  iDb].aFKey, pFKe
7de0: 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20  y->zTo, nTo);.  
7df0: 20 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e      sqliteHashIn
7e00: 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d  sert(&db->aDb[p-
7e10: 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 20 70 46 4b  >iDb].aFKey, pFK
7e20: 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46  ey->zTo, nTo, pF
7e30: 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Key);.    }.    
7e40: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
7e50: 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e  e = 0;.    db->n
7e60: 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d  Table++;.    db-
7e70: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
7e80: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
7e90: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
7ea0: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
7eb0: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72  is routine in or
7ec0: 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20  der to create a 
7ed0: 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64  new VIEW.*/.void
7ee0: 20 73 71 6c 69 74 65 43 72 65 61 74 65 56 69 65   sqliteCreateVie
7ef0: 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
7f00: 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70  se,     /* The p
7f10: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
7f20: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69  /.  Token *pBegi
7f30: 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52  n,     /* The CR
7f40: 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
7f50: 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65  begins the state
7f60: 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
7f70: 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20  *pName,      /* 
7f80: 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
7f90: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
7fa0: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53   the view */.  S
7fb0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
7fc0: 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74    /* A SELECT st
7fd0: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c  atement that wil
7fe0: 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
7ff0: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
8000: 73 54 65 6d 70 20 20 20 20 20 20 20 20 20 2f 2a  sTemp         /*
8010: 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50   TRUE for a TEMP
8020: 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 29 7b  ORARY view */.){
8030: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
8040: 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt n;.  const ch
8050: 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73  ar *z;.  Token s
8060: 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73  End;.  DbFixer s
8070: 46 69 78 3b 0a 0a 20 20 73 71 6c 69 74 65 53 74  Fix;..  sqliteSt
8080: 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c  artTable(pParse,
8090: 20 70 42 65 67 69 6e 2c 20 70 4e 61 6d 65 2c 20   pBegin, pName, 
80a0: 69 73 54 65 6d 70 2c 20 31 29 3b 0a 20 20 70 20  isTemp, 1);.  p 
80b0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
80c0: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
80d0: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
80e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c  ){.    sqliteSel
80f0: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
8100: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
8110: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
8120: 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
8130: 50 61 72 73 65 2c 20 70 2d 3e 69 44 62 2c 20 22  Parse, p->iDb, "
8140: 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20  view", pName).  
8150: 20 20 26 26 20 73 71 6c 69 74 65 46 69 78 53 65    && sqliteFixSe
8160: 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c  lect(&sFix, pSel
8170: 65 63 74 29 0a 20 20 29 7b 0a 20 20 20 20 73 71  ect).  ){.    sq
8180: 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65  liteSelectDelete
8190: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72  (pSelect);.    r
81a0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
81b0: 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   Make a copy of 
81c0: 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43  the entire SELEC
81d0: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
81e0: 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
81f0: 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c  w..  ** This wil
8200: 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20  l force all the 
8210: 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c  Expr.token.z val
8220: 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ues to be dynami
8230: 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  cally.  ** alloc
8240: 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e  ated rather than
8250: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e   point to the in
8260: 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69  put string - whi
8270: 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  ch means that.  
8280: 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72  ** they will per
8290: 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63  sist after the c
82a0: 75 72 72 65 6e 74 20 73 71 6c 69 74 65 5f 65 78  urrent sqlite_ex
82b0: 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  ec() call return
82c0: 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65  s..  */.  p->pSe
82d0: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 53 65 6c  lect = sqliteSel
82e0: 65 63 74 44 75 70 28 70 53 65 6c 65 63 74 29 3b  ectDup(pSelect);
82f0: 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44  .  sqliteSelectD
8300: 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a  elete(pSelect);.
8310: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 69    if( !pParse->i
8320: 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 73  nitFlag ){.    s
8330: 71 6c 69 74 65 56 69 65 77 47 65 74 43 6f 6c 75  qliteViewGetColu
8340: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
8350: 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  p);.  }..  /* Lo
8360: 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  cate the end of 
8370: 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20  the CREATE VIEW 
8380: 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65  statement.  Make
8390: 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20   sEnd point to. 
83a0: 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a   ** the end..  *
83b0: 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73  /.  sEnd = pPars
83c0: 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20  e->sLastToken;. 
83d0: 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d   if( sEnd.z[0]!=
83e0: 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d  0 && sEnd.z[0]!=
83f0: 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e  ';' ){.    sEnd.
8400: 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d  z += sEnd.n;.  }
8410: 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20  .  sEnd.n = 0;. 
8420: 20 6e 20 3d 20 28 28 69 6e 74 29 73 45 6e 64 2e   n = ((int)sEnd.
8430: 7a 29 20 2d 20 28 69 6e 74 29 70 42 65 67 69 6e  z) - (int)pBegin
8440: 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69  ->z;.  z = pBegi
8450: 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e  n->z;.  while( n
8460: 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27  >0 && (z[n-1]=='
8470: 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b  ;' || isspace(z[
8480: 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d  n-1])) ){ n--; }
8490: 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e  .  sEnd.z = &z[n
84a0: 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  -1];.  sEnd.n = 
84b0: 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c  1;..  /* Use sql
84c0: 69 74 65 45 6e 64 54 61 62 6c 65 28 29 20 74 6f  iteEndTable() to
84d0: 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f   add the view to
84e0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
84f0: 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ER table */.  sq
8500: 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 70 50 61  liteEndTable(pPa
8510: 72 73 65 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a  rse, &sEnd, 0);.
8520: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
8530: 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72  ** The Table str
8540: 75 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73  ucture pTable is
8550: 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20   really a VIEW. 
8560: 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d   Fill in the nam
8570: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c  es of.** the col
8580: 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77  umns of the view
8590: 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73   in the pTable s
85a0: 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72  tructure.  Retur
85b0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  n the number.** 
85c0: 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61  of errors.  If a
85d0: 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20  n error is seen 
85e0: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
85f0: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 65 2d  essage in pPare-
8600: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  >zErrMsg..*/.int
8610: 20 73 71 6c 69 74 65 56 69 65 77 47 65 74 43 6f   sqliteViewGetCo
8620: 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20  lumnNames(Parse 
8630: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
8640: 70 54 61 62 6c 65 29 7b 0a 20 20 45 78 70 72 4c  pTable){.  ExprL
8650: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 53  ist *pEList;.  S
8660: 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 54  elect *pSel;.  T
8670: 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20  able *pSelTab;. 
8680: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a   int nErr = 0;..
8690: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
86a0: 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69   );..  /* A posi
86b0: 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20  tive nCol means 
86c0: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65  the columns name
86d0: 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20  s for this view 
86e0: 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79  are.  ** already
86f0: 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69   known..  */.  i
8700: 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  f( pTable->nCol>
8710: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
8720: 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e   /* A negative n
8730: 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c  Col is a special
8740: 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20   marker meaning 
8750: 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72  that we are curr
8760: 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e  ently.  ** tryin
8770: 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  g to compute the
8780: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20   column names.  
8790: 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73  If we enter this
87a0: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20   routine with.  
87b0: 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43  ** a negative nC
87c0: 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f  ol, it means two
87d0: 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66   or more views f
87e0: 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65  orm a loop, like
87f0: 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   this:.  **.  **
8800: 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
8810: 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a   one AS SELECT *
8820: 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20   FROM two;.  ** 
8830: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
8840: 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20  two AS SELECT * 
8850: 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20  FROM one;.  **. 
8860: 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68   ** Actually, th
8870: 69 73 20 65 72 72 6f 72 20 69 73 20 63 61 75 67  is error is caug
8880: 68 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6e  ht previously an
8890: 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d so the followi
88a0: 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f  ng test.  ** sho
88b0: 75 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c 2e  uld always fail.
88c0: 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65    But we will le
88d0: 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20  ave it in place 
88e0: 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
88f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
8900: 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20  le->nCol<0 ){.  
8910: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
8920: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
8930: 73 67 2c 20 22 76 69 65 77 20 22 2c 20 70 54 61  sg, "view ", pTa
8940: 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  ble->zName,.    
8950: 20 20 20 20 20 22 20 69 73 20 63 69 72 63 75 6c       " is circul
8960: 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 30  arly defined", 0
8970: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
8980: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
8990: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 1;.  }..  /* I
89a0: 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
89b0: 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e  r, it means we n
89c0: 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
89d0: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a  he table names..
89e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
89f0: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29  Table->pSelect )
8a00: 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c  ; /* If nCol==0,
8a10: 20 74 68 65 6e 20 70 54 61 62 6c 65 20 6d 75 73   then pTable mus
8a20: 74 20 62 65 20 61 20 56 49 45 57 20 2a 2f 0a 20  t be a VIEW */. 
8a30: 20 70 53 65 6c 20 3d 20 70 54 61 62 6c 65 2d 3e   pSel = pTable->
8a40: 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e  pSelect;..  /* N
8a50: 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c  ote that the cal
8a60: 6c 20 74 6f 20 73 71 6c 69 74 65 52 65 73 75 6c  l to sqliteResul
8a70: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77  tSetOfSelect() w
8a80: 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20  ill expand any. 
8a90: 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73   ** "*" elements
8aa0: 20 69 6e 20 74 68 69 73 20 6c 69 73 74 2e 20 20   in this list.  
8ab0: 42 75 74 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  But we will need
8ac0: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
8ad0: 6c 69 73 74 0a 20 20 2a 2a 20 62 61 63 6b 20 74  list.  ** back t
8ae0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
8af0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 66 74  onfiguration aft
8b00: 65 72 77 61 72 64 73 2c 20 73 6f 20 77 65 20 73  erwards, so we s
8b10: 61 76 65 20 61 20 63 6f 70 79 20 6f 66 0a 20 20  ave a copy of.  
8b20: 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** the original 
8b30: 69 6e 20 70 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a  in pEList..  */.
8b40: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 2d    pEList = pSel-
8b50: 3e 70 45 4c 69 73 74 3b 0a 20 20 70 53 65 6c 2d  >pEList;.  pSel-
8b60: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
8b70: 45 78 70 72 4c 69 73 74 44 75 70 28 70 45 4c 69  ExprListDup(pELi
8b80: 73 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 2d  st);.  if( pSel-
8b90: 3e 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  >pEList==0 ){.  
8ba0: 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d    pSel->pEList =
8bb0: 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 72 65 74   pEList;.    ret
8bc0: 75 72 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  urn 1;  /* Mallo
8bd0: 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a  c failed */.  }.
8be0: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
8bf0: 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d   -1;.  pSelTab =
8c00: 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74   sqliteResultSet
8c10: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
8c20: 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 69 66 28   0, pSel);.  if(
8c30: 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20   pSelTab ){.    
8c40: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
8c50: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70  aCol==0 );.    p
8c60: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53  Table->nCol = pS
8c70: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
8c80: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
8c90: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
8ca0: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
8cb0: 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61   = 0;.    pSelTa
8cc0: 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
8cd0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
8ce0: 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a  le(0, pSelTab);.
8cf0: 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74      DbSetPropert
8d00: 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  y(pParse->db, pT
8d10: 61 62 6c 65 2d 3e 69 44 62 2c 20 44 42 5f 55 6e  able->iDb, DB_Un
8d20: 72 65 73 65 74 56 69 65 77 73 29 3b 0a 20 20 7d  resetViews);.  }
8d30: 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 6c 65  else{.    pTable
8d40: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
8d50: 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71  nErr++;.  }.  sq
8d60: 6c 69 74 65 53 65 6c 65 63 74 55 6e 62 69 6e 64  liteSelectUnbind
8d70: 28 70 53 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65  (pSel);.  sqlite
8d80: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
8d90: 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sel->pEList);.  
8da0: 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70  pSel->pEList = p
8db0: 45 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e 20  EList;.  return 
8dc0: 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  nErr;  .}../*.**
8dd0: 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
8de0: 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68 65  n names from the
8df0: 20 56 49 45 57 20 70 54 61 62 6c 65 2e 0a 2a 2a   VIEW pTable..**
8e00: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8e10: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
8e20: 76 65 72 20 61 6e 79 20 6f 74 68 65 72 20 74 61  ver any other ta
8e30: 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 6d  ble or view is m
8e40: 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 54 68 65 20  odified..** The 
8e50: 76 69 65 77 20 70 61 73 73 65 64 20 69 6e 74 6f  view passed into
8e60: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
8e70: 67 68 74 20 64 65 70 65 6e 64 20 64 69 72 65 63  ght depend direc
8e80: 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c  tly or indirectl
8e90: 79 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 64 69  y.** on the modi
8ea0: 66 69 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  fied or deleted 
8eb0: 74 61 62 6c 65 20 73 6f 20 77 65 20 6e 65 65 64  table so we need
8ec0: 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 6f 6c   to clear the ol
8ed0: 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d 65  d column.** name
8ee0: 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 77  s so that they w
8ef0: 69 6c 6c 20 62 65 20 72 65 63 6f 6d 70 75 74 65  ill be recompute
8f00: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
8f10: 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
8f20: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62  tColumnNames(Tab
8f30: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69  le *pTable){.  i
8f40: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62  nt i;.  if( pTab
8f50: 6c 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 2d  le==0 || pTable-
8f60: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 72 65  >pSelect==0 ) re
8f70: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 54 61 62  turn;.  if( pTab
8f80: 6c 65 2d 3e 6e 43 6f 6c 3d 3d 30 20 29 20 72 65  le->nCol==0 ) re
8f90: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
8fa0: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
8fb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
8fc0: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
8fd0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[i].zName);.  
8fe0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
8ff0: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66  ble->aCol[i].zDf
9000: 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  lt);.    sqliteF
9010: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
9020: 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a  [i].zType);.  }.
9030: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
9040: 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70 54  ble->aCol);.  pT
9050: 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  able->aCol = 0;.
9060: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
9070: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   0;.}../*.** Cle
9080: 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
9090: 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56  mes from every V
90a0: 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20  IEW in database 
90b0: 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  idx..*/.static v
90c0: 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
90d0: 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 20 2a 64  setAll(sqlite *d
90e0: 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48  b, int idx){.  H
90f0: 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66  ashElem *i;.  if
9100: 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79  ( !DbHasProperty
9110: 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
9120: 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74  esetViews) ) ret
9130: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c  urn;.  for(i=sql
9140: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
9150: 2d 3e 61 44 62 5b 69 64 78 5d 2e 74 62 6c 48 61  ->aDb[idx].tblHa
9160: 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65  sh); i; i=sqlite
9170: 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
9180: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
9190: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
91a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
91b0: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
91c0: 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65    sqliteViewRese
91d0: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61  tColumnNames(pTa
91e0: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
91f0: 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
9200: 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
9210: 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 0a 2f 2a  setViews);.}../*
9220: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65  .** Given a toke
9230: 6e 2c 20 6c 6f 6f 6b 20 75 70 20 61 20 74 61 62  n, look up a tab
9240: 6c 65 20 77 69 74 68 20 74 68 61 74 20 6e 61 6d  le with that nam
9250: 65 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64  e.  If not found
9260: 2c 20 6c 65 61 76 65 0a 2a 2a 20 61 6e 20 65 72  , leave.** an er
9270: 72 6f 72 20 66 6f 72 20 74 68 65 20 70 61 72 73  ror for the pars
9280: 65 72 20 74 6f 20 66 69 6e 64 20 61 6e 64 20 72  er to find and r
9290: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 54  eturn NULL..*/.T
92a0: 61 62 6c 65 20 2a 73 71 6c 69 74 65 54 61 62 6c  able *sqliteTabl
92b0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 50 61 72 73 65  eFromToken(Parse
92c0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
92d0: 2a 70 54 6f 6b 29 7b 0a 20 20 63 68 61 72 20 2a  *pTok){.  char *
92e0: 7a 4e 61 6d 65 3b 0a 20 20 54 61 62 6c 65 20 2a  zName;.  Table *
92f0: 70 54 61 62 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  pTab;.  zName = 
9300: 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46  sqliteTableNameF
9310: 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29 3b 0a  romToken(pTok);.
9320: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
9330: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 54 61   return 0;.  pTa
9340: 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61  b = sqliteFindTa
9350: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
9360: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c  zName, 0);.  sql
9370: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
9380: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
9390: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53  .    sqliteSetNS
93a0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
93b0: 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68  ErrMsg, "no such
93c0: 20 74 61 62 6c 65 3a 20 22 2c 20 30 2c 20 0a 20   table: ", 0, . 
93d0: 20 20 20 20 20 20 20 70 54 6f 6b 2d 3e 7a 2c 20         pTok->z, 
93e0: 70 54 6f 6b 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  pTok->n, 0);.   
93f0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
9400: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54  .  }.  return pT
9410: 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ab;.}../*.** Thi
9420: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
9430: 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  led to do the wo
9440: 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42  rk of a DROP TAB
9450: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
9460: 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61   pName is the na
9470: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
9480: 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a  to be dropped..*
9490: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 72 6f  /.void sqliteDro
94a0: 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
94b0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
94c0: 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b  me, int isView){
94d0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
94e0: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
94f0: 6e 74 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74  nt base;.  sqlit
9500: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
9510: 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
9520: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
9530: 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c  rr || sqlite_mal
9540: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
9550: 75 72 6e 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20  urn;.  pTable = 
9560: 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54  sqliteTableFromT
9570: 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 4e 61  oken(pParse, pNa
9580: 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  me);.  if( pTabl
9590: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
95a0: 20 69 44 62 20 3d 20 70 54 61 62 6c 65 2d 3e 69   iDb = pTable->i
95b0: 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  Db;.  assert( iD
95c0: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
95d0: 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  nDb );.#ifndef S
95e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
95f0: 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
9600: 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63   int code;.    c
9610: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
9620: 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70  = SCHEMA_TABLE(p
9630: 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 20 20 20  Table->iDb);.   
9640: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
9650: 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62 6c   = db->aDb[pTabl
9660: 65 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  e->iDb].zName;. 
9670: 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74     if( sqliteAut
9680: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
9690: 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54  QLITE_DELETE, zT
96a0: 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20  ab, 0, zDb)){.  
96b0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
96c0: 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
96d0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44   ){.      if( iD
96e0: 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
96f0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
9700: 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  OP_TEMP_VIEW;.  
9710: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9720: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
9730: 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20  _DROP_VIEW;.    
9740: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
9750: 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20       if( iDb==1 
9760: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
9770: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
9780: 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
9790: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
97a0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
97b0: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
97c0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
97d0: 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70  qliteAuthCheck(p
97e0: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61  Parse, code, pTa
97f0: 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a  ble->zName, 0, z
9800: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Db) ){.      ret
9810: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
9820: 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65  f( sqliteAuthChe
9830: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
9840: 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 6c 65  E_DELETE, pTable
9850: 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  ->zName, 0, zDb)
9860: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
9870: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
9880: 69 66 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  if.  if( pTable-
9890: 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
98a0: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
98b0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
98c0: 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61  g, "table ", pTa
98d0: 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20  ble->zName, .   
98e0: 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20 62 65      " may not be
98f0: 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20   dropped", 0);. 
9900: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
9910: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
9920: 20 7d 0a 20 20 69 66 28 20 69 73 56 69 65 77 20   }.  if( isView 
9930: 26 26 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  && pTable->pSele
9940: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ct==0 ){.    sql
9950: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
9960: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
9970: 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74  use DROP TABLE t
9980: 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 22  o delete table "
9990: 2c 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ,.      pTable->
99a0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70  zName, 0);.    p
99b0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
99c0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
99d0: 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
99e0: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20  pTable->pSelect 
99f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
9a00: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
9a10: 7a 45 72 72 4d 73 67 2c 20 22 75 73 65 20 44 52  zErrMsg, "use DR
9a20: 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74  OP VIEW to delet
9a30: 65 20 76 69 65 77 20 22 2c 0a 20 20 20 20 20 20  e view ",.      
9a40: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30  pTable->zName, 0
9a50: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
9a60: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
9a70: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  n;.  }..  /* Gen
9a80: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
9a90: 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66  move the table f
9aa0: 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
9ab0: 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73  able.  ** on dis
9ac0: 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  k..  */.  v = sq
9ad0: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
9ae0: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
9af0: 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f      static VdbeO
9b00: 70 20 64 72 6f 70 54 61 62 6c 65 5b 5d 20 3d 20  p dropTable[] = 
9b10: 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77  {.      { OP_Rew
9b20: 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52  ind,     0, ADDR
9b30: 28 38 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20  (8),  0},.      
9b40: 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20  { OP_String,    
9b50: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
9b60: 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20  , /* 1 */.      
9b70: 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20  { OP_MemStore,  
9b80: 20 31 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d   1, 1,        0}
9b90: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d  ,.      { OP_Mem
9ba0: 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c 20 20  Load,    1, 0,  
9bb0: 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a        0}, /* 3 *
9bc0: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c  /.      { OP_Col
9bd0: 75 6d 6e 2c 20 20 20 20 20 30 2c 20 32 2c 20 20  umn,     0, 2,  
9be0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
9bf0: 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20  { OP_Ne,        
9c00: 20 30 2c 20 41 44 44 52 28 37 29 2c 20 20 30 7d   0, ADDR(7),  0}
9c10: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c  ,.      { OP_Del
9c20: 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ete,     0, 0,  
9c30: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
9c40: 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20  { OP_Next,      
9c50: 20 30 2c 20 41 44 44 52 28 33 29 2c 20 20 30 7d   0, ADDR(3),  0}
9c60: 2c 20 2f 2a 20 37 20 2a 2f 0a 20 20 20 20 7d 3b  , /* 7 */.    };
9c70: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
9c80: 3b 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a 70  ;.    Trigger *p
9c90: 54 72 69 67 67 65 72 3b 0a 20 20 20 20 73 71 6c  Trigger;.    sql
9ca0: 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65  iteBeginWriteOpe
9cb0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
9cc0: 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a  , pTable->iDb);.
9cd0: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  .    /* Drop all
9ce0: 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69   triggers associ
9cf0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
9d00: 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
9d10: 64 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65  d */.    pTrigge
9d20: 72 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54 72 69  r = pTable->pTri
9d30: 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28  gger;.    while(
9d40: 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
9d50: 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
9d60: 67 65 72 2d 3e 69 44 62 3d 3d 70 54 61 62 6c 65  ger->iDb==pTable
9d70: 2d 3e 69 44 62 20 7c 7c 20 70 54 72 69 67 67 65  ->iDb || pTrigge
9d80: 72 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20  r->iDb==1 );.   
9d90: 20 20 20 73 71 6c 69 74 65 44 72 6f 70 54 72 69     sqliteDropTri
9da0: 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20  ggerPtr(pParse, 
9db0: 70 54 72 69 67 67 65 72 2c 20 31 29 3b 0a 20 20  pTrigger, 1);.  
9dc0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
9dd0: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20  explain ){.     
9de0: 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
9df0: 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  rigger->pNext;. 
9e00: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9e10: 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
9e20: 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72 3b  Table->pTrigger;
9e30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
9e40: 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20      /* Drop all 
9e50: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 65 6e  SQLITE_MASTER en
9e60: 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72  tries that refer
9e70: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   to the table */
9e80: 0a 20 20 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d  .    sqliteOpenM
9e90: 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70 54  asterTable(v, pT
9ea0: 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 20 20 20 20  able->iDb);.    
9eb0: 62 61 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62  base = sqliteVdb
9ec0: 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
9ed0: 72 61 79 53 69 7a 65 28 64 72 6f 70 54 61 62 6c  raySize(dropTabl
9ee0: 65 29 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a  e), dropTable);.
9ef0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
9f00: 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31  angeP3(v, base+1
9f10: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c  , pTable->zName,
9f20: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f   0);..    /* Dro
9f30: 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 54 45 4d  p all SQLITE_TEM
9f40: 50 5f 4d 41 53 54 45 52 20 65 6e 74 72 69 65 73  P_MASTER entries
9f50: 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
9f60: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  he table */.    
9f70: 69 66 28 20 70 54 61 62 6c 65 2d 3e 69 44 62 21  if( pTable->iDb!
9f80: 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
9f90: 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  teOpenMasterTabl
9fa0: 65 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20 62  e(v, 1);.      b
9fb0: 61 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ase = sqliteVdbe
9fc0: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
9fd0: 61 79 53 69 7a 65 28 64 72 6f 70 54 61 62 6c 65  aySize(dropTable
9fe0: 29 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a 20  ), dropTable);. 
9ff0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
a000: 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b  hangeP3(v, base+
a010: 31 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  1, pTable->zName
a020: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
a030: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 69 44 62   if( pTable->iDb
a040: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
a050: 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  iteChangeCookie(
a060: 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20  db, v);.    }.  
a070: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
a080: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  p(v, OP_Close, 0
a090: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 69  , 0);.    if( !i
a0a0: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 73  sView ){.      s
a0b0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
a0c0: 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 54  , OP_Destroy, pT
a0d0: 61 62 6c 65 2d 3e 74 6e 75 6d 2c 20 70 54 61 62  able->tnum, pTab
a0e0: 6c 65 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20  le->iDb);.      
a0f0: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 6c 65 2d  for(pIdx=pTable-
a100: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
a110: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
a120: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a130: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a140: 44 65 73 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74  Destroy, pIdx->t
a150: 6e 75 6d 2c 20 70 49 64 78 2d 3e 69 44 62 29 3b  num, pIdx->iDb);
a160: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a170: 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74     sqliteEndWrit
a180: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
a190: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  e);.  }..  /* De
a1a0: 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  lete the in-memo
a1b0: 72 79 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  ry description o
a1c0: 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a  f the table..  *
a1d0: 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e  *.  ** Exception
a1e0: 3a 20 69 66 20 74 68 65 20 53 51 4c 20 73 74 61  : if the SQL sta
a1f0: 74 65 6d 65 6e 74 20 62 65 67 61 6e 20 77 69 74  tement began wit
a200: 68 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65  h the EXPLAIN ke
a210: 79 77 6f 72 64 2c 0a 20 20 2a 2a 20 74 68 65 6e  yword,.  ** then
a220: 20 6e 6f 20 63 68 61 6e 67 65 73 20 73 68 6f 75   no changes shou
a230: 6c 64 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f  ld be made..  */
a240: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
a250: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73  explain ){.    s
a260: 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65  qliteUnlinkAndDe
a270: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
a280: 61 62 6c 65 29 3b 0a 20 20 20 20 64 62 2d 3e 66  able);.    db->f
a290: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
a2a0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
a2b0: 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65  }.  sqliteViewRe
a2c0: 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b  setAll(db, iDb);
a2d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
a2e0: 6f 75 74 69 6e 65 20 63 6f 6e 73 74 72 75 63 74  outine construct
a2f0: 73 20 61 20 50 33 20 73 74 72 69 6e 67 20 73 75  s a P3 string su
a300: 69 74 61 62 6c 65 20 66 6f 72 20 61 6e 20 4f 50  itable for an OP
a310: 5f 4d 61 6b 65 49 64 78 4b 65 79 0a 2a 2a 20 6f  _MakeIdxKey.** o
a320: 70 63 6f 64 65 20 61 6e 64 20 61 64 64 73 20 74  pcode and adds t
a330: 68 61 74 20 50 33 20 73 74 72 69 6e 67 20 74 6f  hat P3 string to
a340: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
a350: 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74  ly inserted inst
a360: 72 75 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruction.** in th
a370: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
a380: 65 2e 20 20 54 68 65 20 50 33 20 73 74 72 69 6e  e.  The P3 strin
a390: 67 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  g consists of a 
a3a0: 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72  single character
a3b0: 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  .** for each col
a3c0: 75 6d 6e 20 69 6e 20 74 68 65 20 69 6e 64 65 78  umn in the index
a3d0: 20 70 49 64 78 20 6f 66 20 74 61 62 6c 65 20 70   pIdx of table p
a3e0: 54 61 62 2e 20 20 49 66 20 74 68 65 20 63 6f 6c  Tab.  If the col
a3f0: 75 6d 6e 20 75 73 65 73 0a 2a 2a 20 61 20 6e 75  umn uses.** a nu
a400: 6d 65 72 69 63 20 73 6f 72 74 20 6f 72 64 65 72  meric sort order
a410: 2c 20 74 68 65 6e 20 74 68 65 20 50 33 20 73 74  , then the P3 st
a420: 72 69 6e 67 20 63 68 61 72 61 63 74 65 72 20 63  ring character c
a430: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0a  orresponding to.
a440: 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  ** that column i
a450: 73 20 27 6e 27 2e 20 20 49 66 20 74 68 65 20 63  s 'n'.  If the c
a460: 6f 6c 75 6d 6e 20 75 73 65 73 20 61 20 74 65 78  olumn uses a tex
a470: 74 20 73 6f 72 74 20 6f 72 64 65 72 2c 20 74 68  t sort order, th
a480: 65 6e 20 74 68 65 0a 2a 2a 20 50 33 20 73 74 72  en the.** P3 str
a490: 69 6e 67 20 69 73 20 27 74 27 2e 20 20 53 65 65  ing is 't'.  See
a4a0: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 49 64 78 4b   the OP_MakeIdxK
a4b0: 65 79 20 6f 70 63 6f 64 65 20 64 6f 63 75 6d 65  ey opcode docume
a4c0: 6e 74 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61  ntation for.** a
a4d0: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
a4e0: 61 74 69 6f 6e 2e 20 20 53 65 65 20 61 6c 73 6f  ation.  See also
a4f0: 20 74 68 65 20 73 71 6c 69 74 65 41 64 64 4b 65   the sqliteAddKe
a500: 79 54 79 70 65 28 29 20 72 6f 75 74 69 6e 65 2e  yType() routine.
a510: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41  .*/.void sqliteA
a520: 64 64 49 64 78 4b 65 79 54 79 70 65 28 56 64 62  ddIdxKeyType(Vdb
a530: 65 20 2a 76 2c 20 49 6e 64 65 78 20 2a 70 49 64  e *v, Index *pId
a540: 78 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70  x){.  char *zTyp
a550: 65 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  e;.  Table *pTab
a560: 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  ;.  int i, n;.  
a570: 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20  assert( pIdx!=0 
a580: 26 26 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 21  && pIdx->pTable!
a590: 3d 30 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 70  =0 );.  pTab = p
a5a0: 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 6e  Idx->pTable;.  n
a5b0: 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   = pIdx->nColumn
a5c0: 3b 0a 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69  ;.  zType = sqli
a5d0: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 2b 31  teMallocRaw( n+1
a5e0: 20 29 3b 0a 20 20 69 66 28 20 7a 54 79 70 65 3d   );.  if( zType=
a5f0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
a600: 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
a610: 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  ){.    int iCol 
a620: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
a630: 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
a640: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
a650: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  <pTab->nCol );. 
a660: 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 61 43     if( (pTab->aC
a670: 6f 6c 5b 69 43 6f 6c 5d 2e 73 6f 72 74 4f 72 64  ol[iCol].sortOrd
a680: 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f 54  er & SQLITE_SO_T
a690: 59 50 45 4d 41 53 4b 29 3d 3d 53 51 4c 49 54 45  YPEMASK)==SQLITE
a6a0: 5f 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  _SO_TEXT ){.    
a6b0: 20 20 7a 54 79 70 65 5b 69 5d 20 3d 20 27 74 27    zType[i] = 't'
a6c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a6d0: 20 20 20 7a 54 79 70 65 5b 69 5d 20 3d 20 27 6e     zType[i] = 'n
a6e0: 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  ';.    }.  }.  z
a6f0: 54 79 70 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 73  Type[n] = 0;.  s
a700: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
a710: 33 28 76 2c 20 2d 31 2c 20 7a 54 79 70 65 2c 20  3(v, -1, zType, 
a720: 6e 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  n);.  sqliteFree
a730: 28 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (zType);.}../*.*
a740: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
a750: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
a760: 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e  te a new foreign
a770: 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c   key on the tabl
a780: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  e.** currently u
a790: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
a7a0: 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74  n.  pFromCol det
a7b0: 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f  ermines which co
a7c0: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
a7d0: 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f  current table po
a7e0: 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69  int to the forei
a7f0: 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f  gn key.  If pFro
a800: 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  mCol==0 then.** 
a810: 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20  connect the key 
a820: 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  to the last colu
a830: 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54  mn inserted.  pT
a840: 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
a850: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65  .** the table re
a860: 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43  ferred to.  pToC
a870: 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ol is a list of 
a880: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74  tables in the ot
a890: 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65  her.** pTo table
a8a0: 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67   that the foreig
a8b0: 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e  n key points to.
a8c0: 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
a8d0: 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
a8e0: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
a8f0: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
a900: 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
a910: 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
a920: 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
a930: 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
a940: 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
a950: 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
a960: 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
a970: 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
a980: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
a990: 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
a9a0: 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
a9b0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
a9c0: 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20  field.  The new 
a9d0: 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c  FKey.** is not l
a9e0: 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61  inked into db->a
a9f0: 46 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f 69  FKey at this poi
aa00: 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e  nt - that does n
aa10: 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74  ot happen.** unt
aa20: 69 6c 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c  il sqliteEndTabl
aa30: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  e()..**.** The f
aa40: 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65  oreign key is se
aa50: 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20  t for IMMEDIATE 
aa60: 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73  processing.  A s
aa70: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a  ubsequent call.*
aa80: 2a 20 74 6f 20 73 71 6c 69 74 65 44 65 66 65 72  * to sqliteDefer
aa90: 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67  ForeignKey() mig
aaa0: 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74  ht change this t
aab0: 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76  o DEFERRED..*/.v
aac0: 6f 69 64 20 73 71 6c 69 74 65 43 72 65 61 74 65  oid sqliteCreate
aad0: 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61  ForeignKey(.  Pa
aae0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
aaf0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
ab00: 6e 74 65 78 74 20 2a 2f 0a 20 20 49 64 4c 69 73  ntext */.  IdLis
ab10: 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 20 20  t *pFromCol,    
ab20: 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
ab30: 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f  is table that po
ab40: 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62  int to other tab
ab50: 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
ab60: 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  To,          /* 
ab70: 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65  Name of the othe
ab80: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 64 4c  r table */.  IdL
ab90: 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20  ist *pToCol,    
aba0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
abb0: 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
abc0: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
abd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
abe0: 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
abf0: 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a   algorithms. */.
ac00: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  ){.  Table *p = 
ac10: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
ac20: 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  e;.  int nByte;.
ac30: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
ac40: 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  Col;.  char *z;.
ac50: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20    FKey *pFKey = 
ac60: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  0;..  assert( pT
ac70: 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  o!=0 );.  if( p=
ac80: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
ac90: 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  rr ) goto fk_end
aca0: 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
acb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
acc0: 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  Col = p->nCol-1;
acd0: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  .    if( iCol<0 
ace0: 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20  ) goto fk_end;. 
acf0: 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26     if( pToCol &&
ad00: 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 31 20   pToCol->nId!=1 
ad10: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
ad20: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
ad30: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 66 6f 72  e->zErrMsg, "for
ad40: 65 69 67 6e 20 6b 65 79 20 6f 6e 20 22 2c 20 2d  eign key on ", -
ad50: 31 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61  1,.         p->a
ad60: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c  Col[iCol].zName,
ad70: 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 22   -1, .         "
ad80: 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63   should referenc
ad90: 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d  e only one colum
ada0: 6e 20 6f 66 20 74 61 62 6c 65 20 22 2c 20 2d 31  n of table ", -1
adb0: 2c 0a 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  ,.         pTo->
adc0: 7a 2c 20 70 54 6f 2d 3e 6e 2c 20 30 29 3b 0a 20  z, pTo->n, 0);. 
add0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
ade0: 72 2b 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  r++;.      goto 
adf0: 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  fk_end;.    }.  
ae00: 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65    nCol = 1;.  }e
ae10: 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26  lse if( pToCol &
ae20: 26 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 70  & pToCol->nId!=p
ae30: 46 72 6f 6d 43 6f 6c 2d 3e 6e 49 64 20 29 7b 0a  FromCol->nId ){.
ae40: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
ae50: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
ae60: 72 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 22  rMsg, .        "
ae70: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
ae80: 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  s in foreign key
ae90: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
aea0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a  the number of ".
aeb0: 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73          "columns
aec0: 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63   in the referenc
aed0: 65 64 20 74 61 62 6c 65 22 2c 20 30 29 3b 0a 20  ed table", 0);. 
aee0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
aef0: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  +;.    goto fk_e
af00: 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  nd;.  }else{.   
af10: 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c   nCol = pFromCol
af20: 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 20 20 6e 42 79  ->nId;.  }.  nBy
af30: 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b  te = sizeof(*pFK
af40: 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f  ey) + nCol*sizeo
af50: 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d  f(pFKey->aCol[0]
af60: 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a  ) + pTo->n + 1;.
af70: 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
af80: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
af90: 54 6f 43 6f 6c 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ToCol->nId; i++)
afa0: 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  {.      nByte +=
afb0: 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e   strlen(pToCol->
afc0: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b  a[i].zName) + 1;
afd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
afe0: 65 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ey = sqliteMallo
aff0: 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  c( nByte );.  if
b000: 28 20 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74  ( pFKey==0 ) got
b010: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65  o fk_end;.  pFKe
b020: 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20  y->pFrom = p;.  
b030: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
b040: 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a   = p->pFKey;.  z
b050: 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79   = (char*)&pFKey
b060: 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43  [1];.  pFKey->aC
b070: 6f 6c 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f  ol = (struct sCo
b080: 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20  lMap*)z;.  z += 
b090: 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43  sizeof(struct sC
b0a0: 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70  olMap)*nCol;.  p
b0b0: 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20  FKey->zTo = z;. 
b0c0: 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e   memcpy(z, pTo->
b0d0: 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b  z, pTo->n);.  z[
b0e0: 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a  pTo->n] = 0;.  z
b0f0: 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20   += pTo->n+1;.  
b100: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d  pFKey->pNextTo =
b110: 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f   0;.  pFKey->nCo
b120: 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20  l = nCol;.  if( 
b130: 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
b140: 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30     pFKey->aCol[0
b150: 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f  ].iFrom = p->nCo
b160: 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l-1;.  }else{.  
b170: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
b180: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
b190: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
b1a0: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20  j=0; j<p->nCol; 
b1b0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
b1c0: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
b1d0: 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  p->aCol[j].zName
b1e0: 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d  , pFromCol->a[i]
b1f0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
b200: 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61          pFKey->a
b210: 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a  Col[i].iFrom = j
b220: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
b230: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
b240: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
b250: 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  >=p->nCol ){.   
b260: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
b270: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
b280: 72 72 4d 73 67 2c 20 22 75 6e 6b 6e 6f 77 6e 20  rrMsg, "unknown 
b290: 63 6f 6c 75 6d 6e 20 5c 22 22 2c 20 0a 20 20 20  column \"", .   
b2a0: 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d         pFromCol-
b2b0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 22 5c 22  >a[i].zName, "\"
b2c0: 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
b2d0: 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 30 29 3b  definition", 0);
b2e0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
b2f0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
b300: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
b310: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
b320: 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
b330: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
b340: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
b350: 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28   int n = strlen(
b360: 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
b370: 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79  me);.      pFKey
b380: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d  ->aCol[i].zCol =
b390: 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   z;.      memcpy
b3a0: 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  (z, pToCol->a[i]
b3b0: 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  .zName, n);.    
b3c0: 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20    z[n] = 0;.    
b3d0: 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20    z += n+1;.    
b3e0: 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69  }.  }.  pFKey->i
b3f0: 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20  sDeferred = 0;. 
b400: 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f   pFKey->deleteCo
b410: 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66  nf = flags & 0xf
b420: 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61  f;.  pFKey->upda
b430: 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20  teConf = (flags 
b440: 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20  >> 8 ) & 0xff;. 
b450: 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f   pFKey->insertCo
b460: 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31  nf = (flags >> 1
b470: 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f  6 ) & 0xff;..  /
b480: 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69  * Link the forei
b490: 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61  gn key to the ta
b4a0: 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20  ble as the last 
b4b0: 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  step..  */.  p->
b4c0: 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20  pFKey = pFKey;. 
b4d0: 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f   pFKey = 0;..fk_
b4e0: 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46 72 65  end:.  sqliteFre
b4f0: 65 28 70 46 4b 65 79 29 3b 0a 20 20 73 71 6c 69  e(pFKey);.  sqli
b500: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  teIdListDelete(p
b510: 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  FromCol);.  sqli
b520: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  teIdListDelete(p
b530: 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ToCol);.}../*.**
b540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
b550: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
b560: 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
b570: 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59  ATE or INITIALLY
b580: 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61   DEFERRED.** cla
b590: 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70  use is seen as p
b5a0: 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e  art of a foreign
b5b0: 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e   key definition.
b5c0: 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64    The isDeferred
b5d0: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
b5e0: 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   1 for INITIALLY
b5f0: 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20   DEFERRED and 0 
b600: 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d  for INITIALLY IM
b610: 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20  MEDIATE..** The 
b620: 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20  behavior of the 
b630: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72  most recently cr
b640: 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  eated foreign ke
b650: 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a  y is adjusted.**
b660: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f   accordingly..*/
b670: 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 65 66 65  .void sqliteDefe
b680: 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73  rForeignKey(Pars
b690: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
b6a0: 73 44 65 66 65 72 72 65 64 29 7b 0a 20 20 54 61  sDeferred){.  Ta
b6b0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65  ble *pTab;.  FKe
b6c0: 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20  y *pFKey;.  if( 
b6d0: 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  (pTab = pParse->
b6e0: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c  pNewTable)==0 ||
b6f0: 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e   (pFKey = pTab->
b700: 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75  pFKey)==0 ) retu
b710: 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44  rn;.  pFKey->isD
b720: 65 66 65 72 72 65 64 20 3d 20 69 73 44 65 66 65  eferred = isDefe
b730: 72 72 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rred;.}../*.** C
b740: 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65  reate a new inde
b750: 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62  x for an SQL tab
b760: 6c 65 2e 20 20 70 49 6e 64 65 78 20 69 73 20 74  le.  pIndex is t
b770: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
b780: 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 61  ndex .** and pTa
b790: 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ble is the name 
b7a0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
b7b0: 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
b7c0: 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a  ed.  Both will .
b7d0: 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61  ** be NULL for a
b7e0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
b7f0: 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
b800: 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69   created to sati
b810: 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20  sfy a.** UNIQUE 
b820: 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20  constraint.  If 
b830: 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65  pTable and pInde
b840: 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20  x are NULL, use 
b850: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
b860: 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  e.** as the tabl
b870: 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  e to be indexed.
b880: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
b890: 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74  ble is a table t
b8a0: 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e  hat is.** curren
b8b0: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
b8c0: 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54  ucted by a CREAT
b8d0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
b8e0: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69  t..**.** pList i
b8f0: 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  s a list of colu
b900: 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
b910: 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62  d.  pList will b
b920: 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a  e NULL if this.*
b930: 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b  * is a primary k
b940: 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e  ey or unique-con
b950: 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d  straint on the m
b960: 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d  ost recent colum
b970: 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68  n added.** to th
b980: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
b990: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
b9a0: 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20  tion.  .*/.void 
b9b0: 73 71 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65  sqliteCreateInde
b9c0: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
b9d0: 73 65 2c 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66  se,   /* All inf
b9e0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
b9f0: 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54  his parse */.  T
ba00: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20  oken *pName,    
ba10: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
ba20: 6e 64 65 78 2e 20 20 4d 61 79 20 62 65 20 4e 55  ndex.  May be NU
ba30: 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  LL */.  SrcList 
ba40: 2a 70 54 61 62 6c 65 2c 20 2f 2a 20 4e 61 6d 65  *pTable, /* Name
ba50: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
ba60: 20 69 6e 64 65 78 2e 20 20 55 73 65 20 70 50 61   index.  Use pPa
ba70: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
ba80: 66 20 30 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20  f 0 */.  IdList 
ba90: 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c  *pList,   /* A l
baa0: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
bab0: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
bac0: 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
bad0: 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20     /* OE_Abort, 
bae0: 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65  OE_Ignore, OE_Re
baf0: 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e  place, or OE_Non
bb00: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  e */.  int isTem
bb10: 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  p,      /* True 
bb20: 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  if this is a tem
bb30: 70 6f 72 61 72 79 20 69 6e 64 65 78 20 2a 2f 0a  porary index */.
bb40: 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c    Token *pStart,
bb50: 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
bb60: 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
bb70: 6e 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ns a CREATE TABL
bb80: 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  E statement */. 
bb90: 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20   Token *pEnd    
bba0: 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61    /* The ")" tha
bbb0: 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45  t closes the CRE
bbc0: 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
bbd0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ent */.){.  Tabl
bbe0: 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20  e *pTab;     /* 
bbf0: 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  Table to be inde
bc00: 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  xed */.  Index *
bc10: 70 49 6e 64 65 78 3b 20 20 20 2f 2a 20 54 68 65  pIndex;   /* The
bc20: 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65   index to be cre
bc30: 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ated */.  char *
bc40: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zName = 0;.  int
bc50: 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e   i, j;.  Token n
bc60: 75 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b  ullId;    /* Fak
bc70: 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65  e token for an e
bc80: 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a  mpty ID list */.
bc90: 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20    DbFixer sFix; 
bca0: 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e     /* For assign
bcb0: 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d  ing database nam
bcc0: 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a  es to pTable */.
bcd0: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
bce0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
bcf0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
bd00: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
bd10: 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78  failed ) goto ex
bd20: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
bd30: 0a 20 20 69 66 28 20 21 69 73 54 65 6d 70 20 26  .  if( !isTemp &
bd40: 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c  & pParse->initFl
bd50: 61 67 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69  ag .     && sqli
bd60: 74 65 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  teFixInit(&sFix,
bd70: 20 70 50 61 72 73 65 2c 20 70 50 61 72 73 65 2d   pParse, pParse-
bd80: 3e 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70  >iDb, "index", p
bd90: 4e 61 6d 65 29 0a 20 20 20 20 20 26 26 20 73 71  Name).     && sq
bda0: 6c 69 74 65 46 69 78 53 72 63 4c 69 73 74 28 26  liteFixSrcList(&
bdb0: 73 46 69 78 2c 20 70 54 61 62 6c 65 29 0a 20 20  sFix, pTable).  
bdc0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
bdd0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
bde0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
bdf0: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  nd the table tha
be00: 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
be10: 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c  ed.  Return earl
be20: 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  y if not found..
be30: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
be40: 65 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  e!=0 ){.    asse
be50: 72 74 28 20 70 4e 61 6d 65 21 3d 30 20 29 3b 0a  rt( pName!=0 );.
be60: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
be70: 6c 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  le->nSrc==1 );. 
be80: 20 20 20 70 54 61 62 20 3d 20 20 73 71 6c 69 74     pTab =  sqlit
be90: 65 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70  eSrcListLookup(p
bea0: 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a  Parse, pTable);.
beb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
bec0: 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b  ert( pName==0 );
bed0: 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70 50 61  .    pTab =  pPa
bee0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
bef0: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 3d 3d    }.  if( pTab==
bf00: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
bf10: 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  r ) goto exit_cr
bf20: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66  eate_index;.  if
bf30: 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79  ( pTab->readOnly
bf40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
bf50: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
bf60: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65  >zErrMsg, "table
bf70: 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   ", pTab->zName,
bf80: 0a 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f 74  .      " may not
bf90: 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 30 29   be indexed", 0)
bfa0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
bfb0: 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rr++;.    goto e
bfc0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
bfd0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 54  ;.  }.  if( !isT
bfe0: 65 6d 70 20 26 26 20 70 54 61 62 2d 3e 69 44 62  emp && pTab->iDb
bff0: 3e 3d 32 20 26 26 20 70 50 61 72 73 65 2d 3e 69  >=2 && pParse->i
c000: 6e 69 74 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20  nitFlag==0 ){.  
c010: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
c020: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
c030: 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54  sg, "table ", pT
c040: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  ab->zName, .    
c050: 20 20 22 20 6d 61 79 20 6e 6f 74 20 68 61 76 65    " may not have
c060: 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 69   non-temporary i
c070: 6e 64 69 63 65 73 20 61 64 64 65 64 22 2c 20 30  ndices added", 0
c080: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
c090: 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  Err++;.    goto 
c0a0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
c0b0: 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61  x;.  }.  if( pTa
c0c0: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
c0d0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
c0e0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
c0f0: 73 67 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e  sg, "views may n
c100: 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20  ot be indexed", 
c110: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
c120: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
c130: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
c140: 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54  ex;.  }.  if( pT
c150: 61 62 2d 3e 69 44 62 3d 3d 31 20 29 7b 0a 20 20  ab->iDb==1 ){.  
c160: 20 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 20 20    isTemp = 1;.  
c170: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  }..  /*.  ** Fin
c180: 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  d the name of th
c190: 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73  e index.  Make s
c1a0: 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74  ure there is not
c1b0: 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72   already another
c1c0: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
c1d0: 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61  able with the sa
c1e0: 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a  me name.  .  **.
c1f0: 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20    ** Exception: 
c200: 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69   If we are readi
c210: 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ng the names of 
c220: 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65  permanent indice
c230: 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  s from the.  ** 
c240: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
c250: 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d  ble (because som
c260: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
c270: 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65  changed the sche
c280: 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65  ma) and.  ** one
c290: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61   of the index na
c2a0: 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74  mes collides wit
c2b0: 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  h the name of a 
c2c0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
c2d0: 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74  or.  ** index, t
c2e0: 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74  hen we will cont
c2f0: 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20  inue to process 
c300: 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a  this index..  **
c310: 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d  .  ** If pName==
c320: 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  0 it means that 
c330: 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c  we are.  ** deal
c340: 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61  ing with a prima
c350: 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45  ry key or UNIQUE
c360: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65   constraint.  We
c370: 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20   have to invent 
c380: 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d  our.  ** own nam
c390: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e  e..  */.  if( pN
c3a0: 61 6d 65 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ame && !pParse->
c3b0: 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20  initFlag ){.    
c3c0: 49 6e 64 65 78 20 2a 70 49 53 61 6d 65 4e 61 6d  Index *pISameNam
c3d0: 65 3b 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72  e;    /* Another
c3e0: 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20   index with the 
c3f0: 73 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  same name */.   
c400: 20 54 61 62 6c 65 20 2a 70 54 53 61 6d 65 4e 61   Table *pTSameNa
c410: 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74 61 62 6c  me;    /* A tabl
c420: 65 20 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65  e with same name
c430: 20 61 73 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   as the index */
c440: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
c450: 69 74 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65  iteStrNDup(pName
c460: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a  ->z, pName->n);.
c470: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
c480: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
c490: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
c4a0: 66 28 20 28 70 49 53 61 6d 65 4e 61 6d 65 20 3d  f( (pISameName =
c4b0: 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78   sqliteFindIndex
c4c0: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21  (db, zName, 0))!
c4d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
c4e0: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
c4f0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 69  rse->zErrMsg, "i
c500: 6e 64 65 78 20 22 2c 20 7a 4e 61 6d 65 2c 20 0a  ndex ", zName, .
c510: 20 20 20 20 20 20 20 20 20 22 20 61 6c 72 65 61           " alrea
c520: 64 79 20 65 78 69 73 74 73 22 2c 20 30 29 3b 0a  dy exists", 0);.
c530: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
c540: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f  rr++;.      goto
c550: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
c560: 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
c570: 28 20 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d 20  ( (pTSameName = 
c580: 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
c590: 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d  db, zName, 0))!=
c5a0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
c5b0: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
c5c0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 68  se->zErrMsg, "th
c5d0: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
c5e0: 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 2c 0a   table named ",.
c5f0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20           zName, 
c600: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
c610: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
c620: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
c630: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
c640: 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 3d  }else if( pName=
c650: 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  =0 ){.    char z
c660: 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74  Buf[30];.    int
c670: 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   n;.    Index *p
c680: 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c  Loop;.    for(pL
c690: 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  oop=pTab->pIndex
c6a0: 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c  , n=1; pLoop; pL
c6b0: 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74  oop=pLoop->pNext
c6c0: 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72  , n++){}.    spr
c6d0: 69 6e 74 66 28 7a 42 75 66 2c 22 25 64 29 22 2c  intf(zBuf,"%d)",
c6e0: 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  n);.    zName = 
c6f0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  0;.    sqliteSet
c700: 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22  String(&zName, "
c710: 28 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  (", pTab->zName,
c720: 20 22 20 61 75 74 6f 69 6e 64 65 78 20 22 2c 20   " autoindex ", 
c730: 7a 42 75 66 2c 20 30 29 3b 0a 20 20 20 20 69 66  zBuf, 0);.    if
c740: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74  ( zName==0 ) got
c750: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
c760: 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dex;.  }else{.  
c770: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
c780: 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a  StrNDup(pName->z
c790: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 7d  , pName->n);.  }
c7a0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
c7b0: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
c7c0: 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65  o create an inde
c7d0: 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  x..  */.#ifndef 
c7e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
c7f0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
c800: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
c810: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62  b = db->aDb[pTab
c820: 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20  ->iDb].zName;.. 
c830: 20 20 20 61 73 73 65 72 74 28 20 69 73 54 65 6d     assert( isTem
c840: 70 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d  p==0 || isTemp==
c850: 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
c860: 20 70 54 61 62 2d 3e 69 44 62 3d 3d 70 50 61 72   pTab->iDb==pPar
c870: 73 65 2d 3e 69 44 62 20 7c 7c 20 69 73 54 65 6d  se->iDb || isTem
c880: 70 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  p==1 );.    if( 
c890: 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28  sqliteAuthCheck(
c8a0: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49  pParse, SQLITE_I
c8b0: 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41  NSERT, SCHEMA_TA
c8c0: 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20  BLE(isTemp), 0, 
c8d0: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
c8e0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
c8f0: 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
c900: 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
c910: 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  E_INDEX;.    if(
c920: 20 69 73 54 65 6d 70 20 29 20 69 20 3d 20 53 51   isTemp ) i = SQ
c930: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
c940: 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
c950: 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28  sqliteAuthCheck(
c960: 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65  pParse, i, zName
c970: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
c980: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
c990: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
c9a0: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dex;.    }.  }.#
c9b0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70  endif..  /* If p
c9c0: 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e  List==0, it mean
c9d0: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
c9e0: 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b  as called to mak
c9f0: 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a  e a primary.  **
ca00: 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20   key out of the 
ca10: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  last column adde
ca20: 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75  d to the table u
ca30: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
ca40: 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74  n..  ** So creat
ca50: 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f  e a fake list to
ca60: 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a   simulate this..
ca70: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74    */.  if( pList
ca80: 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49  ==0 ){.    nullI
ca90: 64 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  d.z = pTab->aCol
caa0: 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a  [pTab->nCol-1].z
cab0: 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64  Name;.    nullId
cac0: 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c 6c  .n = strlen(null
cad0: 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74  Id.z);.    pList
cae0: 20 3d 20 73 71 6c 69 74 65 49 64 4c 69 73 74 41   = sqliteIdListA
caf0: 70 70 65 6e 64 28 30 2c 20 26 6e 75 6c 6c 49 64  ppend(0, &nullId
cb00: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
cb10: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
cb20: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
cb30: 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c  }..  /* .  ** Al
cb40: 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  locate the index
cb50: 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a   structure. .  *
cb60: 2f 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  /.  pIndex = sql
cb70: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
cb80: 66 28 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65  f(Index) + strle
cb90: 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20  n(zName) + 1 +. 
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbb0: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e         sizeof(in
cbc0: 74 29 2a 70 4c 69 73 74 2d 3e 6e 49 64 20 29 3b  t)*pList->nId );
cbd0: 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
cbe0: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
cbf0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49 6e  ate_index;.  pIn
cc00: 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20  dex->aiColumn = 
cc10: 28 69 6e 74 2a 29 26 70 49 6e 64 65 78 5b 31 5d  (int*)&pIndex[1]
cc20: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ;.  pIndex->zNam
cc30: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64  e = (char*)&pInd
cc40: 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69  ex->aiColumn[pLi
cc50: 73 74 2d 3e 6e 49 64 5d 3b 0a 20 20 73 74 72 63  st->nId];.  strc
cc60: 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  py(pIndex->zName
cc70: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64  , zName);.  pInd
cc80: 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  ex->pTable = pTa
cc90: 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  b;.  pIndex->nCo
cca0: 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 49  lumn = pList->nI
ccb0: 64 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  d;.  pIndex->onE
ccc0: 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  rror = onError;.
ccd0: 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e    pIndex->autoIn
cce0: 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a  dex = pName==0;.
ccf0: 20 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 3d 20    pIndex->iDb = 
cd00: 69 73 54 65 6d 70 20 3f 20 31 20 3a 20 70 50 61  isTemp ? 1 : pPa
cd10: 72 73 65 2d 3e 69 44 62 3b 0a 0a 20 20 2f 2a 20  rse->iDb;..  /* 
cd20: 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  Scan the names o
cd30: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  f the columns of
cd40: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
cd50: 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a   indexed and.  *
cd60: 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d  * load the colum
cd70: 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74  n indices into t
cd80: 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  he Index structu
cd90: 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65  re.  Report an e
cda0: 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79  rror.  ** if any
cdb0: 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66   column is not f
cdc0: 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ound..  */.  for
cdd0: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
cde0: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f  Id; i++){.    fo
cdf0: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
ce00: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
ce10: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
ce20: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
ce30: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
ce40: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [j].zName)==0 ) 
ce50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ce60: 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
ce70: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
ce80: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
ce90: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74  rse->zErrMsg, "t
cea0: 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e  able ", pTab->zN
ceb0: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 22 20  ame, .        " 
cec0: 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61  has no column na
ced0: 6d 65 64 20 22 2c 20 70 4c 69 73 74 2d 3e 61 5b  med ", pList->a[
cee0: 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  i].zName, 0);.  
cef0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
cf00: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
cf10: 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20  Free(pIndex);.  
cf20: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
cf30: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
cf40: 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69  }.    pIndex->ai
cf50: 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20  Column[i] = j;. 
cf60: 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
cf70: 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75  e new Index stru
cf80: 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62  cture to its tab
cf90: 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74  le and to the ot
cfa0: 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f  her.  ** in-memo
cfb0: 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75  ry database stru
cfc0: 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20  ctures. .  */.  
cfd0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70  if( !pParse->exp
cfe0: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 49 6e 64 65  lain ){.    Inde
cff0: 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71  x *p;.    p = sq
d000: 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26  liteHashInsert(&
d010: 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e  db->aDb[pIndex->
d020: 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 0a 20  iDb].idxHash, . 
d030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d040: 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
d050: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49  zName, strlen(pI
d060: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20  ndex->zName)+1, 
d070: 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28  pIndex);.    if(
d080: 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65   p ){.      asse
d090: 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b  rt( p==pIndex );
d0a0: 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
d0b0: 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
d0c0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
d0d0: 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  (pIndex);.      
d0e0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
d0f0: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
d100: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
d110: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
d120: 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  ges;.  }..  /* W
d130: 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e  hen adding an in
d140: 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20  dex to the list 
d150: 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61  of indices for a
d160: 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a   table, make.  *
d170: 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63  * sure all indic
d180: 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65  es labeled OE_Re
d190: 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72  place come after
d1a0: 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c   all those label
d1b0: 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72  ed.  ** OE_Ignor
d1c0: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  e.  This is nece
d1d0: 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f  ssary for the co
d1e0: 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
d1f0: 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61  of UPDATE.  ** a
d200: 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a  nd INSERT..  */.
d210: 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f    if( onError!=O
d220: 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61  E_Replace || pTa
d230: 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20  b->pIndex==0.   
d240: 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e      || pTab->pIn
d250: 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
d260: 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 70  _Replace){.    p
d270: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
d280: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
d290: 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20   pTab->pIndex = 
d2a0: 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b  pIndex;.  }else{
d2b0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68  .    Index *pOth
d2c0: 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  er = pTab->pInde
d2d0: 78 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 4f  x;.    while( pO
d2e0: 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70  ther->pNext && p
d2f0: 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e  Other->pNext->on
d300: 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
d310: 65 20 29 7b 0a 20 20 20 20 20 20 70 4f 74 68 65  e ){.      pOthe
d320: 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  r = pOther->pNex
d330: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  t;.    }.    pIn
d340: 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74  dex->pNext = pOt
d350: 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
d360: 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20  pOther->pNext = 
d370: 70 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  pIndex;.  }..  /
d380: 2a 20 49 66 20 74 68 65 20 69 6e 69 74 46 6c 61  * If the initFla
d390: 67 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20  g is 1 it means 
d3a0: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
d3b0: 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20  he SQL off the. 
d3c0: 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74   ** "sqlite_mast
d3d0: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
d3e0: 20 64 69 73 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f   disk.  So do no
d3f0: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  t write to the d
d400: 69 73 6b 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20  isk.  ** again. 
d410: 20 45 78 74 72 61 63 74 20 74 68 65 20 74 61 62   Extract the tab
d420: 6c 65 20 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74  le number from t
d430: 68 65 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e  he pParse->newTn
d440: 75 6d 20 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20  um field..  */. 
d450: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69   if( pParse->ini
d460: 74 46 6c 61 67 20 26 26 20 70 54 61 62 6c 65 21  tFlag && pTable!
d470: 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78  =0 ){.    pIndex
d480: 2d 3e 74 6e 75 6d 20 3d 20 70 50 61 72 73 65 2d  ->tnum = pParse-
d490: 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20  >newTnum;.  }.. 
d4a0: 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69 74 46   /* If the initF
d4b0: 6c 61 67 20 69 73 20 30 20 74 68 65 6e 20 63 72  lag is 0 then cr
d4c0: 65 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f  eate the index o
d4d0: 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20  n disk.  This.  
d4e0: 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74  ** involves writ
d4f0: 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e  ing the index in
d500: 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  to the master ta
d510: 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20  ble and filling 
d520: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  in the.  ** inde
d530: 78 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65  x with the curre
d540: 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74  nt table content
d550: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
d560: 20 69 6e 69 74 46 6c 61 67 20 69 73 20 30 20 77   initFlag is 0 w
d570: 68 65 6e 20 74 68 65 20 75 73 65 72 20 66 69 72  hen the user fir
d580: 73 74 20 65 6e 74 65 72 73 20 61 20 43 52 45 41  st enters a CREA
d590: 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63  TE INDEX .  ** c
d5a0: 6f 6d 6d 61 6e 64 2e 20 20 54 68 65 20 69 6e 69  ommand.  The ini
d5b0: 74 46 6c 61 67 20 69 73 20 31 20 77 68 65 6e 20  tFlag is 1 when 
d5c0: 61 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  a database is op
d5d0: 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43  ened and .  ** C
d5e0: 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
d5f0: 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64 20  ements are read 
d600: 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65  out of the maste
d610: 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a  r table.  In.  *
d620: 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73  * the latter cas
d630: 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65  e the index alre
d640: 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69  ady exists on di
d650: 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68 79  sk, which is why
d660: 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77  .  ** we don't w
d670: 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20  ant to recreate 
d680: 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  it..  **.  ** If
d690: 20 70 54 61 62 6c 65 3d 3d 30 20 69 74 20 6d 65   pTable==0 it me
d6a0: 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69  ans this index i
d6b0: 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61  s generated as a
d6c0: 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a   primary key.  *
d6d0: 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  * or UNIQUE cons
d6e0: 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41  traint of a CREA
d6f0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
d700: 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74  nt.  Since the t
d710: 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75  able.  ** has ju
d720: 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  st been created,
d730: 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   it contains no 
d740: 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64  data and the ind
d750: 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ex initializatio
d760: 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20  n.  ** step can 
d770: 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  be skipped..  */
d780: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 50 61 72  .  else if( pPar
d790: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 3d 3d 30 20  se->initFlag==0 
d7a0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
d7b0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 69    Vdbe *v;.    i
d7c0: 6e 74 20 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a 20  nt lbl1, lbl2;. 
d7d0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
d7e0: 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 76 20 3d  t addr;..    v =
d7f0: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
d800: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
d810: 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  v==0 ) goto exit
d820: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
d830: 20 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30     if( pTable!=0
d840: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d850: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
d860: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
d870: 73 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  sTemp);.      sq
d880: 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61  liteOpenMasterTa
d890: 62 6c 65 28 76 2c 20 69 73 54 65 6d 70 29 3b 0a  ble(v, isTemp);.
d8a0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
d8b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d8c0: 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b  NewRecno, 0, 0);
d8d0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
d8e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
d8f0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  g, 0, 0);.    sq
d900: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
d910: 28 76 2c 20 2d 31 2c 20 22 69 6e 64 65 78 22 2c  (v, -1, "index",
d920: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
d930: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d940: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
d950: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
d960: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
d970: 2d 31 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  -1, pIndex->zNam
d980: 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  e, P3_STATIC);. 
d990: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
d9a0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
d9b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
d9c0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
d9d0: 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  , -1, pTab->zNam
d9e0: 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  e, P3_STATIC);. 
d9f0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
da00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
da10: 43 72 65 61 74 65 49 6e 64 65 78 2c 20 30 2c 20  CreateIndex, 0, 
da20: 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c  isTemp);.    sql
da30: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
da40: 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29  v, addr, (char*)
da50: 26 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 50  &pIndex->tnum, P
da60: 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20  3_POINTER);.    
da70: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 30  pIndex->tnum = 0
da80: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  ;.    if( pTable
da90: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
daa0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
dab0: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
dac0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
dad0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
dae0: 20 69 73 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20   isTemp, 0);.   
daf0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
db00: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  Op(v, OP_OpenWri
db10: 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d  te, 1, 0);.    }
db20: 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69  .    addr = sqli
db30: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
db40: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
db50: 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20  .    if( pStart 
db60: 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  && pEnd ){.     
db70: 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e   n = Addr(pEnd->
db80: 7a 29 20 2d 20 41 64 64 72 28 70 53 74 61 72 74  z) - Addr(pStart
db90: 2d 3e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  ->z) + 1;.      
dba0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
dbb0: 50 33 28 76 2c 20 61 64 64 72 2c 20 70 53 74 61  P3(v, addr, pSta
dbc0: 72 74 2d 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d  rt->z, n);.    }
dbd0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
dbe0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
dbf0: 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a 20 20  ecord, 5, 0);.  
dc00: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
dc10: 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65  p(v, OP_PutIntKe
dc20: 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  y, 0, 0);.    if
dc30: 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
dc40: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
dc50: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
dc60: 20 70 54 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a   pTab->iDb, 0);.
dc70: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
dc80: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
dc90: 52 65 61 64 2c 20 32 2c 20 70 54 61 62 2d 3e 74  Read, 2, pTab->t
dca0: 6e 75 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  num);.      sqli
dcb0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
dcc0: 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  , -1, pTab->zNam
dcd0: 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  e, P3_STATIC);. 
dce0: 20 20 20 20 20 6c 62 6c 32 20 3d 20 73 71 6c 69       lbl2 = sqli
dcf0: 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
dd00: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
dd10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
dd20: 52 65 77 69 6e 64 2c 20 32 2c 20 6c 62 6c 32 29  Rewind, 2, lbl2)
dd30: 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d 20 73  ;.      lbl1 = s
dd40: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
dd50: 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20 32 2c 20 30  , OP_Recno, 2, 0
dd60: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
dd70: 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ; i<pIndex->nCol
dd80: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
dd90: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49     int iCol = pI
dda0: 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
ddb0: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
ddc0: 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c  Tab->iPKey==iCol
ddd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
dde0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
ddf0: 20 4f 50 5f 44 75 70 2c 20 69 2c 20 30 29 3b 0a   OP_Dup, i, 0);.
de00: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
de10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56           sqliteV
de20: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
de30: 6f 6c 75 6d 6e 2c 20 32 2c 20 69 43 6f 6c 29 3b  olumn, 2, iCol);
de40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
de50: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   }.      sqliteV
de60: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
de70: 61 6b 65 49 64 78 4b 65 79 2c 20 70 49 6e 64 65  akeIdxKey, pInde
de80: 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  x->nColumn, 0);.
de90: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 66 69        if( db->fi
dea0: 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 20 73  le_format>=4 ) s
deb0: 71 6c 69 74 65 41 64 64 49 64 78 4b 65 79 54 79  qliteAddIdxKeyTy
dec0: 70 65 28 76 2c 20 70 49 6e 64 65 78 29 3b 0a 20  pe(v, pIndex);. 
ded0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
dee0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 50 75  ddOp(v, OP_IdxPu
def0: 74 2c 20 31 2c 20 70 49 6e 64 65 78 2d 3e 6f 6e  t, 1, pIndex->on
df00: 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 3b  Error!=OE_None);
df10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
df20: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
df30: 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e   "indexed column
df40: 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65  s are not unique
df50: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
df60: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
df70: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
df80: 20 32 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20   2, lbl1);.     
df90: 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c   sqliteVdbeResol
dfa0: 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 32 29  veLabel(v, lbl2)
dfb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
dfc0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
dfd0: 6f 73 65 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  ose, 2, 0);.    
dfe0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
dff0: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31  p(v, OP_Close, 1
e000: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
e010: 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b  if( pTable!=0 ){
e020: 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 54 65  .      if( !isTe
e030: 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  mp ){.        sq
e040: 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65  liteChangeCookie
e050: 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 20 20 7d  (db, v);.      }
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 43 6c 6f  eAddOp(v, OP_Clo
e080: 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  se, 0, 0);.     
e090: 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
e0a0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
e0b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
e0c0: 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72  * Clean up befor
e0d0: 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69  e exiting */.exi
e0e0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a  t_create_index:.
e0f0: 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65    sqliteIdListDe
e100: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73  lete(pList);.  s
e110: 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65  qliteSrcListDele
e120: 74 65 28 70 54 61 62 6c 65 29 3b 0a 20 20 73 71  te(pTable);.  sq
e130: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
e140: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
e150: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
e160: 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78   will drop an ex
e170: 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64  isting named ind
e180: 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ex.  This routin
e190: 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20  e.** implements 
e1a0: 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73  the DROP INDEX s
e1b0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
e1c0: 64 20 73 71 6c 69 74 65 44 72 6f 70 49 6e 64 65  d sqliteDropInde
e1d0: 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
e1e0: 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 29   SrcList *pName)
e1f0: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
e200: 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  x;.  Vdbe *v;.  
e210: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
e220: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
e230: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
e240: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
e250: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
e260: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
e270: 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70 49 6e  nSrc==1 );.  pIn
e280: 64 65 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  dex = sqliteFind
e290: 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d  Index(db, pName-
e2a0: 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61  >a[0].zName, pNa
e2b0: 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
e2c0: 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  se);.  if( pInde
e2d0: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x==0 ){.    sqli
e2e0: 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  teErrorMsg(pPars
e2f0: 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
e300: 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30  x: %S", pName, 0
e310: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
e320: 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
e330: 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61  .  if( pIndex->a
e340: 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  utoIndex ){.    
e350: 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
e360: 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73  Parse, "index as
e370: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e  sociated with UN
e380: 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72  IQUE ".      "or
e390: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
e3a0: 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62  straint cannot b
e3b0: 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a  e dropped", 0);.
e3c0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
e3d0: 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
e3e0: 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 3e  if( pIndex->iDb>
e3f0: 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45  1 ){.    sqliteE
e400: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
e410: 22 63 61 6e 6e 6f 74 20 61 6c 74 65 72 20 73 63  "cannot alter sc
e420: 68 65 6d 61 20 6f 66 20 61 74 74 61 63 68 65 64  hema of attached
e430: 20 22 0a 20 20 20 20 20 20 20 22 64 61 74 61 62   ".       "datab
e440: 61 73 65 73 22 2c 20 30 29 3b 0a 20 20 20 20 67  ases", 0);.    g
e450: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
e460: 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  dex;.  }.#ifndef
e470: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
e480: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
e490: 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51     int code = SQ
e4a0: 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b  LITE_DROP_INDEX;
e4b0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
e4c0: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
e4d0: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
e4e0: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
e4f0: 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e  [pIndex->iDb].zN
e500: 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
e510: 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
e520: 4d 41 5f 54 41 42 4c 45 28 70 49 6e 64 65 78 2d  MA_TABLE(pIndex-
e530: 3e 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73  >iDb);.    if( s
e540: 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70  qliteAuthCheck(p
e550: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
e560: 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
e570: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
e580: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
e590: 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
e5a0: 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 29 20 63   pIndex->iDb ) c
e5b0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
e5c0: 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  P_TEMP_INDEX;.  
e5d0: 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68    if( sqliteAuth
e5e0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
e5f0: 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  de, pIndex->zNam
e600: 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
e610: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
e620: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
e630: 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
e640: 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
e650: 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
e660: 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  ve the index and
e670: 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
e680: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20   table */.  v = 
e690: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
e6a0: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
e6b0: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62  {.    static Vdb
e6c0: 65 4f 70 20 64 72 6f 70 49 6e 64 65 78 5b 5d 20  eOp dropIndex[] 
e6d0: 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52  = {.      { OP_R
e6e0: 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44  ewind,     0, AD
e6f0: 44 52 28 39 29 2c 20 30 7d 2c 20 0a 20 20 20 20  DR(9), 0}, .    
e700: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20    { OP_String,  
e710: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30     0, 0,       0
e720: 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20  }, /* 1 */.     
e730: 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20   { OP_MemStore, 
e740: 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20 30 7d    1, 1,       0}
e750: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d  ,.      { OP_Mem
e760: 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c 20 20  Load,    1, 0,  
e770: 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f       0}, /* 3 */
e780: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
e790: 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20  mn,     0, 1,   
e7a0: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
e7b0: 4f 50 5f 45 71 2c 20 20 20 20 20 20 20 20 20 30  OP_Eq,         0
e7c0: 2c 20 41 44 44 52 28 38 29 2c 20 30 7d 2c 0a 20  , ADDR(8), 0},. 
e7d0: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20       { OP_Next, 
e7e0: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 33 29        0, ADDR(3)
e7f0: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
e800: 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c 20  _Goto,       0, 
e810: 41 44 44 52 28 39 29 2c 20 30 7d 2c 0a 20 20 20  ADDR(9), 0},.   
e820: 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20     { OP_Delete, 
e830: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
e840: 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20  0}, /* 8 */.    
e850: 7d 3b 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b  };.    int base;
e860: 0a 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67 69  ..    sqliteBegi
e870: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
e880: 70 50 61 72 73 65 2c 20 30 2c 20 70 49 6e 64 65  pParse, 0, pInde
e890: 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  x->iDb);.    sql
e8a0: 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  iteOpenMasterTab
e8b0: 6c 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 69 44  le(v, pIndex->iD
e8c0: 62 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20 73  b);.    base = s
e8d0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69  qliteVdbeAddOpLi
e8e0: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
e8f0: 64 72 6f 70 49 6e 64 65 78 29 2c 20 64 72 6f 70  dropIndex), drop
e900: 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  Index);.    sqli
e910: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
e920: 2c 20 62 61 73 65 2b 31 2c 20 70 49 6e 64 65 78  , base+1, pIndex
e930: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
e940: 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 44 62   if( pIndex->iDb
e950: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
e960: 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  iteChangeCookie(
e970: 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20  db, v);.    }.  
e980: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
e990: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  p(v, OP_Close, 0
e9a0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
e9b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e9c0: 44 65 73 74 72 6f 79 2c 20 70 49 6e 64 65 78 2d  Destroy, pIndex-
e9d0: 3e 74 6e 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69  >tnum, pIndex->i
e9e0: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45  Db);.    sqliteE
e9f0: 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  ndWriteOperation
ea00: 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20  (pParse);.  }.. 
ea10: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 69   /* Delete the i
ea20: 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 63 72 69 70  n-memory descrip
ea30: 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 69 6e 64  tion of this ind
ea40: 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ex..  */.  if( !
ea50: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
ea60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c  ){.    sqliteUnl
ea70: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65  inkAndDeleteInde
ea80: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
ea90: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
eaa0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
eab0: 6e 67 65 73 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f  nges;.  }..exit_
eac0: 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71  drop_index:.  sq
ead0: 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74  liteSrcListDelet
eae0: 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pName);.}../*.
eaf0: 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
eb00: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67  element to the g
eb10: 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72  iven IdList.  Cr
eb20: 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73  eate a new IdLis
eb30: 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
eb40: 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c  .**.** A new IdL
eb50: 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
eb60: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c   or NULL if mall
eb70: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49  oc() fails..*/.I
eb80: 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 49 64 4c  dList *sqliteIdL
eb90: 69 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74  istAppend(IdList
eba0: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
ebb0: 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70  pToken){.  if( p
ebc0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
ebd0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  List = sqliteMal
ebe0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69  loc( sizeof(IdLi
ebf0: 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
ec00: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
ec10: 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   0;.    pList->n
ec20: 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  Alloc = 0;.  }. 
ec30: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3e   if( pList->nId>
ec40: 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29  =pList->nAlloc )
ec50: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
ec60: 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20  ist_item *a;.   
ec70: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
ec80: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32   pList->nAlloc*2
ec90: 20 2b 20 35 3b 0a 20 20 20 20 61 20 3d 20 73 71   + 5;.    a = sq
eca0: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73  liteRealloc(pLis
ecb0: 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c  t->a, pList->nAl
ecc0: 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  loc*sizeof(pList
ecd0: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  ->a[0]) );.    i
ece0: 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( a==0 ){.     
ecf0: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c   sqliteIdListDel
ed00: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
ed10: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
ed20: 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d  }.    pList->a =
ed30: 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74   a;.  }.  memset
ed40: 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74  (&pList->a[pList
ed50: 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->nId], 0, sizeo
ed60: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
ed70: 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b  .  if( pToken ){
ed80: 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d  .    char **pz =
ed90: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
eda0: 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->nId].zName;.  
edb0: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
edc0: 6e 67 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a  ng(pz, pToken->z
edd0: 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b  , pToken->n, 0);
ede0: 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20  .    if( *pz==0 
edf0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49  ){.      sqliteI
ee00: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  dListDelete(pLis
ee10: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
ee20: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
ee30: 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f       sqliteDequo
ee40: 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20  te(*pz);.    }. 
ee50: 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b   }.  pList->nId+
ee60: 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  +;.  return pLis
ee70: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  t;.}../*.** Appe
ee80: 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e  nd a new table n
ee90: 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ame to the given
eea0: 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74   SrcList.  Creat
eeb0: 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  e a new SrcList 
eec0: 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20  if.** need be.  
eed0: 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63  A new entry is c
eee0: 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72  reated in the Sr
eef0: 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54  cList even if pT
ef00: 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  oken is NULL..**
ef10: 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73  .** A new SrcLis
ef20: 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
ef30: 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
ef40: 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20  () fails..**.** 
ef50: 49 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20  If pDatabase is 
ef60: 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61  not null, it mea
ef70: 6e 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  ns that the tabl
ef80: 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61  e has an optiona
ef90: 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61  l.** database na
efa0: 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65  me prefix.  Like
efb0: 20 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73   this:  "databas
efc0: 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70  e.table".  The p
efd0: 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e  Database.** poin
efe0: 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ts to the table 
eff0: 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61  name and the pTa
f000: 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ble points to th
f010: 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
f020: 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e  .** The SrcList.
f030: 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20  a[].zName field 
f040: 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
f050: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68  he table name wh
f060: 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d  ich might.** com
f070: 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69  e from pTable (i
f080: 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e  f pDatabase is N
f090: 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61  ULL) or from pDa
f0a0: 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63  tabase.  .** Src
f0b0: 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61  List.a[].zDataba
f0c0: 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  se is filled wit
f0d0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  h the database n
f0e0: 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c  ame from pTable,
f0f0: 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c  .** or with NULL
f100: 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20   if no database 
f110: 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  is specified..**
f120: 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
f130: 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65  ds, if call like
f140: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
f150: 20 20 20 20 20 73 71 6c 69 74 65 53 72 63 4c 69       sqliteSrcLi
f160: 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b  stAppend(A,B,0);
f170: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73  .**.** Then B is
f180: 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e   a table name an
f190: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  d the database n
f1a0: 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69  ame is unspecifi
f1b0: 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a  ed.  If called.*
f1c0: 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  * like this:.**.
f1d0: 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
f1e0: 65 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41  eSrcListAppend(A
f1f0: 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,C);.**.** The
f200: 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65  n C is the table
f210: 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74   name and B is t
f220: 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
f230: 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
f240: 6c 69 74 65 53 72 63 4c 69 73 74 41 70 70 65 6e  liteSrcListAppen
f250: 64 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  d(SrcList *pList
f260: 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c  , Token *pTable,
f270: 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73   Token *pDatabas
f280: 65 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  e){.  if( pList=
f290: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
f2a0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
f2b0: 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20  sizeof(SrcList) 
f2c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
f2d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
f2e0: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
f2f0: 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  c = 1;.  }.  if(
f300: 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c   pList->nSrc>=pL
f310: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  ist->nAlloc ){. 
f320: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77     SrcList *pNew
f330: 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
f340: 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e  loc *= 2;.    pN
f350: 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  ew = sqliteReall
f360: 6f 63 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20  oc(pList,.      
f370: 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
f380: 2a 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74  *pList) + (pList
f390: 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65  ->nAlloc-1)*size
f3a0: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20  of(pList->a[0]) 
f3b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
f3c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
f3d0: 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  teSrcListDelete(
f3e0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
f3f0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
f400: 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a    pList = pNew;.
f410: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c    }.  memset(&pL
f420: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53  ist->a[pList->nS
f430: 72 63 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  rc], 0, sizeof(p
f440: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
f450: 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26  if( pDatabase &&
f460: 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30   pDatabase->z==0
f470: 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73   ){.    pDatabas
f480: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
f490: 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70 54   pDatabase && pT
f4a0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65  able ){.    Toke
f4b0: 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61  n *pTemp = pData
f4c0: 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62  base;.    pDatab
f4d0: 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ase = pTable;.  
f4e0: 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70    pTable = pTemp
f4f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62  ;.  }.  if( pTab
f500: 6c 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  le ){.    char *
f510: 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  *pz = &pList->a[
f520: 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a 4e 61  pList->nSrc].zNa
f530: 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65  me;.    sqliteSe
f540: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 54 61  tNString(pz, pTa
f550: 62 6c 65 2d 3e 7a 2c 20 70 54 61 62 6c 65 2d 3e  ble->z, pTable->
f560: 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a  n, 0);.    if( *
f570: 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  pz==0 ){.      s
f580: 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65  qliteSrcListDele
f590: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  te(pList);.     
f5a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
f5b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
f5c0: 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a  teDequote(*pz);.
f5d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
f5e0: 70 44 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20  pDatabase ){.   
f5f0: 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c   char **pz = &pL
f600: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53  ist->a[pList->nS
f610: 72 63 5d 2e 7a 44 61 74 61 62 61 73 65 3b 0a 20  rc].zDatabase;. 
f620: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
f630: 69 6e 67 28 70 7a 2c 20 70 44 61 74 61 62 61 73  ing(pz, pDatabas
f640: 65 2d 3e 7a 2c 20 70 44 61 74 61 62 61 73 65 2d  e->z, pDatabase-
f650: 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  >n, 0);.    if( 
f660: 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  *pz==0 ){.      
f670: 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c  sqliteSrcListDel
f680: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
f690: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
f6a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
f6b0: 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b  iteDequote(*pz);
f6c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69  .    }.  }.  pLi
f6d0: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
f6e0: 63 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b  c].iCursor = -1;
f6f0: 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b  .  pList->nSrc++
f700: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
f710: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67  ;.}../*.** Assig
f720: 6e 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c  n cursors to all
f730: 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63   tables in a Src
f740: 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  List.*/.void sql
f750: 69 74 65 53 72 63 4c 69 73 74 41 73 73 69 67 6e  iteSrcListAssign
f760: 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70  Cursors(Parse *p
f770: 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
f780: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
f790: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
f7a0: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
f7b0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
f7c0: 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 30 20 29  a[i].iCursor<0 )
f7d0: 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61  {.      pList->a
f7e0: 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 70 50  [i].iCursor = pP
f7f0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
f800: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
f810: 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74 6f   Add an alias to
f820: 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74 69   the last identi
f830: 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76 65  fier on the give
f840: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69 73  n identifier lis
f850: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
f860: 65 53 72 63 4c 69 73 74 41 64 64 41 6c 69 61 73  eSrcListAddAlias
f870: 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c  (SrcList *pList,
f880: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
f890: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26 26 20  .  if( pList && 
f8a0: 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b  pList->nSrc>0 ){
f8b0: 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69  .    int i = pLi
f8c0: 73 74 2d 3e 6e 53 72 63 20 2d 20 31 3b 0a 20 20  st->nSrc - 1;.  
f8d0: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
f8e0: 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ng(&pList->a[i].
f8f0: 7a 41 6c 69 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e  zAlias, pToken->
f900: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29  z, pToken->n, 0)
f910: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 71 75  ;.    sqliteDequ
f920: 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ote(pList->a[i].
f930: 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a  zAlias);.  }.}..
f940: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
f950: 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  IdList..*/.void 
f960: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65  sqliteIdListDele
f970: 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  te(IdList *pList
f980: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
f990: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
f9a0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
f9b0: 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
f9c0: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  +){.    sqliteFr
f9d0: 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ee(pList->a[i].z
f9e0: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Name);.  }.  sql
f9f0: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
fa00: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
fa10: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
fa20: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
fa30: 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68  x in pList of th
fa40: 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d  e identifier nam
fa50: 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20  ed zId.  Return 
fa60: 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75  -1.** if not fou
fa70: 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
fa80: 65 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c  eIdListIndex(IdL
fa90: 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73  ist *pList, cons
faa0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
fab0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
fac0: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
fad0: 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   -1;.  for(i=0; 
fae0: 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
faf0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
fb00: 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  teStrICmp(pList-
fb10: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  >a[i].zName, zNa
fb20: 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  me)==0 ) return 
fb30: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
fb40: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  -1;.}../*.** Del
fb50: 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72  ete an entire Sr
fb60: 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20  cList including 
fb70: 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63  all its substruc
fb80: 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
fb90: 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74  liteSrcListDelet
fba0: 65 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  e(SrcList *pList
fbb0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
fbc0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
fbd0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
fbe0: 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  i<pList->nSrc; i
fbf0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ++){.    sqliteF
fc00: 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
fc10: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
fc20: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
fc30: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
fc40: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
fc50: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73  ist->a[i].zAlias
fc60: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
fc70: 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 26 26 20 70  ->a[i].pTab && p
fc80: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d  List->a[i].pTab-
fc90: 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a  >isTransient ){.
fca0: 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65        sqliteDele
fcb0: 74 65 54 61 62 6c 65 28 30 2c 20 70 4c 69 73 74  teTable(0, pList
fcc0: 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 3b 0a 20 20  ->a[i].pTab);.  
fcd0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 53 65    }.    sqliteSe
fce0: 6c 65 63 74 44 65 6c 65 74 65 28 70 4c 69 73 74  lectDelete(pList
fcf0: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b  ->a[i].pSelect);
fd00: 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44  .    sqliteExprD
fd10: 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  elete(pList->a[i
fd20: 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ].pOn);.    sqli
fd30: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  teIdListDelete(p
fd40: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 55 73 69 6e  List->a[i].pUsin
fd50: 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
fd60: 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
fd70: 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72  /*.** Begin a tr
fd80: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
fd90: 64 20 73 71 6c 69 74 65 42 65 67 69 6e 54 72 61  d sqliteBeginTra
fda0: 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
fdb0: 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72  pParse, int onEr
fdc0: 72 6f 72 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a  ror){.  sqlite *
fdd0: 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  db;..  if( pPars
fde0: 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
fdf0: 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
fe00: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
fe10: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
fe20: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
fe30: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
fe40: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
fe50: 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43   if( sqliteAuthC
fe60: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
fe70: 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
fe80: 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20   "BEGIN", 0, 0) 
fe90: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
fea0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
feb0: 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20  TE_InTrans ){.  
fec0: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
fed0: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
fee0: 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
fef0: 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20 74 72  tion within a tr
ff00: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
ff10: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
ff20: 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
ff30: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
ff40: 20 30 2c 20 30 29 3b 0a 20 20 64 62 2d 3e 66 6c   0, 0);.  db->fl
ff50: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
ff60: 54 72 61 6e 73 3b 0a 20 20 64 62 2d 3e 6f 6e 45  Trans;.  db->onE
ff70: 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  rror = onError;.
ff80: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
ff90: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
ffa0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d  .void sqliteComm
ffb0: 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  itTransaction(Pa
ffc0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
ffd0: 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69  sqlite *db;..  i
ffe0: 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
fff0: 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
10000 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d  =0 || db->aDb[0]
10010 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
10020 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
10030 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  nErr || sqlite_m
10040 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
10050 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
10060 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61  iteAuthCheck(pPa
10070 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
10080 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54  SACTION, "COMMIT
10090 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  ", 0, 0) ) retur
100a0 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  n;.  if( (db->fl
100b0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
100c0 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  rans)==0 ){.    
100d0 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
100e0 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63  Parse, "cannot c
100f0 6f 6d 6d 69 74 20 2d 20 6e 6f 20 74 72 61 6e 73  ommit - no trans
10100 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
10110 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
10120 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20    }.  db->flags 
10130 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61  &= ~SQLITE_InTra
10140 6e 73 3b 0a 20 20 73 71 6c 69 74 65 45 6e 64 57  ns;.  sqliteEndW
10150 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
10160 61 72 73 65 29 3b 0a 20 20 64 62 2d 3e 6f 6e 45  arse);.  db->onE
10170 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c  rror = OE_Defaul
10180 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  t;.}../*.** Roll
10190 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69  back a transacti
101a0 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
101b0 65 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63  eRollbackTransac
101c0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
101d0 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  se){.  sqlite *d
101e0 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
101f0 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c   if( pParse==0 |
10200 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62  | (db=pParse->db
10210 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b  )==0 || db->aDb[
10220 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
10230 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
10240 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
10250 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
10260 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
10270 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70  qliteAuthCheck(p
10280 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
10290 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c  ANSACTION, "ROLL
102a0 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72  BACK", 0, 0) ) r
102b0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 64 62  eturn;.  if( (db
102c0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
102d0 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a  _InTrans)==0 ){.
102e0 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
102f0 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
10300 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 2d 20 6e 6f  ot rollback - no
10310 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
10320 61 63 74 69 76 65 22 29 3b 0a 20 20 20 20 72 65  active");.    re
10330 74 75 72 6e 3b 20 0a 20 20 7d 0a 20 20 76 20 3d  turn; .  }.  v =
10340 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
10350 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
10360 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
10370 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 6c  eAddOp(v, OP_Rol
10380 6c 62 61 63 6b 2c 20 30 2c 20 30 29 3b 0a 20 20  lback, 0, 0);.  
10390 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  }.  db->flags &=
103a0 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73   ~SQLITE_InTrans
103b0 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20  ;.  db->onError 
103c0 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a  = OE_Default;.}.
103d0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
103e0 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 77  VDBE code that w
103f0 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20 73  ill verify the s
10400 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 66 6f 72  chema cookie for
10410 20 61 6c 6c 0a 2a 2a 20 6e 61 6d 65 64 20 64 61   all.** named da
10420 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2f  tabase files..*/
10430 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 64 65  .void sqliteCode
10440 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72  VerifySchema(Par
10450 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
10460 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a  iDb){.  sqlite *
10470 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
10480 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
10490 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
104a0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  e);.  assert( iD
104b0 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
104c0 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
104d0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
104e0 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 44  t!=0 );.  if( iD
104f0 62 21 3d 31 20 26 26 20 21 44 62 48 61 73 50 72  b!=1 && !DbHasPr
10500 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20  operty(db, iDb, 
10510 44 42 5f 43 6f 6f 6b 69 65 29 20 29 7b 0a 20 20  DB_Cookie) ){.  
10520 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
10530 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f  p(v, OP_VerifyCo
10540 6f 6b 69 65 2c 20 69 44 62 2c 20 64 62 2d 3e 61  okie, iDb, db->a
10550 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63  Db[iDb].schema_c
10560 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 44 62 53 65  ookie);.    DbSe
10570 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44  tProperty(db, iD
10580 62 2c 20 44 42 5f 43 6f 6f 6b 69 65 29 3b 0a 20  b, DB_Cookie);. 
10590 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
105a0 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
105b0 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72  hat prepares for
105c0 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74   doing an operat
105d0 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  ion that.** migh
105e0 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74  t change the dat
105f0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abase..**.** Thi
10600 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
10610 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
10620 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  on if we are not
10630 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a   already within.
10640 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
10650 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72  .  If we are alr
10660 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72  eady within a tr
10670 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
10680 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20  a checkpoint.** 
10690 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65  is set if the se
106a0 74 43 68 65 63 6b 70 6f 69 6e 74 20 70 61 72 61  tCheckpoint para
106b0 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20  meter is true.  
106c0 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f  A checkpoint sho
106d0 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f  uld.** be set fo
106e0 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61  r operations tha
106f0 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75  t might fail (du
10700 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e  e to a constrain
10710 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68  t) part of.** th
10720 65 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e  e way through an
10730 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65  d which will nee
10740 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77  d to undo some w
10750 72 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61  rites without ha
10760 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62  ving to.** rollb
10770 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72  ack the whole tr
10780 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20  ansaction.  For 
10790 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65  operations where
107a0 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73   all constraints
107b0 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b  .** can be check
107c0 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68  ed before any ch
107d0 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
107e0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  o the database, 
107f0 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e  it is never.** n
10800 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f  ecessary to undo
10810 20 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65   a write and the
10820 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
10830 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a  ld not be set..*
10840 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61  *.** Only databa
10850 73 65 20 69 44 62 20 61 6e 64 20 74 68 65 20 74  se iDb and the t
10860 65 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65  emp database are
10870 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 62   made writable b
10880 79 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20  y this call..** 
10890 49 66 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20  If iDb==0, then 
108a0 74 68 65 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d  the main and tem
108b0 70 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  p databases are 
108c0 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20  made writable.  
108d0 20 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68   If.** iDb==1 th
108e0 65 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70  en only the temp
108f0 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 61 64   database is mad
10900 65 20 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20  e writable.  If 
10910 69 44 62 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a  iDb>1 then the.*
10920 2a 20 73 70 65 63 69 66 69 65 64 20 61 75 78 69  * specified auxi
10930 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 61  liary database a
10940 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  nd the temp data
10950 62 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72  base are made wr
10960 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  itable..*/.void 
10970 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65  sqliteBeginWrite
10980 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
10990 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74  *pParse, int set
109a0 43 68 65 63 6b 70 6f 69 6e 74 2c 20 69 6e 74 20  Checkpoint, int 
109b0 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  iDb){.  Vdbe *v;
109c0 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
109d0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
109e0 28 20 44 62 48 61 73 50 72 6f 70 65 72 74 79 28  ( DbHasProperty(
109f0 64 62 2c 20 69 44 62 2c 20 44 42 5f 4c 6f 63 6b  db, iDb, DB_Lock
10a00 65 64 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ed) ) return;.  
10a10 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
10a20 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
10a30 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
10a40 20 20 69 66 28 20 21 64 62 2d 3e 61 44 62 5b 69    if( !db->aDb[i
10a50 44 62 5d 2e 69 6e 54 72 61 6e 73 20 29 7b 0a 20  Db].inTrans ){. 
10a60 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
10a70 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  Op(v, OP_Transac
10a80 74 69 6f 6e 2c 20 69 44 62 2c 20 30 29 3b 0a 20  tion, iDb, 0);. 
10a90 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79     DbSetProperty
10aa0 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 4c 6f 63  (db, iDb, DB_Loc
10ab0 6b 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ked);.    sqlite
10ac0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
10ad0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
10ae0 20 20 20 69 66 28 20 69 44 62 21 3d 31 20 29 7b     if( iDb!=1 ){
10af0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 65 67  .      sqliteBeg
10b00 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
10b10 28 70 50 61 72 73 65 2c 20 73 65 74 43 68 65 63  (pParse, setChec
10b20 6b 70 6f 69 6e 74 2c 20 31 29 3b 0a 20 20 20 20  kpoint, 1);.    
10b30 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65  }.  }else if( se
10b40 74 43 68 65 63 6b 70 6f 69 6e 74 20 29 7b 0a 20  tCheckpoint ){. 
10b50 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
10b60 4f 70 28 76 2c 20 4f 50 5f 43 68 65 63 6b 70 6f  Op(v, OP_Checkpo
10b70 69 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20  int, iDb, 0);.  
10b80 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28    DbSetProperty(
10b90 64 62 2c 20 69 44 62 2c 20 44 42 5f 4c 6f 63 6b  db, iDb, DB_Lock
10ba0 65 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ed);.  }.}../*.*
10bb0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
10bc0 74 68 61 74 20 63 6f 6e 63 6c 75 64 65 73 20 61  that concludes a
10bd0 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
10be0 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e 67 65   may have change
10bf0 64 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  d.** the databas
10c00 65 2e 20 20 49 66 20 61 20 73 74 61 74 65 6d 65  e.  If a stateme
10c10 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
10c20 61 73 20 73 74 61 72 74 65 64 2c 20 74 68 65 6e  as started, then
10c30 20 65 6d 69 74 0a 2a 2a 20 61 6e 20 4f 50 5f 43   emit.** an OP_C
10c40 6f 6d 6d 69 74 20 74 68 61 74 20 77 69 6c 6c 20  ommit that will 
10c50 63 61 75 73 65 20 74 68 65 20 63 68 61 6e 67 65  cause the change
10c60 73 20 74 6f 20 62 65 20 63 6f 6d 6d 69 74 74 65  s to be committe
10c70 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
10c80 20 4e 6f 74 65 20 74 68 61 74 20 63 68 65 63 6b   Note that check
10c90 70 6f 69 6e 74 73 20 61 72 65 20 61 75 74 6f 6d  points are autom
10ca0 61 74 69 63 61 6c 6c 79 20 63 6f 6d 6d 69 74 74  atically committ
10cb0 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
10cc0 0a 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  .** a statement.
10cd0 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
10ce0 20 74 68 65 72 65 20 63 61 6e 20 62 65 20 6d 75   there can be mu
10cf0 6c 74 69 70 6c 65 20 63 61 6c 6c 73 20 74 6f 20  ltiple calls to 
10d00 0a 2a 2a 20 73 71 6c 69 74 65 42 65 67 69 6e 57  .** sqliteBeginW
10d10 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 29 20  riteOperation() 
10d20 62 75 74 20 74 68 65 72 65 20 73 68 6f 75 6c 64  but there should
10d30 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c   only be a singl
10d40 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c  e.** call to sql
10d50 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61  iteEndWriteOpera
10d60 74 69 6f 6e 28 29 20 61 74 20 74 68 65 20 63 6f  tion() at the co
10d70 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20  nclusion of the 
10d80 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
10d90 69 64 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74  id sqliteEndWrit
10da0 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65  eOperation(Parse
10db0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
10dc0 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a  e *v;.  sqlite *
10dd0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
10de0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 74  .  if( pParse->t
10df0 72 69 67 53 74 61 63 6b 20 29 20 72 65 74 75 72  rigStack ) retur
10e00 6e 3b 20 2f 2a 20 69 66 20 74 68 69 73 20 69 73  n; /* if this is
10e10 20 69 6e 20 61 20 74 72 69 67 67 65 72 20 2a 2f   in a trigger */
10e20 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
10e30 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
10e40 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
10e50 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  n;.  if( db->fla
10e60 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72  gs & SQLITE_InTr
10e70 61 6e 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20  ans ){.    /* A 
10e80 42 45 47 49 4e 20 68 61 73 20 65 78 65 63 75 74  BEGIN has execut
10e90 65 64 2e 20 20 44 6f 20 6e 6f 74 20 63 6f 6d 6d  ed.  Do not comm
10ea0 69 74 20 75 6e 74 69 6c 20 77 65 20 73 65 65 20  it until we see 
10eb0 61 6e 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20  an explicit.    
10ec0 2a 2a 20 43 4f 4d 4d 49 54 20 73 74 61 74 65 6d  ** COMMIT statem
10ed0 65 6e 74 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  ent. */.  }else{
10ee0 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
10ef0 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69  ddOp(v, OP_Commi
10f00 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  t, 0, 0);.  }.}.