/ Hex Artifact Content
Login

Artifact 05ee0d69c7379ef3e20121b2197bfb8865003371:


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 35 20 32 30 30 34 2f 30 32 2f 31 31 20 30  165 2004/02/11 0
0300: 39 3a 34 36 3a 33 31 20 64 72 68 20 45 78 70 20  9:46:31 drh Exp 
0310: 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  $.*/.#include "s
0320: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
0330: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a  lude <ctype.h>..
0340: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0350: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
0360: 6e 20 61 20 6e 65 77 20 53 51 4c 20 73 74 61 74  n a new SQL stat
0370: 65 6d 65 6e 74 20 69 73 20 62 65 67 69 6e 6e 69  ement is beginni
0380: 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61 72 73  ng to.** be pars
0390: 65 64 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  ed.  Check to se
03a0: 65 20 69 66 20 74 68 65 20 73 63 68 65 6d 61 20  e if the schema 
03b0: 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
03c0: 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20   needs.** to be 
03d0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 53 51  read from the SQ
03e0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 61 6e 64 20  LITE_MASTER and 
03f0: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 4d 41 53 54  SQLITE_TEMP_MAST
0400: 45 52 20 74 61 62 6c 65 73 2e 0a 2a 2a 20 49 66  ER tables..** If
0410: 20 69 74 20 64 6f 65 73 2c 20 74 68 65 6e 20 72   it does, then r
0420: 65 61 64 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ead it..*/.void 
0430: 73 71 6c 69 74 65 42 65 67 69 6e 50 61 72 73 65  sqliteBeginParse
0440: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
0450: 69 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29  int explainFlag)
0460: 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  {.  sqlite *db =
0470: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
0480: 6e 74 20 69 3b 0a 20 20 70 50 61 72 73 65 2d 3e  nt i;.  pParse->
0490: 65 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61 69  explain = explai
04a0: 6e 46 6c 61 67 3b 0a 20 20 69 66 28 28 64 62 2d  nFlag;.  if((db-
04b0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
04c0: 49 6e 69 74 69 61 6c 69 7a 65 64 29 3d 3d 30 20  Initialized)==0 
04d0: 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  && pParse->initF
04e0: 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  lag==0 ){.    in
04f0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 49 6e 69  t rc = sqliteIni
0500: 74 28 64 62 2c 20 26 70 50 61 72 73 65 2d 3e 7a  t(db, &pParse->z
0510: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28  ErrMsg);.    if(
0520: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
0530: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
0540: 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 70  rc = rc;.      p
0550: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
0560: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
0570: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
0580: 2b 2b 29 7b 0a 20 20 20 20 44 62 43 6c 65 61 72  ++){.    DbClear
0590: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20  Property(db, i, 
05a0: 44 42 5f 4c 6f 63 6b 65 64 29 3b 0a 20 20 20 20  DB_Locked);.    
05b0: 69 66 28 20 21 64 62 2d 3e 61 44 62 5b 69 5d 2e  if( !db->aDb[i].
05c0: 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20  inTrans ){.     
05d0: 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79   DbClearProperty
05e0: 28 64 62 2c 20 69 2c 20 44 42 5f 43 6f 6f 6b 69  (db, i, DB_Cooki
05f0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
0600: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30  pParse->nVar = 0
0610: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
0620: 69 73 20 61 20 66 61 6b 65 20 63 61 6c 6c 62 61  is a fake callba
0630: 63 6b 20 70 72 6f 63 65 64 75 72 65 20 75 73 65  ck procedure use
0640: 64 20 77 68 65 6e 20 73 71 6c 69 74 65 5f 65 78  d when sqlite_ex
0650: 65 63 28 29 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b  ec() is.** invok
0660: 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63  ed with a NULL c
0670: 61 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 65 72 2e  allback pointer.
0680: 20 20 49 66 20 77 65 20 70 61 73 73 20 61 20 4e    If we pass a N
0690: 55 4c 4c 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  ULL callback.** 
06a0: 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 73 71 6c  pointer into sql
06b0: 69 74 65 56 64 62 65 45 78 65 63 28 29 20 69 74  iteVdbeExec() it
06c0: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 74 20   will return at 
06d0: 65 76 65 72 79 20 4f 50 5f 43 61 6c 6c 62 61 63  every OP_Callbac
06e0: 6b 2c 0a 2a 2a 20 77 68 69 63 68 20 77 65 20 64  k,.** which we d
06f0: 6f 20 6e 6f 74 20 77 61 6e 74 20 69 74 20 74 6f  o not want it to
0700: 20 64 6f 2e 20 20 53 6f 20 77 65 20 73 75 62 73   do.  So we subs
0710: 74 69 74 75 74 65 20 61 20 70 6f 69 6e 74 65 72  titute a pointer
0720: 20 74 6f 20 74 68 69 73 0a 2a 2a 20 70 72 6f 63   to this.** proc
0730: 65 64 75 72 65 20 69 6e 20 70 6c 61 63 65 20 6f  edure in place o
0740: 66 20 74 68 65 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  f the NULL..*/.s
0750: 74 61 74 69 63 20 69 6e 74 20 66 61 6b 65 43 61  tatic int fakeCa
0760: 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 4e 6f 74  llback(void *Not
0770: 55 73 65 64 2c 20 69 6e 74 20 6e 2c 20 63 68 61  Used, int n, cha
0780: 72 20 2a 2a 61 7a 31 2c 20 63 68 61 72 20 2a 2a  r **az1, char **
0790: 61 7a 32 29 7b 0a 20 20 72 65 74 75 72 6e 20 30  az2){.  return 0
07a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
07b0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
07c0: 64 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65  d after a single
07d0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68   SQL statement h
07e0: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65  as been.** parse
07f0: 64 20 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f  d and we want to
0800: 20 65 78 65 63 75 74 65 20 74 68 65 20 56 44 42   execute the VDB
0810: 45 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d  E code to implem
0820: 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20 73 74 61  ent .** that sta
0830: 74 65 6d 65 6e 74 2e 20 20 50 72 69 6f 72 20 61  tement.  Prior a
0840: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 73  ction routines s
0850: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
0860: 64 79 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65  dy.** constructe
0870: 64 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 64  d VDBE code to d
0880: 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68  o the work of th
0890: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
08a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
08b0: 20 6a 75 73 74 20 68 61 73 20 74 6f 20 65 78 65   just has to exe
08c0: 63 75 74 65 20 74 68 65 20 56 44 42 45 20 63 6f  cute the VDBE co
08d0: 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  de..**.** Note t
08e0: 68 61 74 20 69 66 20 61 6e 20 65 72 72 6f 72 20  hat if an error 
08f0: 6f 63 63 75 72 72 65 64 2c 20 69 74 20 6d 69 67  occurred, it mig
0900: 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
0910: 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63  hat.** no VDBE c
0920: 6f 64 65 20 77 61 73 20 67 65 6e 65 72 61 74 65  ode was generate
0930: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
0940: 65 45 78 65 63 28 50 61 72 73 65 20 2a 70 50 61  eExec(Parse *pPa
0950: 72 73 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  rse){.  int rc =
0960: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
0970: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
0980: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
0990: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
09a0: 3b 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62  ;.  int (*xCallb
09b0: 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  ack)(void*,int,c
09c0: 68 61 72 2a 2a 2c 63 68 61 72 2a 2a 29 3b 0a 0a  har**,char**);..
09d0: 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c    if( sqlite_mal
09e0: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
09f0: 75 72 6e 3b 0a 20 20 78 43 61 6c 6c 62 61 63 6b  urn;.  xCallback
0a00: 20 3d 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c   = pParse->xCall
0a10: 62 61 63 6b 3b 0a 20 20 69 66 28 20 78 43 61 6c  back;.  if( xCal
0a20: 6c 62 61 63 6b 3d 3d 30 20 26 26 20 70 50 61 72  lback==0 && pPar
0a30: 73 65 2d 3e 75 73 65 43 61 6c 6c 62 61 63 6b 20  se->useCallback 
0a40: 29 20 78 43 61 6c 6c 62 61 63 6b 20 3d 20 66 61  ) xCallback = fa
0a50: 6b 65 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 69 66  keCallback;.  if
0a60: 28 20 76 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  ( v && pParse->n
0a70: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49  Err==0 ){.    FI
0a80: 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d  LE *trace = (db-
0a90: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
0aa0: 56 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20  VdbeTrace)!=0 ? 
0ab0: 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20  stdout : 0;.    
0ac0: 73 71 6c 69 74 65 56 64 62 65 54 72 61 63 65 28  sqliteVdbeTrace(
0ad0: 76 2c 20 74 72 61 63 65 29 3b 0a 20 20 20 20 73  v, trace);.    s
0ae0: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 52 65 61  qliteVdbeMakeRea
0af0: 64 79 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56  dy(v, pParse->nV
0b00: 61 72 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20 70  ar, xCallback, p
0b10: 50 61 72 73 65 2d 3e 70 41 72 67 2c 0a 20 20 20  Parse->pArg,.   
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b30: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 65 78 70       pParse->exp
0b40: 6c 61 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 70  lain);.    if( p
0b50: 50 61 72 73 65 2d 3e 75 73 65 43 61 6c 6c 62 61  Parse->useCallba
0b60: 63 6b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ck ){.      if( 
0b70: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
0b80: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
0b90: 73 71 6c 69 74 65 56 64 62 65 4c 69 73 74 28 76  sqliteVdbeList(v
0ba0: 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  );.        db->n
0bb0: 65 78 74 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d  ext_cookie = db-
0bc0: 3e 61 44 62 5b 30 5d 2e 73 63 68 65 6d 61 5f 63  >aDb[0].schema_c
0bd0: 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 7d 65 6c  ookie;.      }el
0be0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
0bf0: 74 65 56 64 62 65 45 78 65 63 28 76 29 3b 0a 20  teVdbeExec(v);. 
0c00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
0c10: 3d 20 73 71 6c 69 74 65 56 64 62 65 46 69 6e 61  = sqliteVdbeFina
0c20: 6c 69 7a 65 28 76 2c 20 26 70 50 61 72 73 65 2d  lize(v, &pParse-
0c30: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  >zErrMsg);.     
0c40: 20 69 66 28 20 72 63 20 29 20 70 50 61 72 73 65   if( rc ) pParse
0c50: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
0c60: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
0c70: 30 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  0;.      pParse-
0c80: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
0c90: 69 66 28 20 72 63 20 29 20 70 50 61 72 73 65 2d  if( rc ) pParse-
0ca0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 65 6c  >nErr++;.    }el
0cb0: 73 65 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65  se{.      pParse
0cc0: 2d 3e 72 63 20 3d 20 70 50 61 72 73 65 2d 3e 6e  ->rc = pParse->n
0cd0: 45 72 72 20 3f 20 53 51 4c 49 54 45 5f 45 52 52  Err ? SQLITE_ERR
0ce0: 4f 52 20 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  OR : SQLITE_DONE
0cf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
0d00: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
0d10: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
0d20: 20 70 50 61 72 73 65 2d 3e 75 73 65 43 61 6c 6c   pParse->useCall
0d30: 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 70  back==0 ){.    p
0d40: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
0d50: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
0d60: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30  pParse->nTab = 0
0d70: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
0d80: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
0d90: 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72  nSet = 0;.  pPar
0da0: 73 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a 20 20  se->nAgg = 0;.  
0db0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30  pParse->nVar = 0
0dc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
0dd0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
0de0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
0df0: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
0e00: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
0e10: 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  se table given t
0e20: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68  he name.** of th
0e30: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
0e40: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
0e50: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
0e60: 73 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  se.** containing
0e70: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
0e80: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
0e90: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  found..**.** If 
0ea0: 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20  zDatabase is 0, 
0eb0: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72  all databases ar
0ec0: 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
0ed0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  he.** table and 
0ee0: 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
0ef0: 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75  ng table is retu
0f00: 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b  rned.  (No check
0f10: 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69  ing.** for dupli
0f20: 63 61 74 65 20 74 61 62 6c 65 20 6e 61 6d 65 73  cate table names
0f30: 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20   is done.)  The 
0f40: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a  search order is.
0f50: 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74  ** TEMP first, t
0f60: 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61  hen MAIN, then a
0f70: 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ny auxiliary dat
0f80: 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20  abases added.** 
0f90: 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48  using the ATTACH
0fa0: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
0fb0: 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 4c  See also sqliteL
0fc0: 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f  ocateTable()..*/
0fd0: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 46 69  .Table *sqliteFi
0fe0: 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 20 2a  ndTable(sqlite *
0ff0: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
1000: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
1010: 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20  r *zDatabase){. 
1020: 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20   Table *p = 0;. 
1030: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1040: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
1050: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20  +){.    int j = 
1060: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
1070: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d     /* Search TEM
1080: 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f  P before MAIN */
1090: 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61  .    if( zDataba
10a0: 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 53  se!=0 && sqliteS
10b0: 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65  trICmp(zDatabase
10c0: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61  , db->aDb[j].zNa
10d0: 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  me) ) continue;.
10e0: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 48 61      p = sqliteHa
10f0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b  shFind(&db->aDb[
1100: 6a 5d 2e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d  j].tblHash, zNam
1110: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
1120: 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  +1);.    if( p )
1130: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
1140: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1150: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
1160: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
1170: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a  that describes .
1180: 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ** a particular 
1190: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 67  database table g
11a0: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  iven the name.**
11b0: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
11c0: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
11d0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
11e0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 74  database.** cont
11f0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
1200: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
1210: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 20  f not found..** 
1220: 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 20 65 72  Also leave an er
1230: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
1240: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
1250: 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
1260: 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
1270: 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71  s routine and sq
1280: 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 29 0a  liteFindTable().
1290: 2a 2a 20 69 73 20 74 68 61 74 20 74 68 69 73 20  ** is that this 
12a0: 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61  routine leaves a
12b0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
12c0: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
12d0: 73 67 0a 2a 2a 20 77 68 65 72 65 20 73 71 6c 69  sg.** where sqli
12e0: 74 65 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f  teFindTable() do
12f0: 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65  es not..*/.Table
1300: 20 2a 73 71 6c 69 74 65 4c 6f 63 61 74 65 54 61   *sqliteLocateTa
1310: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
1320: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1330: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
1340: 20 2a 7a 44 62 61 73 65 29 7b 0a 20 20 54 61 62   *zDbase){.  Tab
1350: 6c 65 20 2a 70 3b 0a 0a 20 20 70 20 3d 20 73 71  le *p;..  p = sq
1360: 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50  liteFindTable(pP
1370: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  arse->db, zName,
1380: 20 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20   zDbase);.  if( 
1390: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  p==0 ){.    if( 
13a0: 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  zDbase ){.      
13b0: 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
13c0: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
13d0: 74 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20 7a  table: %s.%s", z
13e0: 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  Dbase, zName);. 
13f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
1400: 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50 61  iteFindTable(pPa
1410: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  rse->db, zName, 
1420: 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  0)!=0 ){.      s
1430: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
1440: 61 72 73 65 2c 20 22 74 61 62 6c 65 20 5c 22 25  arse, "table \"%
1450: 73 5c 22 20 69 73 20 6e 6f 74 20 69 6e 20 64 61  s\" is not in da
1460: 74 61 62 61 73 65 20 5c 22 25 73 5c 22 22 2c 0a  tabase \"%s\"",.
1470: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20           zName, 
1480: 7a 44 62 61 73 65 29 3b 0a 20 20 20 20 7d 65 6c  zDbase);.    }el
1490: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
14a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
14b0: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
14c0: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
14d0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
14e0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63   p;.}../*.** Loc
14f0: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
1500: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
1510: 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61   describes .** a
1520: 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65   particular inde
1530: 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  x given the name
1540: 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a   of that index.*
1550: 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f  * and the name o
1560: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
1570: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
1580: 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72   index..** Retur
1590: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
15a0: 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44  und..**.** If zD
15b0: 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c  atabase is 0, al
15c0: 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  l databases are 
15d0: 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65  searched for the
15e0: 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68  .** table and th
15f0: 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
1600: 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e   index is return
1610: 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e  ed.  (No checkin
1620: 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61  g.** for duplica
1630: 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69  te index names i
1640: 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65  s done.)  The se
1650: 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a  arch order is.**
1660: 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65   TEMP first, the
1670: 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79  n MAIN, then any
1680: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
1690: 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73  ases added.** us
16a0: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
16b0: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78  ommand..*/.Index
16c0: 20 2a 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65   *sqliteFindInde
16d0: 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f  x(sqlite *db, co
16e0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
16f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1700: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
1710: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  0;.  int i;.  fo
1720: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
1730: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
1740: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
1750: 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20  : i;  /* Search 
1760: 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e  TEMP before MAIN
1770: 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 20   */.    if( zDb 
1780: 26 26 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  && sqliteStrICmp
1790: 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d  (zDb, db->aDb[j]
17a0: 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e  .zName) ) contin
17b0: 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  ue;.    p = sqli
17c0: 74 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  teHashFind(&db->
17d0: 61 44 62 5b 6a 5d 2e 69 64 78 48 61 73 68 2c 20  aDb[j].idxHash, 
17e0: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
17f0: 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28  ame)+1);.    if(
1800: 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   p ) break;.  }.
1810: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
1820: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
1830: 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d  given index from
1840: 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20   the index hash 
1850: 74 61 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a  table, and free.
1860: 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74  ** its memory st
1870: 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  ructures..**.** 
1880: 54 68 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d  The index is rem
1890: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  oved from the da
18a0: 74 61 62 61 73 65 20 68 61 73 68 20 74 61 62 6c  tabase hash tabl
18b0: 65 73 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20  es but.** it is 
18c0: 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  not unlinked fro
18d0: 6d 20 74 68 65 20 54 61 62 6c 65 20 74 68 61 74  m the Table that
18e0: 20 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20   it indexes..** 
18f0: 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74  Unlinking from t
1900: 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65  he Table must be
1910: 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c   done by the cal
1920: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
1930: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
1940: 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28  liteDeleteIndex(
1950: 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65  sqlite *db, Inde
1960: 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a  x *p){.  Index *
1970: 70 4f 6c 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  pOld;..  assert(
1980: 20 64 62 21 3d 30 20 26 26 20 70 2d 3e 7a 4e 61   db!=0 && p->zNa
1990: 6d 65 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20  me!=0 );.  pOld 
19a0: 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65  = sqliteHashInse
19b0: 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69  rt(&db->aDb[p->i
19c0: 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 2d 3e  Db].idxHash, p->
19d0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65   strlen(p->zName
1a00: 29 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  )+1, 0);.  if( p
1a10: 4f 6c 64 21 3d 30 20 26 26 20 70 4f 6c 64 21 3d  Old!=0 && pOld!=
1a20: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 48  p ){.    sqliteH
1a30: 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61  ashInsert(&db->a
1a40: 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61  Db[p->iDb].idxHa
1a50: 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c  sh, pOld->zName,
1a60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a70: 20 20 20 20 20 20 73 74 72 6c 65 6e 28 70 4f 6c        strlen(pOl
1a80: 64 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c  d->zName)+1, pOl
1a90: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
1aa0: 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Free(p);.}../*.*
1ab0: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
1ac0: 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74  en index from it
1ad0: 73 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65  s table, then re
1ae0: 6d 6f 76 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65  move.** the inde
1af0: 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  x from the index
1b00: 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20   hash table and 
1b10: 66 72 65 65 20 69 74 73 20 6d 65 6d 6f 72 79 0a  free its memory.
1b20: 2a 2a 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  ** structures..*
1b30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 55 6e 6c  /.void sqliteUnl
1b40: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65  inkAndDeleteInde
1b50: 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e  x(sqlite *db, In
1b60: 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20  dex *pIndex){.  
1b70: 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  if( pIndex->pTab
1b80: 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64  le->pIndex==pInd
1b90: 65 78 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78  ex ){.    pIndex
1ba0: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
1bb0: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
1bc0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49  ;.  }else{.    I
1bd0: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 66 6f 72  ndex *p;.    for
1be0: 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  (p=pIndex->pTabl
1bf0: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20  e->pIndex; p && 
1c00: 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78  p->pNext!=pIndex
1c10: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a  ; p=p->pNext){}.
1c20: 20 20 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e      if( p && p->
1c30: 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b  pNext==pIndex ){
1c40: 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20  .      p->pNext 
1c50: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
1c60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1c70: 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64  iteDeleteIndex(d
1c80: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f  b, pIndex);.}../
1c90: 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73  *.** Erase all s
1ca0: 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f  chema informatio
1cb0: 6e 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65  n from the in-me
1cc0: 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73  mory hash tables
1cd0: 20 6f 66 0a 2a 2a 20 64 61 74 61 62 61 73 65 20   of.** database 
1ce0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69  connection.  Thi
1cf0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1d00: 6c 65 64 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d  led to reclaim m
1d10: 65 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20  emory.** before 
1d20: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  the connection c
1d30: 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61 6c  loses.  It is al
1d40: 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67  so called during
1d50: 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69   a rollback.** i
1d60: 66 20 74 68 65 72 65 20 77 65 72 65 20 73 63 68  f there were sch
1d70: 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72 69  ema changes duri
1d80: 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ng the transacti
1d90: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  on..**.** If iDb
1da0: 3c 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20 74  <=0 then reset t
1db0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
1dc0: 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c  ma tables for al
1dd0: 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  l database.** fi
1de0: 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20  les.  If iDb>=2 
1df0: 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69  then reset the i
1e00: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66  nternal schema f
1e10: 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73  or only the.** s
1e20: 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63  ingle file indic
1e30: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
1e40: 6c 69 74 65 52 65 73 65 74 49 6e 74 65 72 6e 61  liteResetInterna
1e50: 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65 20 2a  lSchema(sqlite *
1e60: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
1e70: 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b  HashElem *pElem;
1e80: 0a 20 20 48 61 73 68 20 74 65 6d 70 31 3b 0a 20  .  Hash temp1;. 
1e90: 20 48 61 73 68 20 74 65 6d 70 32 3b 0a 20 20 69   Hash temp2;.  i
1ea0: 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73 73 65  nt i, j;..  asse
1eb0: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
1ec0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 64  b<db->nDb );.  d
1ed0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
1ee0: 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 3b  ITE_Initialized;
1ef0: 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c  .  for(i=iDb; i<
1f00: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
1f10: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
1f20: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 74 65  ->aDb[i];.    te
1f30: 6d 70 31 20 3d 20 70 44 62 2d 3e 74 62 6c 48 61  mp1 = pDb->tblHa
1f40: 73 68 3b 0a 20 20 20 20 74 65 6d 70 32 20 3d 20  sh;.    temp2 = 
1f50: 70 44 62 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20  pDb->trigHash;. 
1f60: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 69     sqliteHashIni
1f70: 74 28 26 70 44 62 2d 3e 74 72 69 67 48 61 73 68  t(&pDb->trigHash
1f80: 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54  , SQLITE_HASH_ST
1f90: 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73 71  RING, 0);.    sq
1fa0: 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28 26 70  liteHashClear(&p
1fb0: 44 62 2d 3e 61 46 4b 65 79 29 3b 0a 20 20 20 20  Db->aFKey);.    
1fc0: 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28  sqliteHashClear(
1fd0: 26 70 44 62 2d 3e 69 64 78 48 61 73 68 29 3b 0a  &pDb->idxHash);.
1fe0: 20 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71      for(pElem=sq
1ff0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74  liteHashFirst(&t
2000: 65 6d 70 32 29 3b 20 70 45 6c 65 6d 3b 20 70 45  emp2); pElem; pE
2010: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
2020: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
2030: 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
2040: 67 65 72 20 3d 20 73 71 6c 69 74 65 48 61 73 68  ger = sqliteHash
2050: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
2060: 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54     sqliteDeleteT
2070: 72 69 67 67 65 72 28 70 54 72 69 67 67 65 72 29  rigger(pTrigger)
2080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2090: 74 65 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d  teHashClear(&tem
20a0: 70 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 48  p2);.    sqliteH
20b0: 61 73 68 49 6e 69 74 28 26 70 44 62 2d 3e 74 62  ashInit(&pDb->tb
20c0: 6c 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41  lHash, SQLITE_HA
20d0: 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20  SH_STRING, 0);. 
20e0: 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c     for(pElem=sql
20f0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74 65  iteHashFirst(&te
2100: 6d 70 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  mp1); pElem; pEl
2110: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
2120: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20  t(pElem)){.     
2130: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
2140: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
2150: 6c 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lem);.      sqli
2160: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  teDeleteTable(db
2170: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  , pTab);.    }. 
2180: 20 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65     sqliteHashCle
2190: 61 72 28 26 74 65 6d 70 31 29 3b 0a 20 20 20 20  ar(&temp1);.    
21a0: 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
21b0: 64 62 2c 20 69 2c 20 44 42 5f 53 63 68 65 6d 61  db, i, DB_Schema
21c0: 4c 6f 61 64 65 64 29 3b 0a 20 20 20 20 69 66 28  Loaded);.    if(
21d0: 20 69 44 62 3e 30 20 29 20 72 65 74 75 72 6e 3b   iDb>0 ) return;
21e0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69  .  }.  assert( i
21f0: 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66  Db==0 );.  db->f
2200: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
2210: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a  InternChanges;..
2220: 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d    /* If one or m
2230: 6f 72 65 20 6f 66 20 74 68 65 20 61 75 78 69 6c  ore of the auxil
2240: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  iary database fi
2250: 6c 65 73 20 68 61 73 20 62 65 65 6e 20 63 6c 6f  les has been clo
2260: 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  sed,.  ** then r
2270: 65 6d 6f 76 65 20 74 68 65 6e 20 66 72 6f 6d 20  emove then from 
2280: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
2290: 74 61 62 61 73 65 20 6c 69 73 74 2e 20 20 57 65  tabase list.  We
22a0: 20 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a 20 6f   take the.  ** o
22b0: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 64 6f  pportunity to do
22c0: 20 74 68 69 73 20 68 65 72 65 20 73 69 6e 63 65   this here since
22d0: 20 77 65 20 68 61 76 65 20 6a 75 73 74 20 64 65   we have just de
22e0: 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20 74 68 65  leted all of the
22f0: 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 68 61 73  .  ** schema has
2300: 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65  h tables and the
2310: 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20 68 61  refore do not ha
2320: 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 63  ve to make any c
2330: 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 61  hanges.  ** to a
2340: 6e 79 20 6f 66 20 74 68 6f 73 65 20 74 61 62 6c  ny of those tabl
2350: 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
2360: 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  =j=2; i<db->nDb;
2370: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64   i++){.    if( d
2380: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30  b->aDb[i].pBt==0
2390: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
23a0: 46 72 65 65 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  Free(db->aDb[i].
23b0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 64 62  zName);.      db
23c0: 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  ->aDb[i].zName =
23d0: 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   0;.      contin
23e0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
23f0: 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64  ( j<i ){.      d
2400: 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e  b->aDb[j] = db->
2410: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  aDb[i];.    }.  
2420: 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d    j++;.  }.  mem
2430: 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c  set(&db->aDb[j],
2440: 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a   0, (db->nDb-j)*
2450: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a  sizeof(db->aDb[j
2460: 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d  ]));.  db->nDb =
2470: 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44   j;.  if( db->nD
2480: 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21  b<=2 && db->aDb!
2490: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
24a0: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d  {.    memcpy(db-
24b0: 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e  >aDbStatic, db->
24c0: 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62  aDb, 2*sizeof(db
24d0: 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20  ->aDb[0]));.    
24e0: 73 71 6c 69 74 65 46 72 65 65 28 64 62 2d 3e 61  sqliteFree(db->a
24f0: 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Db);.    db->aDb
2500: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
2510: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
2520: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2530: 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61  alled whenever a
2540: 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
2550: 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
2560: 0a 2a 2a 20 73 63 68 65 6d 61 20 63 68 61 6e 67  .** schema chang
2570: 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72  es during the tr
2580: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
2590: 77 65 20 68 61 76 65 20 74 6f 20 72 65 73 65 74  we have to reset
25a0: 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c   the.** internal
25b0: 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64   hash tables and
25c0: 20 72 65 6c 6f 61 64 20 74 68 65 6d 20 66 72 6f   reload them fro
25d0: 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  m disk..*/.void 
25e0: 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 49 6e  sqliteRollbackIn
25f0: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
2600: 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 69 66 28  lite *db){.  if(
2610: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
2620: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
2630: 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 52  s ){.    sqliteR
2640: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
2650: 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d  ma(db, 0);.  }.}
2660: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2670: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
2680: 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63  hen a commit occ
2690: 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
26a0: 69 74 65 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  iteCommitInterna
26b0: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20  lChanges(sqlite 
26c0: 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 61 44 62 5b  *db){.  db->aDb[
26d0: 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  0].schema_cookie
26e0: 20 3d 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b   = db->next_cook
26f0: 69 65 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  ie;.  db->flags 
2700: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
2710: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
2720: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65  ** Remove the me
2730: 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74  mory data struct
2740: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
2750: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a  with the given.*
2760: 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61  * Table.  No cha
2770: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
2780: 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f   disk by this ro
2790: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  utine..**.** Thi
27a0: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64  s routine just d
27b0: 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20  eletes the data 
27c0: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64  structure.  It d
27d0: 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a  oes not unlink.*
27e0: 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61  * the table data
27f0: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
2800: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
2810: 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d   Nor does it rem
2820: 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b  ove.** foreign k
2830: 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  eys from the sql
2840: 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74  ite.aFKey hash t
2850: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
2860: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
2870: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
2880: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
2890: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
28a0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
28b0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
28c0: 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73  *.** Indices ass
28d0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
28e0: 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e   table are unlin
28f0: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62  ked from the "db
2900: 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74  ".** data struct
2910: 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e  ure if db!=NULL.
2920: 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69    If db==NULL, i
2930: 6e 64 69 63 65 73 20 61 74 74 61 63 68 65 64 20  ndices attached 
2940: 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  to.** the table 
2950: 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74  are deleted, but
2960: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
2970: 68 65 79 20 68 61 76 65 20 61 6c 72 65 61 64 79  hey have already
2980: 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65   been.** unlinke
2990: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
29a0: 65 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  eDeleteTable(sql
29b0: 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  ite *db, Table *
29c0: 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  pTable){.  int i
29d0: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ;.  Index *pInde
29e0: 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65  x, *pNext;.  FKe
29f0: 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74  y *pFKey, *pNext
2a00: 46 4b 65 79 3b 0a 0a 20 20 69 66 28 20 70 54 61  FKey;..  if( pTa
2a10: 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ble==0 ) return;
2a20: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  ..  /* Delete al
2a30: 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  l indices associ
2a40: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74  ated with this t
2a50: 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  able.  */.  for(
2a60: 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d  pIndex = pTable-
2a70: 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
2a80: 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a   pIndex=pNext){.
2a90: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64      pNext = pInd
2aa0: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61  ex->pNext;.    a
2ab0: 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 69  ssert( pIndex->i
2ac0: 44 62 3d 3d 70 54 61 62 6c 65 2d 3e 69 44 62 20  Db==pTable->iDb 
2ad0: 7c 7c 20 28 70 54 61 62 6c 65 2d 3e 69 44 62 3d  || (pTable->iDb=
2ae0: 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e 69 44  =0 && pIndex->iD
2af0: 62 3d 3d 31 29 20 29 3b 0a 20 20 20 20 73 71 6c  b==1) );.    sql
2b00: 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64  iteDeleteIndex(d
2b10: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
2b20: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c  .  /* Delete all
2b30: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73   foreign keys as
2b40: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
2b50: 69 73 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6b  is table.  The k
2b60: 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  eys.  ** should 
2b70: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
2b80: 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  n unlinked from 
2b90: 74 68 65 20 64 62 2d 3e 61 46 4b 65 79 20 68 61  the db->aFKey ha
2ba0: 73 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a 20  sh table .  */. 
2bb0: 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61 62 6c   for(pFKey=pTabl
2bc0: 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b  e->pFKey; pFKey;
2bd0: 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79   pFKey=pNextFKey
2be0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b 65 79  ){.    pNextFKey
2bf0: 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46   = pFKey->pNextF
2c00: 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rom;.    assert(
2c10: 20 70 54 61 62 6c 65 2d 3e 69 44 62 3c 64 62 2d   pTable->iDb<db-
2c20: 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65  >nDb );.    asse
2c30: 72 74 28 20 73 71 6c 69 74 65 48 61 73 68 46 69  rt( sqliteHashFi
2c40: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70 54 61 62  nd(&db->aDb[pTab
2c50: 6c 65 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 0a  le->iDb].aFKey,.
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c70: 20 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79             pFKey
2c80: 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46  ->zTo, strlen(pF
2c90: 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46  Key->zTo)+1)!=pF
2ca0: 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  Key );.    sqlit
2cb0: 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20  eFree(pFKey);.  
2cc0: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  }..  /* Delete t
2cd0: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
2ce0: 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a  re itself..  */.
2cf0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
2d00: 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  ble->nCol; i++){
2d10: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2d20: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e  pTable->aCol[i].
2d30: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
2d40: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
2d50: 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20  Col[i].zDflt);. 
2d60: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54     sqliteFree(pT
2d70: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54  able->aCol[i].zT
2d80: 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ype);.  }.  sqli
2d90: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a  teFree(pTable->z
2da0: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  Name);.  sqliteF
2db0: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
2dc0: 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63  );.  sqliteSelec
2dd0: 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e  tDelete(pTable->
2de0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
2df0: 74 65 46 72 65 65 28 70 54 61 62 6c 65 29 3b 0a  teFree(pTable);.
2e00: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
2e10: 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20  the given table 
2e20: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
2e30: 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c  bles and the del
2e40: 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  ete the.** table
2e50: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
2e60: 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20  all its indices 
2e70: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
2e80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2e90: 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64   sqliteUnlinkAnd
2ea0: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
2eb0: 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  te *db, Table *p
2ec0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64  ){.  Table *pOld
2ed0: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a  ;.  FKey *pF1, *
2ee0: 70 46 32 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  pF2;.  int i = p
2ef0: 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65 72 74 28  ->iDb;.  assert(
2f00: 20 64 62 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64   db!=0 );.  pOld
2f10: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73   = sqliteHashIns
2f20: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e  ert(&db->aDb[i].
2f30: 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  tblHash, p->zNam
2f40: 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61  e, strlen(p->zNa
2f50: 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73  me)+1, 0);.  ass
2f60: 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20  ert( pOld==0 || 
2f70: 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 6f 72  pOld==p );.  for
2f80: 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70  (pF1=p->pFKey; p
2f90: 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65  F1; pF1=pF1->pNe
2fa0: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 69 6e 74  xtFrom){.    int
2fb0: 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46   nTo = strlen(pF
2fc0: 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20  1->zTo) + 1;.   
2fd0: 20 70 46 32 20 3d 20 73 71 6c 69 74 65 48 61 73   pF2 = sqliteHas
2fe0: 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 69  hFind(&db->aDb[i
2ff0: 5d 2e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54  ].aFKey, pF1->zT
3000: 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 69 66 28  o, nTo);.    if(
3010: 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20   pF2==pF1 ){.   
3020: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73     sqliteHashIns
3030: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e  ert(&db->aDb[i].
3040: 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c  aFKey, pF1->zTo,
3050: 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78 74   nTo, pF1->pNext
3060: 54 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  To);.    }else{.
3070: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 32        while( pF2
3080: 20 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f   && pF2->pNextTo
3090: 21 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32  !=pF1 ){ pF2=pF2
30a0: 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20  ->pNextTo; }.   
30b0: 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a 20 20     if( pF2 ){.  
30c0: 20 20 20 20 20 20 70 46 32 2d 3e 70 4e 65 78 74        pF2->pNext
30d0: 54 6f 20 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54  To = pF1->pNextT
30e0: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
30f0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 6c  .  }.  sqliteDel
3100: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b  eteTable(db, p);
3110: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
3120: 75 63 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  uct the name of 
3130: 61 20 75 73 65 72 20 74 61 62 6c 65 20 6f 72 20  a user table or 
3140: 69 6e 64 65 78 20 66 72 6f 6d 20 61 20 74 6f 6b  index from a tok
3150: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  en..**.** Space 
3160: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65  to hold the name
3170: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
3180: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
3190: 20 61 6e 64 20 6d 75 73 74 0a 2a 2a 20 62 65 20   and must.** be 
31a0: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
31b0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
31c0: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 54 61  /.char *sqliteTa
31d0: 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  bleNameFromToken
31e0: 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a  (Token *pName){.
31f0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
3200: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e  sqliteStrNDup(pN
3210: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
3220: 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f  );.  sqliteDequo
3230: 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  te(zName);.  ret
3240: 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  urn zName;.}../*
3250: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
3260: 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 61 70  e to open the ap
3270: 70 72 6f 70 72 69 61 74 65 20 6d 61 73 74 65 72  propriate master
3280: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 74 61 62   table.  The tab
3290: 6c 65 0a 2a 2a 20 6f 70 65 6e 65 64 20 77 69 6c  le.** opened wil
32a0: 6c 20 62 65 20 53 51 4c 49 54 45 5f 4d 41 53 54  l be SQLITE_MAST
32b0: 45 52 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  ER for persisten
32c0: 74 20 74 61 62 6c 65 73 20 61 6e 64 20 0a 2a 2a  t tables and .**
32d0: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 4d 41 53   SQLITE_TEMP_MAS
32e0: 54 45 52 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  TER for temporar
32f0: 79 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 74  y tables.  The t
3300: 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 0a 2a  able is opened.*
3310: 2a 20 6f 6e 20 63 75 72 73 6f 72 20 30 2e 0a 2a  * on cursor 0..*
3320: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 4f 70 65  /.void sqliteOpe
3330: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 56 64 62  nMasterTable(Vdb
3340: 65 20 2a 76 2c 20 69 6e 74 20 69 73 54 65 6d 70  e *v, int isTemp
3350: 29 7b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  ){.  sqliteVdbeA
3360: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
3370: 65 72 2c 20 69 73 54 65 6d 70 2c 20 30 29 3b 0a  er, isTemp, 0);.
3380: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3390: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  p(v, OP_OpenWrit
33a0: 65 2c 20 30 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a  e, 0, 2);.}../*.
33b0: 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75  ** Begin constru
33c0: 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  cting a new tabl
33d0: 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
33e0: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
33f0: 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  s is.** the firs
3400: 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74  t of several act
3410: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ion routines tha
3420: 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20  t get called in 
3430: 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61  response.** to a
3440: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
3450: 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72  atement.  In par
3460: 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f  ticular, this ro
3470: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a  utine is called.
3480: 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20  ** after seeing 
3490: 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20  tokens "CREATE" 
34a0: 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20  and "TABLE" and 
34b0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  the table name. 
34c0: 20 54 68 65 0a 2a 2a 20 70 53 74 61 72 74 20 74   The.** pStart t
34d0: 6f 6b 65 6e 20 69 73 20 74 68 65 20 43 52 45 41  oken is the CREA
34e0: 54 45 20 61 6e 64 20 70 4e 61 6d 65 20 69 73 20  TE and pName is 
34f0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  the table name. 
3500: 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66   The isTemp.** f
3510: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
3520: 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  he table should 
3530: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
3540: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
3550: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74  ase.** file inst
3560: 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61  ead of in the ma
3570: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
3580: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
3590: 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20  lly the case.** 
35a0: 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20  when the "TEMP" 
35b0: 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b  or "TEMPORARY" k
35c0: 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e  eyword occurs in
35d0: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41   between.** CREA
35e0: 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a  TE and TABLE..**
35f0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c  .** The new tabl
3600: 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74  e record is init
3610: 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20  ialized and put 
3620: 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  in pParse->pNewT
3630: 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65  able..** As more
3640: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
3650: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
3660: 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69  s parsed, additi
3670: 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72  onal action.** r
3680: 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20  outines will be 
3690: 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f  called to add mo
36a0: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  re information t
36b0: 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a  o this record..*
36c0: 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
36d0: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
36e0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
36f0: 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 29  sqliteEndTable()
3700: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
3710: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74  alled to complet
3720: 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69  e the constructi
3730: 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  on of the new ta
3740: 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76  ble record..*/.v
3750: 6f 69 64 20 73 71 6c 69 74 65 53 74 61 72 74 54  oid sqliteStartT
3760: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
3770: 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
3780: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
3790: 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
37a0: 20 2f 2a 20 54 68 65 20 22 43 52 45 41 54 45 22   /* The "CREATE"
37b0: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65   token */.  Toke
37c0: 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f 2a 20  n *pName,    /* 
37d0: 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72  Name of table or
37e0: 20 76 69 65 77 20 74 6f 20 63 72 65 61 74 65 20   view to create 
37f0: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c  */.  int isTemp,
3800: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3810: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20   this is a TEMP 
3820: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
3830: 73 56 69 65 77 20 20 20 20 20 20 20 2f 2a 20 54  sView       /* T
3840: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
3850: 20 56 49 45 57 20 2a 2f 0a 29 7b 0a 20 20 54 61   VIEW */.){.  Ta
3860: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49  ble *pTable;.  I
3870: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 63 68  ndex *pIdx;.  ch
3880: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c  ar *zName;.  sql
3890: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
38a0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ->db;.  Vdbe *v;
38b0: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 70  .  int iDb;..  p
38c0: 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b  Parse->sFirstTok
38d0: 65 6e 20 3d 20 2a 70 53 74 61 72 74 3b 0a 20 20  en = *pStart;.  
38e0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61  zName = sqliteTa
38f0: 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  bleNameFromToken
3900: 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  (pName);.  if( z
3910: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
3920: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
3930: 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20  iDb==1 ) isTemp 
3940: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
3950: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
3960: 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28  ZATION.  assert(
3970: 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69   (isTemp & 1)==i
3980: 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20  sTemp );.  {.   
3990: 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63   int code;.    c
39a0: 68 61 72 20 2a 7a 44 62 20 3d 20 69 73 54 65 6d  har *zDb = isTem
39b0: 70 20 3f 20 22 74 65 6d 70 22 20 3a 20 22 6d 61  p ? "temp" : "ma
39c0: 69 6e 22 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  in";.    if( sql
39d0: 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61  iteAuthCheck(pPa
39e0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
39f0: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
3a00: 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62  (isTemp), 0, zDb
3a10: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
3a20: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
3a30: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
3a40: 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
3a50: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
3a60: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
3a70: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
3a80: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  EATE_TEMP_VIEW;.
3a90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3aa0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
3ab0: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a  TE_CREATE_VIEW;.
3ac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
3ad0: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54  e{.      if( isT
3ae0: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63  emp ){.        c
3af0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
3b00: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ATE_TEMP_TABLE;.
3b10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3b20: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
3b30: 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b  TE_CREATE_TABLE;
3b40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3b50: 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74     if( sqliteAut
3b60: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
3b70: 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a  ode, zName, 0, z
3b80: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Db) ){.      sql
3b90: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
3ba0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
3bb0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
3bc0: 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 72  ..  /* Before tr
3bd0: 79 69 6e 67 20 74 6f 20 63 72 65 61 74 65 20 61  ying to create a
3be0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
3bf0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
3c00: 42 74 72 65 65 20 66 6f 72 0a 20 20 2a 2a 20 68  Btree for.  ** h
3c10: 6f 6c 64 69 6e 67 20 74 65 6d 70 6f 72 61 72 79  olding temporary
3c20: 20 74 61 62 6c 65 73 20 69 73 20 6f 70 65 6e 2e   tables is open.
3c30: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65  .  */.  if( isTe
3c40: 6d 70 20 26 26 20 64 62 2d 3e 61 44 62 5b 31 5d  mp && db->aDb[1]
3c50: 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72  .pBt==0 && !pPar
3c60: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
3c70: 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
3c80: 74 65 42 74 72 65 65 46 61 63 74 6f 72 79 28 64  teBtreeFactory(d
3c90: 62 2c 20 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47  b, 0, 0, MAX_PAG
3ca0: 45 53 2c 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e  ES, &db->aDb[1].
3cb0: 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pBt);.    if( rc
3cc0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
3cd0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
3ce0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
3cf0: 72 72 4d 73 67 2c 20 22 75 6e 61 62 6c 65 20 74  rrMsg, "unable t
3d00: 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
3d10: 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20  ry database ".  
3d20: 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20        "file for 
3d30: 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72  storing temporar
3d40: 79 20 74 61 62 6c 65 73 22 2c 20 28 63 68 61 72  y tables", (char
3d50: 2a 29 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  *)0);.      pPar
3d60: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
3d70: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
3d80: 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67      if( db->flag
3d90: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
3da0: 6e 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ns ){.      rc =
3db0: 20 73 71 6c 69 74 65 42 74 72 65 65 42 65 67 69   sqliteBtreeBegi
3dc0: 6e 54 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31  nTrans(db->aDb[1
3dd0: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  ].pBt);.      if
3de0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
3df0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3e00: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
3e10: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75  rse->zErrMsg, "u
3e20: 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61 20 77  nable to get a w
3e30: 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20  rite lock on ". 
3e40: 20 20 20 20 20 20 20 20 20 22 74 68 65 20 74 65           "the te
3e50: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
3e60: 20 66 69 6c 65 22 2c 20 30 29 3b 0a 20 20 20 20   file", 0);.    
3e70: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
3e80: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ++;.        retu
3e90: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
3ea0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
3eb0: 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61   sure the new ta
3ec0: 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f  ble name does no
3ed0: 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61  t collide with a
3ee0: 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
3ef0: 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e  index or table n
3f00: 61 6d 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65  ame.  Issue an e
3f10: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20  rror message if 
3f20: 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2a 0a 20 20  it does..  **.  
3f30: 2a 2a 20 49 66 20 77 65 20 61 72 65 20 72 65 2d  ** If we are re-
3f40: 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
3f50: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
3f60: 62 65 63 61 75 73 65 20 6f 66 20 61 20 73 63 68  because of a sch
3f70: 65 6d 61 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20  ema.  ** change 
3f80: 61 6e 64 20 61 20 6e 65 77 20 70 65 72 6d 61 6e  and a new perman
3f90: 65 6e 74 20 74 61 62 6c 65 20 69 73 20 66 6f 75  ent table is fou
3fa0: 6e 64 20 77 68 6f 73 65 20 6e 61 6d 65 20 63 6f  nd whose name co
3fb0: 6c 6c 69 64 65 73 20 77 69 74 68 0a 20 20 2a 2a  llides with.  **
3fc0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 65 6d   an existing tem
3fd0: 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
3fe0: 61 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72  at is not an err
3ff0: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 6c  or..  */.  pTabl
4000: 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61  e = sqliteFindTa
4010: 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  ble(db, zName, 0
4020: 29 3b 0a 20 20 69 44 62 20 3d 20 69 73 54 65 6d  );.  iDb = isTem
4030: 70 20 3f 20 31 20 3a 20 70 50 61 72 73 65 2d 3e  p ? 1 : pParse->
4040: 69 44 62 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  iDb;.  if( pTabl
4050: 65 21 3d 30 20 26 26 20 28 70 54 61 62 6c 65 2d  e!=0 && (pTable-
4060: 3e 69 44 62 3d 3d 69 44 62 20 7c 7c 20 21 70 50  >iDb==iDb || !pP
4070: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 29 20  arse->initFlag) 
4080: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
4090: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
40a0: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65  >zErrMsg, "table
40b0: 20 22 2c 20 30 2c 20 70 4e 61 6d 65 2d 3e 7a 2c   ", 0, pName->z,
40c0: 20 70 4e 61 6d 65 2d 3e 6e 2c 0a 20 20 20 20 20   pName->n,.     
40d0: 20 20 20 22 20 61 6c 72 65 61 64 79 20 65 78 69     " already exi
40e0: 73 74 73 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20  sts", 0, 0);.   
40f0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
4100: 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  e);.    pParse->
4110: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
4120: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  rn;.  }.  if( (p
4130: 49 64 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  Idx = sqliteFind
4140: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
4150: 20 30 29 29 21 3d 30 20 26 26 0a 20 20 20 20 20   0))!=0 &&.     
4160: 20 20 20 20 20 28 70 49 64 78 2d 3e 69 44 62 3d       (pIdx->iDb=
4170: 3d 30 20 7c 7c 20 21 70 50 61 72 73 65 2d 3e 69  =0 || !pParse->i
4180: 6e 69 74 46 6c 61 67 29 20 29 7b 0a 20 20 20 20  nitFlag) ){.    
4190: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
41a0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
41b0: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
41c0: 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d  ady an index nam
41d0: 65 64 20 22 2c 20 0a 20 20 20 20 20 20 20 7a 4e  ed ", .       zN
41e0: 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
41f0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
4200: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 72 73  Name);.    pPars
4210: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
4220: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61  eturn;.  }.  pTa
4230: 62 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ble = sqliteMall
4240: 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  oc( sizeof(Table
4250: 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  ) );.  if( pTabl
4260: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  e==0 ){.    sqli
4270: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
4280: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
4290: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d   pTable->zName =
42a0: 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65   zName;.  pTable
42b0: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54  ->nCol = 0;.  pT
42c0: 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  able->aCol = 0;.
42d0: 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20    pTable->iPKey 
42e0: 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  = -1;.  pTable->
42f0: 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54  pIndex = 0;.  pT
4300: 61 62 6c 65 2d 3e 69 44 62 20 3d 20 69 44 62 3b  able->iDb = iDb;
4310: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70  .  if( pParse->p
4320: 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c 69 74  NewTable ) sqlit
4330: 65 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  eDeleteTable(db,
4340: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
4350: 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70  le);.  pParse->p
4360: 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  NewTable = pTabl
4370: 65 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67  e;..  /* Begin g
4380: 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f  enerating the co
4390: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73  de that will ins
43a0: 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65  ert the table re
43b0: 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74  cord into.  ** t
43c0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
43d0: 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e   table.  Note in
43e0: 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74   particular that
43f0: 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61   we must go ahea
4400: 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63  d.  ** and alloc
4410: 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ate the record n
4420: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
4430: 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20  ble entry now.  
4440: 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20  Before any.  ** 
4450: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
4460: 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61  NIQUE keywords a
4470: 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73  re parsed.  Thos
4480: 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20  e keywords will 
4490: 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63  cause.  ** indic
44a0: 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  es to be created
44b0: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72   and the table r
44c0: 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20  ecord must come 
44d0: 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a  before the .  **
44e0: 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65   indices.  Hence
44f0: 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  , the record num
4500: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
4510: 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  e must be alloca
4520: 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20  ted.  ** now..  
4530: 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  */.  if( !pParse
4540: 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26 20 28 76  ->initFlag && (v
4550: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
4560: 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a  (pParse))!=0 ){.
4570: 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57      sqliteBeginW
4580: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
4590: 61 72 73 65 2c 20 30 2c 20 69 73 54 65 6d 70 29  arse, 0, isTemp)
45a0: 3b 0a 20 20 20 20 69 66 28 20 21 69 73 54 65 6d  ;.    if( !isTem
45b0: 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
45c0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
45d0: 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 66 69  _Integer, db->fi
45e0: 6c 65 5f 66 6f 72 6d 61 74 2c 20 30 29 3b 0a 20  le_format, 0);. 
45f0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
4600: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
4610: 6f 6b 69 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  okie, 0, 1);.   
4620: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 4f 70 65   }.    sqliteOpe
4630: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20  nMasterTable(v, 
4640: 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c  isTemp);.    sql
4650: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4660: 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20  OP_NewRecno, 0, 
4670: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
4680: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
4690: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  p, 0, 0);.    sq
46a0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
46b0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
46c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
46d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
46e0: 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20  IntKey, 0, 0);. 
46f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
4700: 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20  a new column to 
4710: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
4720: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
4730: 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ucted..**.** The
4740: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
4750: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20  is routine once 
4760: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
4770: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69  declaration.** i
4780: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
4790: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c   statement.  sql
47a0: 69 74 65 53 74 61 72 74 54 61 62 6c 65 28 29 20  iteStartTable() 
47b0: 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66  gets called.** f
47c0: 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e  irst to get thin
47d0: 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20  gs going.  Then 
47e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
47f0: 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a  called for each.
4800: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f  ** column..*/.vo
4810: 69 64 20 73 71 6c 69 74 65 41 64 64 43 6f 6c 75  id sqliteAddColu
4820: 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mn(Parse *pParse
4830: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
4840: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
4850: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 20  nt i;.  char *z 
4860: 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  = 0;.  Column *p
4870: 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  Col;.  if( (p = 
4880: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4890: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
48a0: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
48b0: 6e 67 28 26 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c  ng(&z, pName->z,
48c0: 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20   pName->n, 0);. 
48d0: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
48e0: 72 6e 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75  rn;.  sqliteDequ
48f0: 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69 3d  ote(z);.  for(i=
4900: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
4910: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
4920: 74 65 53 74 72 49 43 6d 70 28 7a 2c 20 70 2d 3e  teStrICmp(z, p->
4930: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  aCol[i].zName)==
4940: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
4950: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
4960: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 64 75  se->zErrMsg, "du
4970: 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e  plicate column n
4980: 61 6d 65 3a 20 22 2c 20 7a 2c 20 28 63 68 61 72  ame: ", z, (char
4990: 2a 29 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  *)0);.      pPar
49a0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
49b0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
49c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
49d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28     }.  }.  if( (
49e0: 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d  p->nCol & 0x7)==
49f0: 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  0 ){.    Column 
4a00: 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20  *aNew;.    aNew 
4a10: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
4a20: 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43   p->aCol, (p->nC
4a30: 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e  ol+8)*sizeof(p->
4a40: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69  aCol[0]));.    i
4a50: 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( aNew==0 ) ret
4a60: 75 72 6e 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c  urn;.    p->aCol
4a70: 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = aNew;.  }.  p
4a80: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70  Col = &p->aCol[p
4a90: 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65  ->nCol];.  memse
4aa0: 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(pCol, 0, sizeo
4ab0: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
4ac0: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
4ad0: 7a 3b 0a 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f  z;.  pCol->sortO
4ae0: 72 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f  rder = SQLITE_SO
4af0: 5f 4e 55 4d 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b  _NUM;.  p->nCol+
4b00: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  +;.}../*.** This
4b10: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
4b20: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
4b30: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
4b40: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
4b50: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
4b60: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20  E statement.  A 
4b70: 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74  "NOT NULL" const
4b80: 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65  raint has.** bee
4b90: 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75  n seen on a colu
4ba0: 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  mn.  This routin
4bb0: 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75  e sets the notNu
4bc0: 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68  ll flag on.** th
4bd0: 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  e column current
4be0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
4bf0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
4c00: 71 6c 69 74 65 41 64 64 4e 6f 74 4e 75 6c 6c 28  qliteAddNotNull(
4c10: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
4c20: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54  nt onError){.  T
4c30: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
4c40: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
4c50: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
4c60: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
4c70: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
4c80: 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43  if( i>=0 ) p->aC
4c90: 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20  ol[i].notNull = 
4ca0: 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  onError;.}../*.*
4cb0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4cc0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
4cd0: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
4ce0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
4cf0: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
4d00: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
4d10: 74 2e 20 20 54 68 65 20 70 46 69 72 73 74 20 74  t.  The pFirst t
4d20: 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72 73  oken is the firs
4d30: 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68  t.** token in th
4d40: 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f  e sequence of to
4d50: 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63 72 69  kens that descri
4d60: 62 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 74  be the type of t
4d70: 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72  he.** column cur
4d80: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
4d90: 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61  struction.   pLa
4da0: 73 74 20 69 73 20 74 68 65 20 6c 61 73 74 20 74  st is the last t
4db0: 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73  oken.** in the s
4dc0: 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68  equence.  Use th
4dd0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  is information t
4de0: 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74  o construct a st
4df0: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e  ring.** that con
4e00: 74 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61  tains the typena
4e10: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
4e20: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20   and store that 
4e30: 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79  string.** in zTy
4e40: 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c  pe..*/ .void sql
4e50: 69 74 65 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  iteAddColumnType
4e60: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
4e70: 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54  Token *pFirst, T
4e80: 6f 6b 65 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20  oken *pLast){.  
4e90: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
4ea0: 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  i, j;.  int n;. 
4eb0: 20 63 68 61 72 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a   char *z, **pz;.
4ec0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
4ed0: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
4ee0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
4ef0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
4f00: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66   p->nCol-1;.  if
4f10: 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  ( i<0 ) return;.
4f20: 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f    pCol = &p->aCo
4f30: 6c 5b 69 5d 3b 0a 20 20 70 7a 20 3d 20 26 70 43  l[i];.  pz = &pC
4f40: 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 6e 20 3d  ol->zType;.  n =
4f50: 20 70 4c 61 73 74 2d 3e 6e 20 2b 20 41 64 64 72   pLast->n + Addr
4f60: 28 70 4c 61 73 74 2d 3e 7a 29 20 2d 20 41 64 64  (pLast->z) - Add
4f70: 72 28 70 46 69 72 73 74 2d 3e 7a 29 3b 0a 20 20  r(pFirst->z);.  
4f80: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
4f90: 28 70 7a 2c 20 70 46 69 72 73 74 2d 3e 7a 2c 20  (pz, pFirst->z, 
4fa0: 6e 2c 20 30 29 3b 0a 20 20 7a 20 3d 20 2a 70 7a  n, 0);.  z = *pz
4fb0: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
4fc0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a  eturn;.  for(i=j
4fd0: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
4fe0: 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 5b 69 5d      int c = z[i]
4ff0: 3b 0a 20 20 20 20 69 66 28 20 69 73 73 70 61 63  ;.    if( isspac
5000: 65 28 63 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  e(c) ) continue;
5010: 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b  .    z[j++] = c;
5020: 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b  .  }.  z[j] = 0;
5030: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
5040: 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  b->file_format>=
5050: 34 20 29 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73  4 ){.    pCol->s
5060: 6f 72 74 4f 72 64 65 72 20 3d 20 73 71 6c 69 74  ortOrder = sqlit
5070: 65 43 6f 6c 6c 61 74 65 54 79 70 65 28 7a 2c 20  eCollateType(z, 
5080: 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n);.  }else{.   
5090: 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72   pCol->sortOrder
50a0: 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d   = SQLITE_SO_NUM
50b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
50c0: 68 65 20 67 69 76 65 6e 20 74 6f 6b 65 6e 20 69  he given token i
50d0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  s the default va
50e0: 6c 75 65 20 66 6f 72 20 74 68 65 20 6c 61 73 74  lue for the last
50f0: 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f   column added to
5100: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 63 75  .** the table cu
5110: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
5120: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20  nstruction.  If 
5130: 22 6d 69 6e 75 73 46 6c 61 67 22 20 69 73 20 74  "minusFlag" is t
5140: 72 75 65 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73  rue, it.** means
5150: 20 74 68 65 20 76 61 6c 75 65 20 74 6f 6b 65 6e   the value token
5160: 20 77 61 73 20 70 72 65 63 65 64 65 64 20 62 79   was preceded by
5170: 20 61 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a   a minus sign..*
5180: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5190: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
51a0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
51b0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
51c0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
51d0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
51e0: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
51f0: 6c 69 74 65 41 64 64 44 65 66 61 75 6c 74 56 61  liteAddDefaultVa
5200: 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lue(Parse *pPars
5210: 65 2c 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20  e, Token *pVal, 
5220: 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a  int minusFlag){.
5230: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
5240: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a  t i;.  char **pz
5250: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
5260: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
5270: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
5280: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
5290: 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
52a0: 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f  ;.  pz = &p->aCo
52b0: 6c 5b 69 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69 66  l[i].zDflt;.  if
52c0: 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20  ( minusFlag ){. 
52d0: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
52e0: 69 6e 67 28 70 7a 2c 20 22 2d 22 2c 20 31 2c 20  ing(pz, "-", 1, 
52f0: 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e  pVal->z, pVal->n
5300: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
5310: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
5320: 69 6e 67 28 70 7a 2c 20 70 56 61 6c 2d 3e 7a 2c  ing(pz, pVal->z,
5330: 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20   pVal->n, 0);.  
5340: 7d 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74  }.  sqliteDequot
5350: 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e(*pz);.}../*.**
5360: 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50   Designate the P
5370: 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74  RIMARY KEY for t
5380: 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74  he table.  pList
5390: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61   is a list of na
53a0: 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d  mes .** of colum
53b0: 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65  ns that form the
53c0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
53d0: 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c  f pList is NULL,
53e0: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73   then the.** mos
53f0: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
5400: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74   column of the t
5410: 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d  able is the prim
5420: 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41  ary key..**.** A
5430: 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20   table can have 
5440: 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d  at most one prim
5450: 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65  ary key.  If the
5460: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68   table already h
5470: 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20  as.** a primary 
5480: 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73  key (and this is
5490: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d   the second prim
54a0: 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72  ary key) then cr
54b0: 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eate an.** error
54c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
54d0: 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e  RIMARY KEY is on
54e0: 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
54f0: 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20   whose datatype 
5500: 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74  is INTEGER,.** t
5510: 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20  hen we will try 
5520: 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75  to use that colu
5530: 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 20 69 64  mn as the row id
5540: 2e 20 20 28 45 78 63 65 70 74 69 6f 6e 3a 0a 2a  .  (Exception:.*
5550: 2a 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20  * For backwards 
5560: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
5570: 74 68 20 6f 6c 64 65 72 20 64 61 74 61 62 61 73  th older databas
5580: 65 73 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68  es, do not do th
5590: 69 73 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c  is.** if the fil
55a0: 65 20 66 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e  e format version
55b0: 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20   number is less 
55c0: 74 68 61 6e 20 31 2e 29 20 20 53 65 74 20 74 68  than 1.)  Set th
55d0: 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a  e Table.iPKey.**
55e0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61   field of the ta
55f0: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
5600: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65  uction to be the
5610: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
5620: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
5630: 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61   KEY column.  Ta
5640: 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74  ble.iPKey is set
5650: 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20   to -1 if there 
5660: 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52  is.** no INTEGER
5670: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a   PRIMARY KEY..**
5680: 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69  .** If the key i
5690: 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
56a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68   PRIMARY KEY, th
56b0: 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  en create a uniq
56c0: 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20  ue.** index for 
56d0: 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64  the key.  No ind
56e0: 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f  ex is created fo
56f0: 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  r INTEGER PRIMAR
5700: 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20  Y KEYs..*/.void 
5710: 73 71 6c 69 74 65 41 64 64 50 72 69 6d 61 72 79  sqliteAddPrimary
5720: 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  Key(Parse *pPars
5730: 65 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  e, IdList *pList
5740: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
5750: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
5760: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
5770: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65  e;.  char *zType
5780: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
5790: 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20   = -1, i;.  if( 
57a0: 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70  pTab==0 ) goto p
57b0: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
57c0: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61 73  .  if( pTab->has
57d0: 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73  PrimKey ){.    s
57e0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
57f0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
5800: 20 22 74 61 62 6c 65 20 5c 22 22 2c 20 70 54 61   "table \"", pTa
5810: 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  b->zName, .     
5820: 20 20 20 22 5c 22 20 68 61 73 20 6d 6f 72 65 20     "\" has more 
5830: 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79  than one primary
5840: 20 6b 65 79 22 2c 20 28 63 68 61 72 2a 29 30 29   key", (char*)0)
5850: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
5860: 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 70  rr++;.    goto p
5870: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
5880: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73  .  }.  pTab->has
5890: 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69  PrimKey = 1;.  i
58a0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
58b0: 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     iCol = pTab->
58c0: 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54  nCol - 1;.    pT
58d0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69  ab->aCol[iCol].i
58e0: 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20  sPrimKey = 1;.  
58f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
5900: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
5910: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  ; i++){.      fo
5920: 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70  r(iCol=0; iCol<p
5930: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  Tab->nCol; iCol+
5940: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
5950: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c  sqliteStrICmp(pL
5960: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
5970: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
5980: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
5990: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
59a0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62     if( iCol<pTab
59b0: 2d 3e 6e 43 6f 6c 20 29 20 70 54 61 62 2d 3e 61  ->nCol ) pTab->a
59c0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d  Col[iCol].isPrim
59d0: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Key = 1;.    }. 
59e0: 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49     if( pList->nI
59f0: 64 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b  d>1 ) iCol = -1;
5a00: 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e  .  }.  if( iCol>
5a10: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
5a20: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79  >nCol ){.    zTy
5a30: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
5a40: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d  iCol].zType;.  }
5a50: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
5a60: 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  b->file_format>=
5a70: 31 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  1 && .          
5a80: 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74 65   zType && sqlite
5a90: 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22  StrICmp(zType, "
5aa0: 49 4e 54 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a  INTEGER")==0 ){.
5ab0: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
5ac0: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62  = iCol;.    pTab
5ad0: 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72  ->keyConf = onEr
5ae0: 72 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ror;.  }else{.  
5af0: 20 20 73 71 6c 69 74 65 43 72 65 61 74 65 49 6e    sqliteCreateIn
5b00: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
5b10: 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72  , pList, onError
5b20: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69  , 0, 0);.    pLi
5b30: 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69  st = 0;.  }..pri
5b40: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20  mary_key_exit:. 
5b50: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c   sqliteIdListDel
5b60: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65  ete(pList);.  re
5b70: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  turn;.}../*.** R
5b80: 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70  eturn the approp
5b90: 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20  riate collating 
5ba0: 74 79 70 65 20 67 69 76 65 6e 20 61 20 74 79 70  type given a typ
5bb0: 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e name..**.** Th
5bc0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65  e collation type
5bd0: 20 69 73 20 74 65 78 74 20 28 53 51 4c 49 54 45   is text (SQLITE
5be0: 5f 53 4f 5f 54 45 58 54 29 20 69 66 20 74 68 65  _SO_TEXT) if the
5bf0: 20 74 79 70 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f   type.** name co
5c00: 6e 74 61 69 6e 73 20 74 68 65 20 63 68 61 72 61  ntains the chara
5c10: 63 74 65 72 20 73 74 72 65 61 6d 20 22 74 65 78  cter stream "tex
5c20: 74 22 20 6f 72 20 22 62 6c 6f 62 22 20 6f 72 0a  t" or "blob" or.
5c30: 2a 2a 20 22 63 6c 6f 62 22 2e 20 20 41 6e 79 20  ** "clob".  Any 
5c40: 6f 74 68 65 72 20 74 79 70 65 20 6e 61 6d 65 20  other type name 
5c50: 69 73 20 63 6f 6c 6c 61 74 65 64 20 61 73 20 6e  is collated as n
5c60: 75 6d 65 72 69 63 0a 2a 2a 20 28 53 51 4c 49 54  umeric.** (SQLIT
5c70: 45 5f 53 4f 5f 4e 55 4d 29 2e 0a 2a 2f 0a 69 6e  E_SO_NUM)..*/.in
5c80: 74 20 73 71 6c 69 74 65 43 6f 6c 6c 61 74 65 54  t sqliteCollateT
5c90: 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ype(const char *
5ca0: 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70 65  zType, int nType
5cb0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
5cc0: 72 28 69 3d 30 3b 20 69 3c 6e 54 79 70 65 2d 31  r(i=0; i<nType-1
5cd0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77 69 74  ; i++){.    swit
5ce0: 63 68 28 20 7a 54 79 70 65 5b 69 5d 20 29 7b 0a  ch( zType[i] ){.
5cf0: 20 20 20 20 20 20 63 61 73 65 20 27 62 27 3a 0a        case 'b':.
5d00: 20 20 20 20 20 20 63 61 73 65 20 27 42 27 3a 20        case 'B': 
5d10: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  {.        if( i<
5d20: 6e 54 79 70 65 2d 33 20 26 26 20 73 71 6c 69 74  nType-3 && sqlit
5d30: 65 53 74 72 4e 49 43 6d 70 28 26 7a 54 79 70 65  eStrNICmp(&zType
5d40: 5b 69 5d 2c 22 62 6c 6f 62 22 2c 34 29 3d 3d 30  [i],"blob",4)==0
5d50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
5d60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 54  turn SQLITE_SO_T
5d70: 45 58 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  EXT;.        }. 
5d80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5d90: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
5da0: 20 27 63 27 3a 0a 20 20 20 20 20 20 63 61 73 65   'c':.      case
5db0: 20 27 43 27 3a 20 7b 0a 20 20 20 20 20 20 20 20   'C': {.        
5dc0: 69 66 28 20 69 3c 6e 54 79 70 65 2d 33 20 26 26  if( i<nType-3 &&
5dd0: 20 28 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70   (sqliteStrNICmp
5de0: 28 26 7a 54 79 70 65 5b 69 5d 2c 22 63 68 61 72  (&zType[i],"char
5df0: 22 2c 34 29 3d 3d 30 20 7c 7c 0a 20 20 20 20 20  ",4)==0 ||.     
5e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e10: 20 20 20 20 20 20 73 71 6c 69 74 65 53 74 72 4e        sqliteStrN
5e20: 49 43 6d 70 28 26 7a 54 79 70 65 5b 69 5d 2c 22  ICmp(&zType[i],"
5e30: 63 6c 6f 62 22 2c 34 29 3d 3d 30 29 0a 20 20 20  clob",4)==0).   
5e40: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
5e50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5e60: 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 20  SO_TEXT;.       
5e70: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
5e80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5e90: 63 61 73 65 20 27 78 27 3a 0a 20 20 20 20 20 20  case 'x':.      
5ea0: 63 61 73 65 20 27 58 27 3a 20 7b 0a 20 20 20 20  case 'X': {.    
5eb0: 20 20 20 20 69 66 28 20 69 3e 3d 32 20 26 26 20      if( i>=2 && 
5ec0: 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 26  sqliteStrNICmp(&
5ed0: 7a 54 79 70 65 5b 69 2d 32 5d 2c 22 74 65 78 74  zType[i-2],"text
5ee0: 22 2c 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",4)==0 ){.     
5ef0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
5f00: 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20  TE_SO_TEXT;.    
5f10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
5f20: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5f30: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
5f40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5f50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
5f60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53   return SQLITE_S
5f70: 4f 5f 4e 55 4d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  O_NUM;.}../*.** 
5f80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5f90: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
5fa0: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
5fb0: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
5fc0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
5fd0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
5fe0: 20 20 41 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c    A "COLLATE" cl
5ff0: 61 75 73 65 20 68 61 73 0a 2a 2a 20 62 65 65 6e  ause has.** been
6000: 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d   seen on a colum
6010: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
6020: 20 73 65 74 73 20 74 68 65 20 43 6f 6c 75 6d 6e   sets the Column
6030: 2e 73 6f 72 74 4f 72 64 65 72 20 6f 6e 0a 2a 2a  .sortOrder on.**
6040: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72   the column curr
6050: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
6060: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
6070: 64 20 73 71 6c 69 74 65 41 64 64 43 6f 6c 6c 61  d sqliteAddColla
6080: 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  teType(Parse *pP
6090: 61 72 73 65 2c 20 69 6e 74 20 63 6f 6c 6c 54 79  arse, int collTy
60a0: 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  pe){.  Table *p;
60b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
60c0: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
60d0: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
60e0: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
60f0: 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30  ol-1;.  if( i>=0
6100: 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 73 6f   ) p->aCol[i].so
6110: 72 74 4f 72 64 65 72 20 3d 20 63 6f 6c 6c 54 79  rtOrder = collTy
6120: 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  pe;.}../*.** Com
6130: 65 20 75 70 20 77 69 74 68 20 61 20 6e 65 77 20  e up with a new 
6140: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 66 6f 72  random value for
6150: 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
6160: 69 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 0a 2a  ie.  Make sure.*
6170: 2a 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20  * the new value 
6180: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
6190: 6d 20 74 68 65 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a  m the old..**.**
61a0: 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   The schema cook
61b0: 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ie is used to de
61c0: 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65  termine when the
61d0: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a   schema for the.
61e0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  ** database chan
61f0: 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68  ges.  After each
6200: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20   schema change, 
6210: 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  the cookie value
6220: 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68  .** changes.  Wh
6230: 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72  en a process fir
6240: 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68  st reads the sch
6250: 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74  ema it records t
6260: 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54  he.** cookie.  T
6270: 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65  hereafter, whene
6280: 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61  ver it goes to a
6290: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
62a0: 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73  se,.** it checks
62b0: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d   the cookie to m
62c0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68  ake sure the sch
62d0: 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e  ema has not chan
62e0: 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20  ged.** since it 
62f0: 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a  was last read..*
6300: 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69  *.** This plan i
6310: 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  s not completely
6320: 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20   bullet-proof.  
6330: 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  It is possible f
6340: 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  or.** the schema
6350: 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69   to change multi
6360: 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f  ple times and fo
6370: 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  r the cookie to 
6380: 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74  be.** set back t
6390: 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20  o prior value.  
63a0: 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67  But schema chang
63b0: 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e  es are infrequen
63c0: 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f  t.** and the pro
63d0: 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74  bability of hitt
63e0: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f  ing the same coo
63f0: 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c  kie value is onl
6400: 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e  y.** 1 chance in
6410: 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65   2^32.  So we're
6420: 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f   safe enough..*/
6430: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 68 61 6e  .void sqliteChan
6440: 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 20  geCookie(sqlite 
6450: 2a 64 62 2c 20 56 64 62 65 20 2a 76 29 7b 0a 20  *db, Vdbe *v){. 
6460: 20 69 66 28 20 64 62 2d 3e 6e 65 78 74 5f 63 6f   if( db->next_co
6470: 6f 6b 69 65 3d 3d 64 62 2d 3e 61 44 62 5b 30 5d  okie==db->aDb[0]
6480: 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 29  .schema_cookie )
6490: 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  {.    unsigned c
64a0: 68 61 72 20 72 3b 0a 20 20 20 20 73 71 6c 69 74  har r;.    sqlit
64b0: 65 52 61 6e 64 6f 6d 6e 65 73 73 28 31 2c 20 26  eRandomness(1, &
64c0: 72 29 3b 0a 20 20 20 20 64 62 2d 3e 6e 65 78 74  r);.    db->next
64d0: 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 61 44  _cookie = db->aD
64e0: 62 5b 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b  b[0].schema_cook
64f0: 69 65 20 2b 20 72 20 2b 20 31 3b 0a 20 20 20 20  ie + r + 1;.    
6500: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
6510: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
6520: 73 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  s;.    sqliteVdb
6530: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
6540: 65 67 65 72 2c 20 64 62 2d 3e 6e 65 78 74 5f 63  eger, db->next_c
6550: 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 73  ookie, 0);.    s
6560: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6570: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
6580: 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  0, 0);.  }.}../*
6590: 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20  .** Measure the 
65a0: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
65b0: 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f  ters needed to o
65c0: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a  utput the given.
65d0: 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20  ** identifier.  
65e0: 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72  The number retur
65f0: 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79  ned includes any
6600: 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20   quotes used.** 
6610: 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63  but does not inc
6620: 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65  lude the null te
6630: 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  rminator..*/.sta
6640: 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e  tic int identLen
6650: 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  gth(const char *
6660: 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69  z){.  int n;.  i
6670: 6e 74 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 30  nt needQuote = 0
6680: 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b  ;.  for(n=0; *z;
6690: 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20   n++, z++){.    
66a0: 69 66 28 20 2a 7a 3d 3d 27 5c 27 27 20 29 7b 20  if( *z=='\'' ){ 
66b0: 6e 2b 2b 3b 20 6e 65 65 64 51 75 6f 74 65 3d 31  n++; needQuote=1
66c0: 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ; }.  }.  return
66d0: 20 6e 20 2b 20 6e 65 65 64 51 75 6f 74 65 2a 32   n + needQuote*2
66e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
66f0: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f   an identifier o
6700: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
6710: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e  he given string.
6720: 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63    Add.** quote c
6730: 68 61 72 61 63 74 65 72 73 20 61 73 20 6e 65 65  haracters as nee
6740: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ded..*/.static v
6750: 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61  oid identPut(cha
6760: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c  r *z, int *pIdx,
6770: 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 29 7b 0a   char *zIdent){.
6780: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64    int i, j, need
6790: 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49  Quote;.  i = *pI
67a0: 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  dx;.  for(j=0; z
67b0: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
67c0: 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d      if( !isalnum
67d0: 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a  (zIdent[j]) && z
67e0: 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20  Ident[j]!='_' ) 
67f0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65  break;.  }.  nee
6800: 64 51 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74  dQuote =  zIdent
6810: 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69  [j]!=0 || isdigi
6820: 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20  t(zIdent[0]).   
6830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
6840: 7c 20 73 71 6c 69 74 65 4b 65 79 77 6f 72 64 43  | sqliteKeywordC
6850: 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d  ode(zIdent, j)!=
6860: 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65  TK_ID;.  if( nee
6870: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
6880: 3d 20 27 5c 27 27 3b 0a 20 20 66 6f 72 28 6a 3d  = '\'';.  for(j=
6890: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
68a0: 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d  +){.    z[i++] =
68b0: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20   zIdent[j];.    
68c0: 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27  if( zIdent[j]=='
68d0: 5c 27 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  \'' ) z[i++] = '
68e0: 5c 27 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  \'';.  }.  if( n
68f0: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
6900: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7a 5b 69 5d  ] = '\'';.  z[i]
6910: 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20   = 0;.  *pIdx = 
6920: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  i;.}../*.** Gene
6930: 72 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41  rate a CREATE TA
6940: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70  BLE statement ap
6950: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
6960: 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65  e given.** table
6970: 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c  .  Memory to hol
6980: 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68  d the text of th
6990: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  e statement is o
69a0: 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20  btained.** from 
69b0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
69c0: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
69d0: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
69e0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
69f0: 74 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65  tic char *create
6a00: 54 61 62 6c 65 53 74 6d 74 28 54 61 62 6c 65 20  TableStmt(Table 
6a10: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c  *p){.  int i, k,
6a20: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d   n;.  char *zStm
6a30: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c  t;.  char *zSep,
6a40: 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a   *zSep2, *zEnd;.
6a50: 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69    n = 0;.  for(i
6a60: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
6a70: 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64  ++){.    n += id
6a80: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 61 43 6f  entLength(p->aCo
6a90: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  l[i].zName);.  }
6aa0: 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e  .  n += identLen
6ab0: 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  gth(p->zName);. 
6ac0: 20 69 66 28 20 6e 3c 34 30 20 29 7b 0a 20 20 20   if( n<40 ){.   
6ad0: 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20   zSep = "";.    
6ae0: 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20  zSep2 = ",";.   
6af0: 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d   zEnd = ")";.  }
6b00: 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d  else{.    zSep =
6b10: 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65   "\n  ";.    zSe
6b20: 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20  p2 = ",\n  ";.  
6b30: 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a    zEnd = "\n)";.
6b40: 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20    }.  n += 35 + 
6b50: 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74  6*p->nCol;.  zSt
6b60: 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  mt = sqliteMallo
6b70: 63 52 61 77 28 20 6e 20 29 3b 0a 20 20 69 66 28  cRaw( n );.  if(
6b80: 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75   zStmt==0 ) retu
6b90: 72 6e 20 30 3b 0a 20 20 73 74 72 63 70 79 28 7a  rn 0;.  strcpy(z
6ba0: 53 74 6d 74 2c 20 70 2d 3e 69 44 62 3d 3d 31 20  Stmt, p->iDb==1 
6bb0: 3f 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54  ? "CREATE TEMP T
6bc0: 41 42 4c 45 20 22 20 3a 20 22 43 52 45 41 54 45  ABLE " : "CREATE
6bd0: 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d   TABLE ");.  k =
6be0: 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a   strlen(zStmt);.
6bf0: 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74    identPut(zStmt
6c00: 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b  , &k, p->zName);
6c10: 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20  .  zStmt[k++] = 
6c20: 27 28 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  '(';.  for(i=0; 
6c30: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
6c40: 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74  .    strcpy(&zSt
6c50: 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20  mt[k], zSep);.  
6c60: 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a    k += strlen(&z
6c70: 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53  Stmt[k]);.    zS
6c80: 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20  ep = zSep2;.    
6c90: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
6ca0: 26 6b 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  &k, p->aCol[i].z
6cb0: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 74 72  Name);.  }.  str
6cc0: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
6cd0: 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  End);.  return z
6ce0: 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Stmt;.}../*.** T
6cf0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
6d00: 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20  alled to report 
6d10: 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68  the final ")" th
6d20: 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a  at terminates.**
6d30: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
6d40: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
6d50: 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63   The table struc
6d60: 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20  ture that other 
6d70: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
6d80: 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69  have been buildi
6d90: 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ng.** is added t
6da0: 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68  o the internal h
6db0: 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75  ash tables, assu
6dc0: 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68  ming no errors h
6dd0: 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e  ave.** occurred.
6de0: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20  .**.** An entry 
6df0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73  for the table is
6e00: 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73   made in the mas
6e10: 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73  ter table on dis
6e20: 6b 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 74 68 69  k,.** unless thi
6e30: 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
6e40: 20 74 61 62 6c 65 20 6f 72 20 69 6e 69 74 46 6c   table or initFl
6e50: 61 67 3d 3d 31 2e 20 20 57 68 65 6e 20 69 6e 69  ag==1.  When ini
6e60: 74 46 6c 61 67 3d 3d 31 2c 0a 2a 2a 20 69 74 20  tFlag==1,.** it 
6e70: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
6e80: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
6e90: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
6ea0: 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20  ause we just.** 
6eb0: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65  connected to the
6ec0: 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63   database or bec
6ed0: 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  ause the sqlite_
6ee0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73  master table has
6ef0: 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61  .** recently cha
6f00: 6e 67 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74  nges, so the ent
6f10: 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
6f20: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
6f30: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   in.** the sqlit
6f40: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
6f50: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
6f60: 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61  to create it aga
6f70: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  in..**.** If the
6f80: 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e   pSelect argumen
6f90: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  t is not NULL, i
6fa0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  t means that thi
6fb0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73  s routine.** was
6fc0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
6fd0: 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61  e a table genera
6fe0: 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22  ted from a .** "
6ff0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e  CREATE TABLE ...
7000: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20   AS SELECT ..." 
7010: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
7020: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a  column names of.
7030: 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
7040: 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20   will match the 
7050: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
7060: 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
7070: 64 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65  d sqliteEndTable
7080: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7090: 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65 6c  Token *pEnd, Sel
70a0: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
70b0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c   Table *p;.  sql
70c0: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
70d0: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45  ->db;..  if( (pE
70e0: 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74  nd==0 && pSelect
70f0: 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ==0) || pParse->
7100: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  nErr || sqlite_m
7110: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
7120: 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61  eturn;.  p = pPa
7130: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
7140: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
7150: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  urn;..  /* If th
7160: 65 20 74 61 62 6c 65 20 69 73 20 67 65 6e 65 72  e table is gener
7170: 61 74 65 64 20 66 72 6f 6d 20 61 20 53 45 4c 45  ated from a SELE
7180: 43 54 2c 20 74 68 65 6e 20 63 6f 6e 73 74 72 75  CT, then constru
7190: 63 74 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74  ct the.  ** list
71a0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20   of columns and 
71b0: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  the text of the 
71c0: 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
71d0: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
71e0: 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 20   Table *pSelTab 
71f0: 3d 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65  = sqliteResultSe
7200: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
7210: 2c 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  , 0, pSelect);. 
7220: 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d     if( pSelTab==
7230: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
7240: 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d  assert( p->aCol=
7250: 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f  =0 );.    p->nCo
7260: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
7270: 6c 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d  l;.    p->aCol =
7280: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a   pSelTab->aCol;.
7290: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f      pSelTab->nCo
72a0: 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54  l = 0;.    pSelT
72b0: 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
72c0: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61    sqliteDeleteTa
72d0: 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b  ble(0, pSelTab);
72e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
72f0: 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31 20  e initFlag is 1 
7300: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
7310: 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20  reading the SQL 
7320: 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71  off the.  ** "sq
7330: 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20  lite_master" or 
7340: 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73  "sqlite_temp_mas
7350: 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68  ter" table on th
7360: 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20  e disk..  ** So 
7370: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  do not write to 
7380: 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20  the disk again. 
7390: 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f   Extract the roo
73a0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  t page number.  
73b0: 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ** for the table
73c0: 20 66 72 6f 6d 20 74 68 65 20 70 50 61 72 73 65   from the pParse
73d0: 2d 3e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  ->newTnum field.
73e0: 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
73f0: 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  er.  ** should h
7400: 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65  ave been put the
7410: 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
7420: 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
7430: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
7440: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a  se->initFlag ){.
7450: 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 70 50      p->tnum = pP
7460: 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20  arse->newTnum;. 
7470: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20   }..  /* If not 
7480: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68  initializing, th
7490: 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f  en create a reco
74a0: 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  rd for the new t
74b0: 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  able.  ** in the
74c0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
74d0: 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61  able of the data
74e0: 62 61 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72  base.  The recor
74f0: 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f  d number.  ** fo
7500: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  r the new table 
7510: 65 6e 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72  entry should alr
7520: 65 61 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73  eady be on the s
7530: 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tack..  **.  ** 
7540: 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  If this is a TEM
7550: 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72  PORARY table, wr
7560: 69 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e  ite the entry in
7570: 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  to the auxiliary
7580: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65  .  ** file inste
7590: 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d  ad of into the m
75a0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
75b0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  e..  */.  if( !p
75c0: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20  Parse->initFlag 
75d0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
75e0: 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20    Vdbe *v;..    
75f0: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
7600: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
7610: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
7620: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65  ;.    if( p->pSe
7630: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lect==0 ){.     
7640: 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61   /* A regular ta
7650: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ble */.      sql
7660: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
7670: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20  OP_CreateTable, 
7680: 30 2c 20 70 2d 3e 69 44 62 29 3b 0a 20 20 20 20  0, p->iDb);.    
7690: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
76a0: 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP3(v, -1, (cha
76b0: 72 20 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20 50 33  r *)&p->tnum, P3
76c0: 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d  _POINTER);.    }
76d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
76e0: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 73   view */.      s
76f0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
7700: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
7710: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   0);.    }.    p
7720: 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20  ->tnum = 0;.    
7730: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7740: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30  v, OP_Pull, 1, 0
7750: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
7760: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
7770: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
7780: 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d  if( p->pSelect==
7790: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
77a0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
77b0: 20 2d 31 2c 20 22 74 61 62 6c 65 22 2c 20 50 33   -1, "table", P3
77c0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 65  _STATIC);.    }e
77d0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
77e0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
77f0: 20 2d 31 2c 20 22 76 69 65 77 22 2c 20 50 33 5f   -1, "view", P3_
7800: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20  STATIC);.    }. 
7810: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7820: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
7830: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
7840: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
7850: 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  , -1, p->zName, 
7860: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
7870: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7880: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
7890: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
78a0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
78b0: 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f  1, p->zName, P3_
78c0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
78d0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
78e0: 4f 50 5f 44 75 70 2c 20 34 2c 20 30 29 3b 0a 20  OP_Dup, 4, 0);. 
78f0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7900: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
7910: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
7920: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
7930: 20 63 68 61 72 20 2a 7a 20 3d 20 63 72 65 61 74   char *z = creat
7940: 65 54 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20  eTableStmt(p);. 
7950: 20 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73 74 72       n = z ? str
7960: 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 20 20  len(z) : 0;.    
7970: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
7980: 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e  geP3(v, -1, z, n
7990: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
79a0: 72 65 65 28 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  ree(z);.    }els
79b0: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
79c0: 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20   pEnd!=0 );.    
79d0: 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d    n = Addr(pEnd-
79e0: 3e 7a 29 20 2d 20 41 64 64 72 28 70 50 61 72 73  >z) - Addr(pPars
79f0: 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a  e->sFirstToken.z
7a00: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  ) + 1;.      sql
7a10: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
7a20: 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 73  v, -1, pParse->s
7a30: 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 2c 20 6e 29  FirstToken.z, n)
7a40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
7a50: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7a60: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c  P_MakeRecord, 5,
7a70: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
7a80: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
7a90: 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b  utIntKey, 0, 0);
7aa0: 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 69 44 62  .    if( !p->iDb
7ab0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7ac0: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
7ad0: 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   v);.    }.    s
7ae0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
7af0: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30  , OP_Close, 0, 0
7b00: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  );.    if( pSele
7b10: 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
7b20: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7b30: 50 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e 69 44  P_Integer, p->iD
7b40: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  b, 0);.      sql
7b50: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
7b60: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
7b70: 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
7b80: 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20  e->nTab = 2;.   
7b90: 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28     sqliteSelect(
7ba0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
7bb0: 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30   SRT_Table, 1, 0
7bc0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
7bd0: 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74     sqliteEndWrit
7be0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
7bf0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  e);.  }..  /* Ad
7c00: 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74  d the table to t
7c10: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
7c20: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
7c30: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
7c40: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
7c50: 65 78 70 6c 61 69 6e 3d 3d 30 20 26 26 20 70 50  explain==0 && pP
7c60: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
7c70: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64  .    Table *pOld
7c80: 3b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65  ;.    FKey *pFKe
7c90: 79 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71  y;.    pOld = sq
7ca0: 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26  liteHashInsert(&
7cb0: 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e  db->aDb[p->iDb].
7cc0: 74 62 6c 48 61 73 68 2c 20 0a 20 20 20 20 20 20  tblHash, .      
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ce0: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20        p->zName, 
7cf0: 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29  strlen(p->zName)
7d00: 2b 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  +1, p);.    if( 
7d10: 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73  pOld ){.      as
7d20: 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b  sert( p==pOld );
7d30: 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
7d40: 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73   have failed ins
7d50: 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29  ide HashInsert()
7d60: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
7d70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
7d80: 70 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20  pFKey=p->pFKey; 
7d90: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b  pFKey; pFKey=pFK
7da0: 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a  ey->pNextFrom){.
7db0: 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20        int nTo = 
7dc0: 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54  strlen(pFKey->zT
7dd0: 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46  o) + 1;.      pF
7de0: 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73  Key->pNextTo = s
7df0: 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 64  qliteHashFind(&d
7e00: 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61  b->aDb[p->iDb].a
7e10: 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f  FKey, pFKey->zTo
7e20: 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73 71  , nTo);.      sq
7e30: 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26  liteHashInsert(&
7e40: 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e  db->aDb[p->iDb].
7e50: 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54  aFKey, pFKey->zT
7e60: 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a  o, nTo, pFKey);.
7e70: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
7e80: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b  ->pNewTable = 0;
7e90: 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b  .    db->nTable+
7ea0: 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  +;.    db->flags
7eb0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
7ec0: 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a  nChanges;.  }.}.
7ed0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  ./*.** The parse
7ee0: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
7ef0: 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  tine in order to
7f00: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49   create a new VI
7f10: 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  EW.*/.void sqlit
7f20: 65 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50  eCreateView(.  P
7f30: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7f40: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
7f50: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
7f60: 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20  ken *pBegin,    
7f70: 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
7f80: 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
7f90: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
7fa0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
7fb0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f  ,      /* The to
7fc0: 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ken that holds t
7fd0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
7fe0: 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  iew */.  Select 
7ff0: 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41  *pSelect,   /* A
8000: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
8010: 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  t that will beco
8020: 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20  me the new view 
8030: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20  */.  int isTemp 
8040: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
8050: 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20  for a TEMPORARY 
8060: 76 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  view */.){.  Tab
8070: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a  le *p;.  int n;.
8080: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
8090: 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20  .  Token sEnd;. 
80a0: 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 0a   DbFixer sFix;..
80b0: 20 20 73 71 6c 69 74 65 53 74 61 72 74 54 61 62    sqliteStartTab
80c0: 6c 65 28 70 50 61 72 73 65 2c 20 70 42 65 67 69  le(pParse, pBegi
80d0: 6e 2c 20 70 4e 61 6d 65 2c 20 69 73 54 65 6d 70  n, pName, isTemp
80e0: 2c 20 31 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  , 1);.  p = pPar
80f0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
8100: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
8110: 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
8120: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c   sqliteSelectDel
8130: 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  ete(pSelect);.  
8140: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
8150: 69 66 28 20 73 71 6c 69 74 65 46 69 78 49 6e 69  if( sqliteFixIni
8160: 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
8170: 20 70 2d 3e 69 44 62 2c 20 22 76 69 65 77 22 2c   p->iDb, "view",
8180: 20 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20 73   pName).    && s
8190: 71 6c 69 74 65 46 69 78 53 65 6c 65 63 74 28 26  qliteFixSelect(&
81a0: 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 0a 20  sFix, pSelect). 
81b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
81c0: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65  lectDelete(pSele
81d0: 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ct);.    return;
81e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
81f0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e  a copy of the en
8200: 74 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74  tire SELECT stat
8210: 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e  ement that defin
8220: 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a  es the view..  *
8230: 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63  * This will forc
8240: 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74  e all the Expr.t
8250: 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f  oken.z values to
8260: 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   be dynamically.
8270: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72    ** allocated r
8280: 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74  ather than point
8290: 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74   to the input st
82a0: 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61  ring - which mea
82b0: 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  ns that.  ** the
82c0: 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61  y will persist a
82d0: 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  fter the current
82e0: 20 73 71 6c 69 74 65 5f 65 78 65 63 28 29 20 63   sqlite_exec() c
82f0: 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a  all returns..  *
8300: 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d  /.  p->pSelect =
8310: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 75 70   sqliteSelectDup
8320: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  (pSelect);.  sql
8330: 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28  iteSelectDelete(
8340: 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20  pSelect);.  if( 
8350: 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61  !pParse->initFla
8360: 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  g ){.    sqliteV
8370: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
8380: 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  s(pParse, p);.  
8390: 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
83a0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
83b0: 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d  EATE VIEW statem
83c0: 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20  ent.  Make sEnd 
83d0: 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68  point to.  ** th
83e0: 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45  e end..  */.  sE
83f0: 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61  nd = pParse->sLa
8400: 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73  stToken;.  if( s
8410: 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73  End.z[0]!=0 && s
8420: 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b  End.z[0]!=';' ){
8430: 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73  .    sEnd.z += s
8440: 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e  End.n;.  }.  sEn
8450: 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28  d.n = 0;.  n = (
8460: 28 69 6e 74 29 73 45 6e 64 2e 7a 29 20 2d 20 28  (int)sEnd.z) - (
8470: 69 6e 74 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20  int)pBegin->z;. 
8480: 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a   z = pBegin->z;.
8490: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
84a0: 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20  (z[n-1]==';' || 
84b0: 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29  isspace(z[n-1]))
84c0: 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e   ){ n--; }.  sEn
84d0: 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20  d.z = &z[n-1];. 
84e0: 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20   sEnd.n = 1;..  
84f0: 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 45 6e 64  /* Use sqliteEnd
8500: 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74  Table() to add t
8510: 68 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53  he view to the S
8520: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
8530: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 45 6e  le */.  sqliteEn
8540: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 26  dTable(pParse, &
8550: 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74 75  sEnd, 0);.  retu
8560: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rn;.}../*.** The
8570: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
8580: 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c   pTable is reall
8590: 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20  y a VIEW.  Fill 
85a0: 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  in the names of.
85b0: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  ** the columns o
85c0: 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74 68  f the view in th
85d0: 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74 75  e pTable structu
85e0: 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  re.  Return the 
85f0: 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72  number.** of err
8600: 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  ors.  If an erro
8610: 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20  r is seen leave 
8620: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
8630: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
8640: 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
8650: 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  teViewGetColumnN
8660: 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ames(Parse *pPar
8670: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  se, Table *pTabl
8680: 65 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  e){.  ExprList *
8690: 70 45 4c 69 73 74 3b 0a 20 20 53 65 6c 65 63 74  pEList;.  Select
86a0: 20 2a 70 53 65 6c 3b 0a 20 20 54 61 62 6c 65 20   *pSel;.  Table 
86b0: 2a 70 53 65 6c 54 61 62 3b 0a 20 20 69 6e 74 20  *pSelTab;.  int 
86c0: 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73  nErr = 0;..  ass
86d0: 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a  ert( pTable );..
86e0: 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20    /* A positive 
86f0: 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63  nCol means the c
8700: 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72  olumns names for
8710: 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20   this view are. 
8720: 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77   ** already know
8730: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  n..  */.  if( pT
8740: 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72  able->nCol>0 ) r
8750: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41  eturn 0;..  /* A
8760: 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69   negative nCol i
8770: 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b  s a special mark
8780: 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  er meaning that 
8790: 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  we are currently
87a0: 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20  .  ** trying to 
87b0: 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75  compute the colu
87c0: 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65  mn names.  If we
87d0: 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74   enter this rout
87e0: 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20  ine with.  ** a 
87f0: 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69  negative nCol, i
8800: 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d  t means two or m
8810: 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61  ore views form a
8820: 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73   loop, like this
8830: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
8840: 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20  CREATE VIEW one 
8850: 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
8860: 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43   two;.  **     C
8870: 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41  REATE VIEW two A
8880: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
8890: 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  one;.  **.  ** A
88a0: 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20 65 72  ctually, this er
88b0: 72 6f 72 20 69 73 20 63 61 75 67 68 74 20 70 72  ror is caught pr
88c0: 65 76 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20  eviously and so 
88d0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  the following te
88e0: 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61  st.  ** should a
88f0: 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 42 75 74  lways fail.  But
8900: 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 69   we will leave i
8910: 74 20 69 6e 20 70 6c 61 63 65 20 6a 75 73 74 20  t in place just 
8920: 74 6f 20 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f  to be safe..  */
8930: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
8940: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  Col<0 ){.    sql
8950: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
8960: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
8970: 76 69 65 77 20 22 2c 20 70 54 61 62 6c 65 2d 3e  view ", pTable->
8980: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
8990: 22 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20  " is circularly 
89a0: 64 65 66 69 6e 65 64 22 2c 20 28 63 68 61 72 2a  defined", (char*
89b0: 29 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  )0);.    pParse-
89c0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74  >nErr++;.    ret
89d0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
89e0: 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
89f0: 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65  far, it means we
8a00: 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   need to compute
8a10: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73   the table names
8a20: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
8a30: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
8a40: 20 29 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d   ); /* If nCol==
8a50: 30 2c 20 74 68 65 6e 20 70 54 61 62 6c 65 20 6d  0, then pTable m
8a60: 75 73 74 20 62 65 20 61 20 56 49 45 57 20 2a 2f  ust be a VIEW */
8a70: 0a 20 20 70 53 65 6c 20 3d 20 70 54 61 62 6c 65  .  pSel = pTable
8a80: 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a  ->pSelect;..  /*
8a90: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63   Note that the c
8aa0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 52 65 73  all to sqliteRes
8ab0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
8ac0: 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79   will expand any
8ad0: 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e  .  ** "*" elemen
8ae0: 74 73 20 69 6e 20 74 68 69 73 20 6c 69 73 74 2e  ts in this list.
8af0: 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6e 65    But we will ne
8b00: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
8b10: 65 20 6c 69 73 74 0a 20 20 2a 2a 20 62 61 63 6b  e list.  ** back
8b20: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
8b30: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61   configuration a
8b40: 66 74 65 72 77 61 72 64 73 2c 20 73 6f 20 77 65  fterwards, so we
8b50: 20 73 61 76 65 20 61 20 63 6f 70 79 20 6f 66 0a   save a copy of.
8b60: 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61    ** the origina
8b70: 6c 20 69 6e 20 70 45 4c 69 73 74 2e 0a 20 20 2a  l in pEList..  *
8b80: 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  /.  pEList = pSe
8b90: 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 53 65  l->pEList;.  pSe
8ba0: 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  l->pEList = sqli
8bb0: 74 65 45 78 70 72 4c 69 73 74 44 75 70 28 70 45  teExprListDup(pE
8bc0: 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 70 53 65  List);.  if( pSe
8bd0: 6c 2d 3e 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a  l->pEList==0 ){.
8be0: 20 20 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74      pSel->pEList
8bf0: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 72   = pEList;.    r
8c00: 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c  eturn 1;  /* Mal
8c10: 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  loc failed */.  
8c20: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  }.  pTable->nCol
8c30: 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62   = -1;.  pSelTab
8c40: 20 3d 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53   = sqliteResultS
8c50: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
8c60: 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 69  e, 0, pSel);.  i
8c70: 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20  f( pSelTab ){.  
8c80: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
8c90: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
8ca0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
8cb0: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
8cc0: 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20     pTable->aCol 
8cd0: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
8ce0: 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43  .    pSelTab->nC
8cf0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c  ol = 0;.    pSel
8d00: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
8d10: 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54     sqliteDeleteT
8d20: 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29  able(0, pSelTab)
8d30: 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65  ;.    DbSetPrope
8d40: 72 74 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  rty(pParse->db, 
8d50: 70 54 61 62 6c 65 2d 3e 69 44 62 2c 20 44 42 5f  pTable->iDb, DB_
8d60: 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 20  UnresetViews);. 
8d70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62   }else{.    pTab
8d80: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->nCol = 0;.  
8d90: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20    nErr++;.  }.  
8da0: 73 71 6c 69 74 65 53 65 6c 65 63 74 55 6e 62 69  sqliteSelectUnbi
8db0: 6e 64 28 70 53 65 6c 29 3b 0a 20 20 73 71 6c 69  nd(pSel);.  sqli
8dc0: 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  teExprListDelete
8dd0: 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a  (pSel->pEList);.
8de0: 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d    pSel->pEList =
8df0: 20 70 45 4c 69 73 74 3b 0a 20 20 72 65 74 75 72   pEList;.  retur
8e00: 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a  n nErr;  .}../*.
8e10: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c  ** Clear the col
8e20: 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74  umn names from t
8e30: 68 65 20 56 49 45 57 20 70 54 61 62 6c 65 2e 0a  he VIEW pTable..
8e40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8e50: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
8e60: 6e 65 76 65 72 20 61 6e 79 20 6f 74 68 65 72 20  never any other 
8e70: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73  table or view is
8e80: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 54 68   modified..** Th
8e90: 65 20 76 69 65 77 20 70 61 73 73 65 64 20 69 6e  e view passed in
8ea0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
8eb0: 6d 69 67 68 74 20 64 65 70 65 6e 64 20 64 69 72  might depend dir
8ec0: 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63  ectly or indirec
8ed0: 74 6c 79 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f  tly.** on the mo
8ee0: 64 69 66 69 65 64 20 6f 72 20 64 65 6c 65 74 65  dified or delete
8ef0: 64 20 74 61 62 6c 65 20 73 6f 20 77 65 20 6e 65  d table so we ne
8f00: 65 64 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20  ed to clear the 
8f10: 6f 6c 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61  old column.** na
8f20: 6d 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  mes so that they
8f30: 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 6d 70 75   will be recompu
8f40: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
8f50: 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
8f60: 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54  setColumnNames(T
8f70: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
8f80: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 54   int i;.  if( pT
8f90: 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c  able==0 || pTabl
8fa0: 65 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20  e->pSelect==0 ) 
8fb0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 54  return;.  if( pT
8fc0: 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 30 20 29 20  able->nCol==0 ) 
8fd0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
8fe0: 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f  0; i<pTable->nCo
8ff0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  l; i++){.    sql
9000: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e  iteFree(pTable->
9010: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  aCol[i].zName);.
9020: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
9030: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  Table->aCol[i].z
9040: 44 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Dflt);.    sqlit
9050: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
9060: 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20  ol[i].zType);.  
9070: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
9080: 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20  Table->aCol);.  
9090: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30  pTable->aCol = 0
90a0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ;.  pTable->nCol
90b0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
90c0: 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
90d0: 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79  names from every
90e0: 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73   VIEW in databas
90f0: 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  e idx..*/.static
9100: 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77   void sqliteView
9110: 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 20  ResetAll(sqlite 
9120: 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20  *db, int idx){. 
9130: 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20   HashElem *i;.  
9140: 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72  if( !DbHasProper
9150: 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
9160: 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72  nresetViews) ) r
9170: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73  eturn;.  for(i=s
9180: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
9190: 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 74 62 6c  db->aDb[idx].tbl
91a0: 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69  Hash); i; i=sqli
91b0: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
91c0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
91d0: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
91e0: 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  (i);.    if( pTa
91f0: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
9200: 20 20 20 20 73 71 6c 69 74 65 56 69 65 77 52 65      sqliteViewRe
9210: 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  setColumnNames(p
9220: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tab);.    }.  }.
9230: 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74    DbClearPropert
9240: 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
9250: 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 0a  resetViews);.}..
9260: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f  /*.** Given a to
9270: 6b 65 6e 2c 20 6c 6f 6f 6b 20 75 70 20 61 20 74  ken, look up a t
9280: 61 62 6c 65 20 77 69 74 68 20 74 68 61 74 20 6e  able with that n
9290: 61 6d 65 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75  ame.  If not fou
92a0: 6e 64 2c 20 6c 65 61 76 65 0a 2a 2a 20 61 6e 20  nd, leave.** an 
92b0: 65 72 72 6f 72 20 66 6f 72 20 74 68 65 20 70 61  error for the pa
92c0: 72 73 65 72 20 74 6f 20 66 69 6e 64 20 61 6e 64  rser to find and
92d0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
92e0: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 54 61  .Table *sqliteTa
92f0: 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 50 61 72  bleFromToken(Par
9300: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
9310: 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20 63 68 61 72  n *pTok){.  char
9320: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 54 61 62 6c 65   *zName;.  Table
9330: 20 2a 70 54 61 62 3b 0a 20 20 7a 4e 61 6d 65 20   *pTab;.  zName 
9340: 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d  = sqliteTableNam
9350: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29  eFromToken(pTok)
9360: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
9370: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
9380: 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  Tab = sqliteFind
9390: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
93a0: 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73  , zName, 0);.  s
93b0: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
93c0: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
93d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
93e0: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
93f0: 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75  >zErrMsg, "no su
9400: 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 30 2c 20  ch table: ", 0, 
9410: 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 2d 3e 7a  .        pTok->z
9420: 2c 20 70 54 6f 6b 2d 3e 6e 2c 20 30 29 3b 0a 20  , pTok->n, 0);. 
9430: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
9440: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
9450: 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pTab;.}../*.** T
9460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
9470: 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20  alled to do the 
9480: 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54  work of a DROP T
9490: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
94a0: 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  ** pName is the 
94b0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
94c0: 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e  e to be dropped.
94d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44  .*/.void sqliteD
94e0: 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  ropTable(Parse *
94f0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
9500: 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77  Name, int isView
9510: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
9520: 6c 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  le;.  Vdbe *v;. 
9530: 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 73 71 6c   int base;.  sql
9540: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
9550: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
9560: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
9570: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  nErr || sqlite_m
9580: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
9590: 65 74 75 72 6e 3b 0a 20 20 70 54 61 62 6c 65 20  eturn;.  pTable 
95a0: 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f  = sqliteTableFro
95b0: 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 70  mToken(pParse, p
95c0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61  Name);.  if( pTa
95d0: 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ble==0 ) return;
95e0: 0a 20 20 69 44 62 20 3d 20 70 54 61 62 6c 65 2d  .  iDb = pTable-
95f0: 3e 69 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20  >iDb;.  assert( 
9600: 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
9610: 2d 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65 66  ->nDb );.#ifndef
9620: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
9630: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
9640: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
9650: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
9660: 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
9670: 28 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 20  (pTable->iDb);. 
9680: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
9690: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61  Db = db->aDb[pTa
96a0: 62 6c 65 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b  ble->iDb].zName;
96b0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 41  .    if( sqliteA
96c0: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
96d0: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
96e0: 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a  zTab, 0, zDb)){.
96f0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
9700: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
9710: 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
9720: 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
9730: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
9740: 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  DROP_TEMP_VIEW;.
9750: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9760: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
9770: 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20  TE_DROP_VIEW;.  
9780: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
9790: 0a 20 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d  .      if( iDb==
97a0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
97b0: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
97c0: 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  TEMP_TABLE;.    
97d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
97e0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
97f0: 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  ROP_TABLE;.     
9800: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
9810: 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b   sqliteAuthCheck
9820: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
9830: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 2c  Table->zName, 0,
9840: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 72   zDb) ){.      r
9850: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
9860: 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43   if( sqliteAuthC
9870: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
9880: 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62  ITE_DELETE, pTab
9890: 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  le->zName, 0, zD
98a0: 62 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  b) ){.      retu
98b0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  rn;.    }.  }.#e
98c0: 6e 64 69 66 0a 20 20 69 66 28 20 70 54 61 62 6c  ndif.  if( pTabl
98d0: 65 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  e->readOnly ){. 
98e0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
98f0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
9900: 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70  Msg, "table ", p
9910: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 0a 20  Table->zName, . 
9920: 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20        " may not 
9930: 62 65 20 64 72 6f 70 70 65 64 22 2c 20 28 63 68  be dropped", (ch
9940: 61 72 2a 29 30 29 3b 0a 20 20 20 20 70 50 61 72  ar*)0);.    pPar
9950: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
9960: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
9970: 28 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62  ( isView && pTab
9980: 6c 65 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  le->pSelect==0 )
9990: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
99a0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
99b0: 45 72 72 4d 73 67 2c 20 22 75 73 65 20 44 52 4f  ErrMsg, "use DRO
99c0: 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74  P TABLE to delet
99d0: 65 20 74 61 62 6c 65 20 22 2c 0a 20 20 20 20 20  e table ",.     
99e0: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20   pTable->zName, 
99f0: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 70  (char*)0);.    p
9a00: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
9a10: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
9a20: 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
9a30: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20  pTable->pSelect 
9a40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
9a50: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
9a60: 7a 45 72 72 4d 73 67 2c 20 22 75 73 65 20 44 52  zErrMsg, "use DR
9a70: 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74  OP VIEW to delet
9a80: 65 20 76 69 65 77 20 22 2c 0a 20 20 20 20 20 20  e view ",.      
9a90: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 28  pTable->zName, (
9aa0: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 70 50  char*)0);.    pP
9ab0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
9ac0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
9ad0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
9ae0: 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
9af0: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d  table from the m
9b00: 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a  aster table.  **
9b10: 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
9b20: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
9b30: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
9b40: 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ( v ){.    stati
9b50: 63 20 56 64 62 65 4f 70 20 64 72 6f 70 54 61 62  c VdbeOp dropTab
9b60: 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  le[] = {.      {
9b70: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20   OP_Rewind,     
9b80: 30 2c 20 41 44 44 52 28 38 29 2c 20 20 30 7d 2c  0, ADDR(8),  0},
9b90: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69  .      { OP_Stri
9ba0: 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  ng,     0, 0,   
9bb0: 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f       0}, /* 1 */
9bc0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53  .      { OP_MemS
9bd0: 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20  tore,   1, 1,   
9be0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
9bf0: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20   OP_MemLoad,    
9c00: 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 0,        0},
9c10: 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 3 */.      {
9c20: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20   OP_Column,     
9c30: 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 2,        0},
9c40: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20  .      { OP_Ne, 
9c50: 20 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28          0, ADDR(
9c60: 37 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b  7),  0},.      {
9c70: 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20   OP_Delete,     
9c80: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
9c90: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74  .      { OP_Next
9ca0: 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28  ,       0, ADDR(
9cb0: 33 29 2c 20 20 30 7d 2c 20 2f 2a 20 37 20 2a 2f  3),  0}, /* 7 */
9cc0: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 49 6e 64 65  .    };.    Inde
9cd0: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 72 69  x *pIdx;.    Tri
9ce0: 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a  gger *pTrigger;.
9cf0: 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57      sqliteBeginW
9d00: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
9d10: 61 72 73 65 2c 20 30 2c 20 70 54 61 62 6c 65 2d  arse, 0, pTable-
9d20: 3e 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  >iDb);..    /* D
9d30: 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73  rop all triggers
9d40: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
9d50: 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
9d60: 20 64 72 6f 70 70 65 64 20 2a 2f 0a 20 20 20 20   dropped */.    
9d70: 70 54 72 69 67 67 65 72 20 3d 20 70 54 61 62 6c  pTrigger = pTabl
9d80: 65 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20  e->pTrigger;.   
9d90: 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72   while( pTrigger
9da0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
9db0: 28 20 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d  ( pTrigger->iDb=
9dc0: 3d 70 54 61 62 6c 65 2d 3e 69 44 62 20 7c 7c 20  =pTable->iDb || 
9dd0: 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d 31  pTrigger->iDb==1
9de0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
9df0: 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70  DropTriggerPtr(p
9e00: 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 2c  Parse, pTrigger,
9e10: 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   1);.      if( p
9e20: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
9e30: 7b 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 67  {.        pTrigg
9e40: 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70  er = pTrigger->p
9e50: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Next;.      }els
9e60: 65 7b 0a 20 20 20 20 20 20 20 20 70 54 72 69 67  e{.        pTrig
9e70: 67 65 72 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54  ger = pTable->pT
9e80: 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20 7d 0a  rigger;.      }.
9e90: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72      }..    /* Dr
9ea0: 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41  op all SQLITE_MA
9eb0: 53 54 45 52 20 65 6e 74 72 69 65 73 20 74 68 61  STER entries tha
9ec0: 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 74  t refer to the t
9ed0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  able */.    sqli
9ee0: 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  teOpenMasterTabl
9ef0: 65 28 76 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62  e(v, pTable->iDb
9f00: 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71  );.    base = sq
9f10: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
9f20: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64  t(v, ArraySize(d
9f30: 72 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54  ropTable), dropT
9f40: 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  able);.    sqlit
9f50: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
9f60: 20 62 61 73 65 2b 31 2c 20 70 54 61 62 6c 65 2d   base+1, pTable-
9f70: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 0a 20 20 20  >zName, 0);..   
9f80: 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c   /* Drop all SQL
9f90: 49 54 45 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20  ITE_TEMP_MASTER 
9fa0: 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66  entries that ref
9fb0: 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  er to the table 
9fc0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c  */.    if( pTabl
9fd0: 65 2d 3e 69 44 62 21 3d 31 20 29 7b 0a 20 20 20  e->iDb!=1 ){.   
9fe0: 20 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73     sqliteOpenMas
9ff0: 74 65 72 54 61 62 6c 65 28 76 2c 20 31 29 3b 0a  terTable(v, 1);.
a000: 20 20 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c        base = sql
a010: 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74  iteVdbeAddOpList
a020: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72  (v, ArraySize(dr
a030: 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54 61  opTable), dropTa
a040: 62 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ble);.      sqli
a050: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
a060: 2c 20 62 61 73 65 2b 31 2c 20 70 54 61 62 6c 65  , base+1, pTable
a070: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
a080: 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 54 61 62   }..    if( pTab
a090: 6c 65 2d 3e 69 44 62 3d 3d 30 20 29 7b 0a 20 20  le->iDb==0 ){.  
a0a0: 20 20 20 20 73 71 6c 69 74 65 43 68 61 6e 67 65      sqliteChange
a0b0: 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a 20  Cookie(db, v);. 
a0c0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
a0d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
a0e0: 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lose, 0, 0);.   
a0f0: 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a   if( !isView ){.
a100: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
a110: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74  AddOp(v, OP_Dest
a120: 72 6f 79 2c 20 70 54 61 62 6c 65 2d 3e 74 6e 75  roy, pTable->tnu
a130: 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b  m, pTable->iDb);
a140: 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d  .      for(pIdx=
a150: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
a160: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
a170: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
a180: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
a190: 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20  (v, OP_Destroy, 
a1a0: 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 49 64 78  pIdx->tnum, pIdx
a1b0: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a  ->iDb);.      }.
a1c0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
a1d0: 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
a1e0: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a  n(pParse);.  }..
a1f0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
a200: 69 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 63 72 69  in-memory descri
a210: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62  ption of the tab
a220: 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  le..  **.  ** Ex
a230: 63 65 70 74 69 6f 6e 3a 20 69 66 20 74 68 65 20  ception: if the 
a240: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65  SQL statement be
a250: 67 61 6e 20 77 69 74 68 20 74 68 65 20 45 58 50  gan with the EXP
a260: 4c 41 49 4e 20 6b 65 79 77 6f 72 64 2c 0a 20 20  LAIN keyword,.  
a270: 2a 2a 20 74 68 65 6e 20 6e 6f 20 63 68 61 6e 67  ** then no chang
a280: 65 73 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 64  es should be mad
a290: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  e..  */.  if( !p
a2a0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
a2b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69  {.    sqliteUnli
a2c0: 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65  nkAndDeleteTable
a2d0: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
a2e0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
a2f0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
a300: 67 65 73 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ges;.  }.  sqlit
a310: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62  eViewResetAll(db
a320: 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , iDb);.}../*.**
a330: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   This routine co
a340: 6e 73 74 72 75 63 74 73 20 61 20 50 33 20 73 74  nstructs a P3 st
a350: 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f  ring suitable fo
a360: 72 20 61 6e 20 4f 50 5f 4d 61 6b 65 49 64 78 4b  r an OP_MakeIdxK
a370: 65 79 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 6e 64  ey.** opcode and
a380: 20 61 64 64 73 20 74 68 61 74 20 50 33 20 73 74   adds that P3 st
a390: 72 69 6e 67 20 74 6f 20 74 68 65 20 6d 6f 73 74  ring to the most
a3a0: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
a3b0: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  ed instruction.*
a3c0: 2a 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c  * in the virtual
a3d0: 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 65 20 50   machine.  The P
a3e0: 33 20 73 74 72 69 6e 67 20 63 6f 6e 73 69 73 74  3 string consist
a3f0: 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 68  s of a single ch
a400: 61 72 61 63 74 65 72 0a 2a 2a 20 66 6f 72 20 65  aracter.** for e
a410: 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  ach column in th
a420: 65 20 69 6e 64 65 78 20 70 49 64 78 20 6f 66 20  e index pIdx of 
a430: 74 61 62 6c 65 20 70 54 61 62 2e 20 20 49 66 20  table pTab.  If 
a440: 74 68 65 20 63 6f 6c 75 6d 6e 20 75 73 65 73 0a  the column uses.
a450: 2a 2a 20 61 20 6e 75 6d 65 72 69 63 20 73 6f 72  ** a numeric sor
a460: 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68  t order, then th
a470: 65 20 50 33 20 73 74 72 69 6e 67 20 63 68 61 72  e P3 string char
a480: 61 63 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64  acter correspond
a490: 69 6e 67 20 74 6f 0a 2a 2a 20 74 68 61 74 20 63  ing to.** that c
a4a0: 6f 6c 75 6d 6e 20 69 73 20 27 6e 27 2e 20 20 49  olumn is 'n'.  I
a4b0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 75 73 65  f the column use
a4c0: 73 20 61 20 74 65 78 74 20 73 6f 72 74 20 6f 72  s a text sort or
a4d0: 64 65 72 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  der, then the.**
a4e0: 20 50 33 20 73 74 72 69 6e 67 20 69 73 20 27 74   P3 string is 't
a4f0: 27 2e 20 20 53 65 65 20 74 68 65 20 4f 50 5f 4d  '.  See the OP_M
a500: 61 6b 65 49 64 78 4b 65 79 20 6f 70 63 6f 64 65  akeIdxKey opcode
a510: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66   documentation f
a520: 6f 72 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c  or.** additional
a530: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53   information.  S
a540: 65 65 20 61 6c 73 6f 20 74 68 65 20 73 71 6c 69  ee also the sqli
a550: 74 65 41 64 64 4b 65 79 54 79 70 65 28 29 20 72  teAddKeyType() r
a560: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20  outine..*/.void 
a570: 73 71 6c 69 74 65 41 64 64 49 64 78 4b 65 79 54  sqliteAddIdxKeyT
a580: 79 70 65 28 56 64 62 65 20 2a 76 2c 20 49 6e 64  ype(Vdbe *v, Ind
a590: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 63 68 61  ex *pIdx){.  cha
a5a0: 72 20 2a 7a 54 79 70 65 3b 0a 20 20 54 61 62 6c  r *zType;.  Tabl
a5b0: 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69  e *pTab;.  int i
a5c0: 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  , n;.  assert( p
a5d0: 49 64 78 21 3d 30 20 26 26 20 70 49 64 78 2d 3e  Idx!=0 && pIdx->
a5e0: 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 70  pTable!=0 );.  p
a5f0: 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  Tab = pIdx->pTab
a600: 6c 65 3b 0a 20 20 6e 20 3d 20 70 49 64 78 2d 3e  le;.  n = pIdx->
a610: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7a 54 79 70 65  nColumn;.  zType
a620: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
a630: 61 77 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28  aw( n+1 );.  if(
a640: 20 7a 54 79 70 65 3d 3d 30 20 29 20 72 65 74 75   zType==0 ) retu
a650: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
a660: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  <n; i++){.    in
a670: 74 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61  t iCol = pIdx->a
a680: 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
a690: 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20  assert( iCol>=0 
a6a0: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
a6b0: 6f 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  ol );.    if( (p
a6c0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
a6d0: 73 6f 72 74 4f 72 64 65 72 20 26 20 53 51 4c 49  sortOrder & SQLI
a6e0: 54 45 5f 53 4f 5f 54 59 50 45 4d 41 53 4b 29 3d  TE_SO_TYPEMASK)=
a6f0: 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20  =SQLITE_SO_TEXT 
a700: 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 5b 69  ){.      zType[i
a710: 5d 20 3d 20 27 74 27 3b 0a 20 20 20 20 7d 65 6c  ] = 't';.    }el
a720: 73 65 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 5b  se{.      zType[
a730: 69 5d 20 3d 20 27 6e 27 3b 0a 20 20 20 20 7d 0a  i] = 'n';.    }.
a740: 20 20 7d 0a 20 20 7a 54 79 70 65 5b 6e 5d 20 3d    }.  zType[n] =
a750: 20 30 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65   0;.  sqliteVdbe
a760: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
a770: 7a 54 79 70 65 2c 20 6e 29 3b 0a 20 20 73 71 6c  zType, n);.  sql
a780: 69 74 65 46 72 65 65 28 7a 54 79 70 65 29 3b 0a  iteFree(zType);.
a790: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
a7a0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
a7b0: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
a7c0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74  foreign key on t
a7d0: 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72  he table.** curr
a7e0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
a7f0: 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d  truction.  pFrom
a800: 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77  Col determines w
a810: 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  hich columns.** 
a820: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  in the current t
a830: 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68  able point to th
a840: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20  e foreign key.  
a850: 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74  If pFromCol==0 t
a860: 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74  hen.** connect t
a870: 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61  he key to the la
a880: 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74  st column insert
a890: 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20  ed.  pTo is the 
a8a0: 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74  name of.** the t
a8b0: 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f  able referred to
a8c0: 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c  .  pToCol is a l
a8d0: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ist of tables in
a8e0: 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54   the other.** pT
a8f0: 6f 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65  o table that the
a900: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69   foreign key poi
a910: 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63  nts to.  flags c
a920: 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69  ontains all.** i
a930: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
a940: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65   the conflict re
a950: 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
a960: 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  hms specified.**
a970: 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54   in the ON DELET
a980: 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64  E, ON UPDATE and
a990: 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73   ON INSERT claus
a9a0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65  es..**.** An FKe
a9b0: 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  y structure is c
a9c0: 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64  reated and added
a9d0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
a9e0: 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72  rrently.** under
a9f0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e   construction in
aa00: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   the pParse->pNe
aa10: 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54  wTable field.  T
aa20: 68 65 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69  he new FKey.** i
aa30: 73 20 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74  s not linked int
aa40: 6f 20 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74  o db->aFKey at t
aa50: 68 69 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74  his point - that
aa60: 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e   does not happen
aa70: 0a 2a 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65  .** until sqlite
aa80: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a  EndTable()..**.*
aa90: 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  * The foreign ke
aaa0: 79 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d  y is set for IMM
aab0: 45 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e  EDIATE processin
aac0: 67 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74  g.  A subsequent
aad0: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69   call.** to sqli
aae0: 74 65 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  teDeferForeignKe
aaf0: 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65  y() might change
ab00: 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45   this to DEFERRE
ab10: 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  D..*/.void sqlit
ab20: 65 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65  eCreateForeignKe
ab30: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
ab40: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
ab50: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
ab60: 20 20 49 64 4c 69 73 74 20 2a 70 46 72 6f 6d 43    IdList *pFromC
ab70: 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol,    /* Column
ab80: 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20  s in this table 
ab90: 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74  that point to ot
aba0: 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54  her table */.  T
abb0: 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20  oken *pTo,      
abc0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
abd0: 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
abe0: 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 54 6f 43  /.  IdList *pToC
abf0: 6f 6c 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75  ol,      /* Colu
ac00: 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  mns in the other
ac10: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
ac20: 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
ac30: 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73   /* Conflict res
ac40: 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
ac50: 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ms. */.){.  Tabl
ac60: 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *p = pParse->p
ac70: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20  NewTable;.  int 
ac80: 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  nByte;.  int i;.
ac90: 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68    int nCol;.  ch
aca0: 61 72 20 2a 7a 3b 0a 20 20 46 4b 65 79 20 2a 70  ar *z;.  FKey *p
acb0: 46 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 61 73 73  FKey = 0;..  ass
acc0: 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20  ert( pTo!=0 );. 
acd0: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
ace0: 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
acf0: 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70   fk_end;.  if( p
ad00: 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
ad10: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
ad20: 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  nCol-1;.    if( 
ad30: 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b  iCol<0 ) goto fk
ad40: 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54  _end;.    if( pT
ad50: 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
ad60: 6e 49 64 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  nId!=1 ){.      
ad70: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
ad80: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
ad90: 67 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20  g, "foreign key 
ada0: 6f 6e 20 22 2c 20 2d 31 2c 0a 20 20 20 20 20 20  on ", -1,.      
adb0: 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d     p->aCol[iCol]
adc0: 2e 7a 4e 61 6d 65 2c 20 2d 31 2c 20 0a 20 20 20  .zName, -1, .   
add0: 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72        " should r
ade0: 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e  eference only on
adf0: 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  e column of tabl
ae00: 65 20 22 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20  e ", -1,.       
ae10: 20 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e    pTo->z, pTo->n
ae20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
ae30: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
ae40: 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
ae50: 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20     }.    nCol = 
ae60: 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
ae70: 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
ae80: 3e 6e 49 64 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e  >nId!=pFromCol->
ae90: 6e 49 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nId ){.    sqlit
aea0: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
aeb0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20  se->zErrMsg, .  
aec0: 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66        "number of
aed0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65   columns in fore
aee0: 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  ign key does not
aef0: 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65   match the numbe
af00: 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22  r of ".        "
af10: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
af20: 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22  eferenced table"
af30: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
af40: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
af50: 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
af60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
af70: 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Col = pFromCol->
af80: 6e 49 64 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  nId;.  }.  nByte
af90: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79   = sizeof(*pFKey
afa0: 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28  ) + nCol*sizeof(
afb0: 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20  pFKey->aCol[0]) 
afc0: 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20  + pTo->n + 1;.  
afd0: 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
afe0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f    for(i=0; i<pTo
aff0: 43 6f 6c 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  Col->nId; i++){.
b000: 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73        nByte += s
b010: 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b  trlen(pToCol->a[
b020: 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
b030: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
b040: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
b050: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
b060: 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20  pFKey==0 ) goto 
b070: 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d  fk_end;.  pFKey-
b080: 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46  >pFrom = p;.  pF
b090: 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d  Key->pNextFrom =
b0a0: 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d   p->pFKey;.  z =
b0b0: 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31   (char*)&pFKey[1
b0c0: 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  ];.  pFKey->aCol
b0d0: 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d   = (struct sColM
b0e0: 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69  ap*)z;.  z += si
b0f0: 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c  zeof(struct sCol
b100: 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b  Map)*nCol;.  pFK
b110: 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d  ey->zTo = z;.  m
b120: 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c  emcpy(z, pTo->z,
b130: 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54   pTo->n);.  z[pT
b140: 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b  o->n] = 0;.  z +
b150: 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46  = pTo->n+1;.  pF
b160: 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30  Key->pNextTo = 0
b170: 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20  ;.  pFKey->nCol 
b180: 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46  = nCol;.  if( pF
b190: 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
b1a0: 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e   pFKey->aCol[0].
b1b0: 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  iFrom = p->nCol-
b1c0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
b1d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
b1e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
b1f0: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
b200: 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b  0; j<p->nCol; j+
b210: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
b220: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70 2d  sqliteStrICmp(p-
b230: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[j].zName, 
b240: 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
b250: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
b260: 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
b270: 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a  l[i].iFrom = j;.
b280: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b290: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b2a0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d   }.      if( j>=
b2b0: 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  p->nCol ){.     
b2c0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
b2d0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
b2e0: 4d 73 67 2c 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f  Msg, "unknown co
b2f0: 6c 75 6d 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20  lumn \"", .     
b300: 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61       pFromCol->a
b310: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 22 5c 22 20 69  [i].zName, "\" i
b320: 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  n foreign key de
b330: 66 69 6e 69 74 69 6f 6e 22 2c 20 28 63 68 61 72  finition", (char
b340: 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50  *)0);.        pP
b350: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
b360: 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
b370: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
b380: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f  .  }.  if( pToCo
b390: 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
b3a0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
b3b0: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
b3c0: 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  rlen(pToCol->a[i
b3d0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
b3e0: 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  pFKey->aCol[i].z
b3f0: 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d  Col = z;.      m
b400: 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d  emcpy(z, pToCol-
b410: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b  >a[i].zName, n);
b420: 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b  .      z[n] = 0;
b430: 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b  .      z += n+1;
b440: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
b450: 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
b460: 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c   0;.  pFKey->del
b470: 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20  eteConf = flags 
b480: 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d  & 0xff;.  pFKey-
b490: 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66  >updateConf = (f
b4a0: 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78  lags >> 8 ) & 0x
b4b0: 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73  ff;.  pFKey->ins
b4c0: 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73  ertConf = (flags
b4d0: 20 3e 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b   >> 16 ) & 0xff;
b4e0: 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
b4f0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74  foreign key to t
b500: 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20  he table as the 
b510: 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a  last step..  */.
b520: 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b    p->pFKey = pFK
b530: 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b  ey;.  pFKey = 0;
b540: 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69  ..fk_end:.  sqli
b550: 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20  teFree(pFKey);. 
b560: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c   sqliteIdListDel
b570: 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20  ete(pFromCol);. 
b580: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c   sqliteIdListDel
b590: 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a  ete(pToCol);.}..
b5a0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
b5b0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
b5c0: 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49  n an INITIALLY I
b5d0: 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54  MMEDIATE or INIT
b5e0: 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a  IALLY DEFERRED.*
b5f0: 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e  * clause is seen
b600: 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f   as part of a fo
b610: 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
b620: 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66  tion.  The isDef
b630: 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74  erred.** paramet
b640: 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54  er is 1 for INIT
b650: 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61  IALLY DEFERRED a
b660: 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c  nd 0 for INITIAL
b670: 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a  LY IMMEDIATE..**
b680: 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   The behavior of
b690: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
b6a0: 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69  ly created forei
b6b0: 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74  gn key is adjust
b6c0: 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c  ed.** accordingl
b6d0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
b6e0: 65 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  eDeferForeignKey
b6f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
b700: 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b  int isDeferred){
b710: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
b720: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20    FKey *pFKey;. 
b730: 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61   if( (pTab = pPa
b740: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
b750: 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70  =0 || (pFKey = p
b760: 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29  Tab->pFKey)==0 )
b770: 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79   return;.  pFKey
b780: 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 69  ->isDeferred = i
b790: 73 44 65 66 65 72 72 65 64 3b 0a 7d 0a 0a 2f 2a  sDeferred;.}../*
b7a0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
b7b0: 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51   index for an SQ
b7c0: 4c 20 74 61 62 6c 65 2e 20 20 70 49 6e 64 65 78  L table.  pIndex
b7d0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
b7e0: 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e  the index .** an
b7f0: 64 20 70 54 61 62 6c 65 20 69 73 20 74 68 65 20  d pTable is the 
b800: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
b810: 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
b820: 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77  indexed.  Both w
b830: 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20  ill .** be NULL 
b840: 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65  for a primary ke
b850: 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68  y or an index th
b860: 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f  at is created to
b870: 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e   satisfy a.** UN
b880: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
b890: 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20    If pTable and 
b8a0: 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c  pIndex are NULL,
b8b0: 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   use pParse->pNe
b8c0: 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65  wTable.** as the
b8d0: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
b8e0: 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70  exed.  pParse->p
b8f0: 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61  NewTable is a ta
b900: 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63  ble that is.** c
b910: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
b920: 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20  onstructed by a 
b930: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
b940: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  tement..**.** pL
b950: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
b960: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
b970: 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77  ndexed.  pList w
b980: 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74  ill be NULL if t
b990: 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d  his.** is a prim
b9a0: 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75  ary key or uniqu
b9b0: 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e-constraint on 
b9c0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
b9d0: 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20  column added.** 
b9e0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
b9f0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
ba00: 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a  struction.  .*/.
ba10: 76 6f 69 64 20 73 71 6c 69 74 65 43 72 65 61 74  void sqliteCreat
ba20: 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  eIndex(.  Parse 
ba30: 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 41 6c  *pParse,   /* Al
ba40: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  l information ab
ba50: 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a  out this parse *
ba60: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
ba70: 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ,    /* Name of 
ba80: 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 79 20  the index.  May 
ba90: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63  be NULL */.  Src
baa0: 4c 69 73 74 20 2a 70 54 61 62 6c 65 2c 20 2f 2a  List *pTable, /*
bab0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
bac0: 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 20 55 73  le to index.  Us
bad0: 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
bae0: 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 49 64  ble if 0 */.  Id
baf0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
bb00: 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  * A list of colu
bb10: 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
bb20: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
bb30: 6f 72 2c 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62  or,     /* OE_Ab
bb40: 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  ort, OE_Ignore, 
bb50: 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f  OE_Replace, or O
bb60: 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65  E_None */.  Toke
bb70: 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20  n *pStart,   /* 
bb80: 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
bb90: 20 74 68 61 74 20 62 65 67 69 6e 73 20 61 20 43   that begins a C
bba0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
bbb0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ement */.  Token
bbc0: 20 2a 70 45 6e 64 20 20 20 20 20 20 2f 2a 20 54   *pEnd      /* T
bbd0: 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73  he ")" that clos
bbe0: 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49 4e  es the CREATE IN
bbf0: 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  DEX statement */
bc00: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
bc10: 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  b;     /* Table 
bc20: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
bc30: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
bc40: 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78  ;   /* The index
bc50: 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a   to be created *
bc60: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  /.  char *zName 
bc70: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  = 0;.  int i, j;
bc80: 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b  .  Token nullId;
bc90: 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65      /* Fake toke
bca0: 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49  n for an empty I
bcb0: 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46 69  D list */.  DbFi
bcc0: 78 65 72 20 73 46 69 78 3b 20 20 20 20 2f 2a 20  xer sFix;    /* 
bcd0: 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61  For assigning da
bce0: 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20  tabase names to 
bcf0: 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  pTable */.  int 
bd00: 69 73 54 65 6d 70 3b 20 20 20 20 20 20 2f 2a 20  isTemp;      /* 
bd10: 54 72 75 65 20 66 6f 72 20 61 20 74 65 6d 70 6f  True for a tempo
bd20: 72 61 72 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20  rary index */.  
bd30: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
bd40: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
bd50: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
bd60: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
bd70: 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74  iled ) goto exit
bd80: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
bd90: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69   if( pParse->ini
bda0: 74 46 6c 61 67 20 0a 20 20 20 20 20 26 26 20 73  tFlag .     && s
bdb0: 71 6c 69 74 65 46 69 78 49 6e 69 74 28 26 73 46  qliteFixInit(&sF
bdc0: 69 78 2c 20 70 50 61 72 73 65 2c 20 70 50 61 72  ix, pParse, pPar
bdd0: 73 65 2d 3e 69 44 62 2c 20 22 69 6e 64 65 78 22  se->iDb, "index"
bde0: 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20 20 26 26  , pName).     &&
bdf0: 20 73 71 6c 69 74 65 46 69 78 53 72 63 4c 69 73   sqliteFixSrcLis
be00: 74 28 26 73 46 69 78 2c 20 70 54 61 62 6c 65 29  t(&sFix, pTable)
be10: 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  .  ){.    goto e
be20: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
be30: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
be40: 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   Find the table 
be50: 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
be60: 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65  dexed.  Return e
be70: 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e  arly if not foun
be80: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  d..  */.  if( pT
be90: 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 61  able!=0 ){.    a
bea0: 73 73 65 72 74 28 20 70 4e 61 6d 65 21 3d 30 20  ssert( pName!=0 
beb0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
bec0: 54 61 62 6c 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  Table->nSrc==1 )
bed0: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20 73 71  ;.    pTab =  sq
bee0: 6c 69 74 65 53 72 63 4c 69 73 74 4c 6f 6f 6b 75  liteSrcListLooku
bef0: 70 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  p(pParse, pTable
bf00: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
bf10: 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30  assert( pName==0
bf20: 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20   );.    pTab =  
bf30: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
bf40: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61  e;.  }.  if( pTa
bf50: 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  b==0 || pParse->
bf60: 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74  nErr ) goto exit
bf70: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
bf80: 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f   if( pTab->readO
bf90: 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nly ){.    sqlit
bfa0: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
bfb0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61  se->zErrMsg, "ta
bfc0: 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  ble ", pTab->zNa
bfd0: 6d 65 2c 0a 20 20 20 20 20 20 22 20 6d 61 79 20  me,.      " may 
bfe0: 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c  not be indexed",
bff0: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
c000: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
c010: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
c020: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
c030: 20 20 69 66 28 20 70 54 61 62 2d 3e 69 44 62 3e    if( pTab->iDb>
c040: 3d 32 20 26 26 20 70 50 61 72 73 65 2d 3e 69 6e  =2 && pParse->in
c050: 69 74 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20  itFlag==0 ){.   
c060: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
c070: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
c080: 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61  g, "table ", pTa
c090: 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  b->zName, .     
c0a0: 20 22 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20   " may not have 
c0b0: 69 6e 64 69 63 65 73 20 61 64 64 65 64 22 2c 20  indices added", 
c0c0: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 70  (char*)0);.    p
c0d0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
c0e0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
c0f0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
c100: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
c110: 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
c120: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
c130: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 76 69 65  e->zErrMsg, "vie
c140: 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  ws may not be in
c150: 64 65 78 65 64 22 2c 20 28 63 68 61 72 2a 29 30  dexed", (char*)0
c160: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
c170: 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  Err++;.    goto 
c180: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
c190: 78 3b 0a 20 20 7d 0a 20 20 69 73 54 65 6d 70 20  x;.  }.  isTemp 
c1a0: 3d 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31 3b 0a  = pTab->iDb==1;.
c1b0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
c1c0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
c1d0: 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72  index.  Make sur
c1e0: 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61  e there is not a
c1f0: 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20  lready another. 
c200: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
c210: 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  le with the same
c220: 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20   name.  .  **.  
c230: 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49  ** Exception:  I
c240: 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  f we are reading
c250: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65   the names of pe
c260: 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20  rmanent indices 
c270: 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71  from the.  ** sq
c280: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
c290: 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20  e (because some 
c2a0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68  other process ch
c2b0: 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61  anged the schema
c2c0: 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f  ) and.  ** one o
c2d0: 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  f the index name
c2e0: 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20  s collides with 
c2f0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65  the name of a te
c300: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
c310: 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65  .  ** index, the
c320: 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  n we will contin
c330: 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ue to process th
c340: 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20  is index..  **. 
c350: 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20   ** If pName==0 
c360: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
c370: 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e   are.  ** dealin
c380: 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79  g with a primary
c390: 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63   key or UNIQUE c
c3a0: 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68  onstraint.  We h
c3b0: 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75  ave to invent ou
c3c0: 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e  r.  ** own name.
c3d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d  .  */.  if( pNam
c3e0: 65 20 26 26 20 21 70 50 61 72 73 65 2d 3e 69 6e  e && !pParse->in
c3f0: 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 49 6e  itFlag ){.    In
c400: 64 65 78 20 2a 70 49 53 61 6d 65 4e 61 6d 65 3b  dex *pISameName;
c410: 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 69      /* Another i
c420: 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 73 61  ndex with the sa
c430: 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54  me name */.    T
c440: 61 62 6c 65 20 2a 70 54 53 61 6d 65 4e 61 6d 65  able *pTSameName
c450: 3b 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20  ;    /* A table 
c460: 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65 20 61  with same name a
c470: 73 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  s the index */. 
c480: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
c490: 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e  eStrNDup(pName->
c4a0: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
c4b0: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
c4c0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
c4d0: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  e_index;.    if(
c4e0: 20 28 70 49 53 61 6d 65 4e 61 6d 65 20 3d 20 73   (pISameName = s
c4f0: 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64  qliteFindIndex(d
c500: 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30  b, zName, 0))!=0
c510: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c520: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
c530: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 69 6e 64  e->zErrMsg, "ind
c540: 65 78 20 22 2c 20 7a 4e 61 6d 65 2c 20 0a 20 20  ex ", zName, .  
c550: 20 20 20 20 20 20 20 22 20 61 6c 72 65 61 64 79         " already
c560: 20 65 78 69 73 74 73 22 2c 20 28 63 68 61 72 2a   exists", (char*
c570: 29 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  )0);.      pPars
c580: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
c590: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
c5a0: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
c5b0: 20 20 20 69 66 28 20 28 70 54 53 61 6d 65 4e 61     if( (pTSameNa
c5c0: 6d 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54  me = sqliteFindT
c5d0: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
c5e0: 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  0))!=0 ){.      
c5f0: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
c600: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
c610: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
c620: 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65  ady a table name
c630: 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 4e  d ",.         zN
c640: 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
c650: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
c660: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f  rr++;.      goto
c670: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
c680: 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ex;.    }.  }els
c690: 65 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30 20 29  e if( pName==0 )
c6a0: 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
c6b0: 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  30];.    int n;.
c6c0: 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70      Index *pLoop
c6d0: 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ;.    for(pLoop=
c6e0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d  pTab->pIndex, n=
c6f0: 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  1; pLoop; pLoop=
c700: 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b  pLoop->pNext, n+
c710: 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e 74 66  +){}.    sprintf
c720: 28 7a 42 75 66 2c 22 25 64 29 22 2c 6e 29 3b 0a  (zBuf,"%d)",n);.
c730: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
c740: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
c750: 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 28 22 2c 20  ng(&zName, "(", 
c760: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 20 61  pTab->zName, " a
c770: 75 74 6f 69 6e 64 65 78 20 22 2c 20 7a 42 75 66  utoindex ", zBuf
c780: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
c790: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
c7a0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
c7b0: 5f 69 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b  _index;.  }else{
c7c0: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
c7d0: 69 74 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65  iteStrNDup(pName
c7e0: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a  ->z, pName->n);.
c7f0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
c800: 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  for authorizatio
c810: 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69  n to create an i
c820: 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  ndex..  */.#ifnd
c830: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
c840: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
c850: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
c860: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70  *zDb = db->aDb[p
c870: 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b  Tab->iDb].zName;
c880: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ..    assert( pT
c890: 61 62 2d 3e 69 44 62 3d 3d 70 50 61 72 73 65 2d  ab->iDb==pParse-
c8a0: 3e 69 44 62 20 7c 7c 20 69 73 54 65 6d 70 20 29  >iDb || isTemp )
c8b0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
c8c0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
c8d0: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
c8e0: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73   SCHEMA_TABLE(is
c8f0: 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29  Temp), 0, zDb) )
c900: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
c910: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
c920: 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51      }.    i = SQ
c930: 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
c940: 58 3b 0a 20 20 20 20 69 66 28 20 69 73 54 65 6d  X;.    if( isTem
c950: 70 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43  p ) i = SQLITE_C
c960: 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
c970: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
c980: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
c990: 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62  , i, zName, pTab
c9a0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
c9b0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
c9c0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
c9d0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
c9e0: 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d  .  /* If pList==
c9f0: 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  0, it means this
ca00: 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
ca10: 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72  led to make a pr
ca20: 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f  imary.  ** key o
ca30: 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63  ut of the last c
ca40: 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74  olumn added to t
ca50: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
ca60: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a  onstruction..  *
ca70: 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61  * So create a fa
ca80: 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c  ke list to simul
ca90: 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20  ate this..  */. 
caa0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
cab0: 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20  .    nullId.z = 
cac0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
cad0: 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a  >nCol-1].zName;.
cae0: 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73      nullId.n = s
caf0: 74 72 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b  trlen(nullId.z);
cb00: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
cb10: 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e 64 28  iteIdListAppend(
cb20: 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20  0, &nullId);.   
cb30: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
cb40: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
cb50: 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
cb60: 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  * .  ** Allocate
cb70: 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63   the index struc
cb80: 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49  ture. .  */.  pI
cb90: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c  ndex = sqliteMal
cba0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 6e 64 65  loc( sizeof(Inde
cbb0: 78 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  x) + strlen(zNam
cbc0: 65 29 20 2b 20 31 20 2b 0a 20 20 20 20 20 20 20  e) + 1 +.       
cbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbe0: 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 70 4c 69   sizeof(int)*pLi
cbf0: 73 74 2d 3e 6e 49 64 20 29 3b 0a 20 20 69 66 28  st->nId );.  if(
cc00: 20 70 49 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74   pIndex==0 ) got
cc10: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
cc20: 64 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  dex;.  pIndex->a
cc30: 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29  iColumn = (int*)
cc40: 26 70 49 6e 64 65 78 5b 31 5d 3b 0a 20 20 70 49  &pIndex[1];.  pI
cc50: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63  ndex->zName = (c
cc60: 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69  har*)&pIndex->ai
cc70: 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 49  Column[pList->nI
cc80: 64 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 49 6e  d];.  strcpy(pIn
cc90: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  dex->zName, zNam
cca0: 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54  e);.  pIndex->pT
ccb0: 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70  able = pTab;.  p
ccc0: 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d  Index->nColumn =
ccd0: 20 70 4c 69 73 74 2d 3e 6e 49 64 3b 0a 20 20 70   pList->nId;.  p
cce0: 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d  Index->onError =
ccf0: 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64   onError;.  pInd
cd00: 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20  ex->autoIndex = 
cd10: 70 4e 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64  pName==0;.  pInd
cd20: 65 78 2d 3e 69 44 62 20 3d 20 69 73 54 65 6d 70  ex->iDb = isTemp
cd30: 20 3f 20 31 20 3a 20 70 50 61 72 73 65 2d 3e 69   ? 1 : pParse->i
cd40: 44 62 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74  Db;..  /* Scan t
cd50: 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
cd60: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74  columns of the t
cd70: 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
cd80: 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64  ed and.  ** load
cd90: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69   the column indi
cda0: 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64  ces into the Ind
cdb0: 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  ex structure.  R
cdc0: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20  eport an error. 
cdd0: 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d   ** if any colum
cde0: 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  n is not found..
cdf0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
ce00: 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
ce10: 2b 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  +){.    for(j=0;
ce20: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
ce30: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
ce40: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c 69  qliteStrICmp(pLi
ce50: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
ce60: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
ce70: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
ce80: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
ce90: 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  >=pTab->nCol ){.
cea0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
ceb0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
cec0: 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22  ErrMsg, "table "
ced0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a  , pTab->zName, .
cee0: 20 20 20 20 20 20 20 20 22 20 68 61 73 20 6e 6f          " has no
cef0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 22 2c   column named ",
cf00: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
cf10: 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  me, (char*)0);. 
cf20: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
cf30: 72 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r++;.      sqlit
cf40: 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20  eFree(pIndex);. 
cf50: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
cf60: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
cf70: 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61   }.    pIndex->a
cf80: 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a  iColumn[i] = j;.
cf90: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74    }..  /* Link t
cfa0: 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72  he new Index str
cfb0: 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61  ucture to its ta
cfc0: 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f  ble and to the o
cfd0: 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d  ther.  ** in-mem
cfe0: 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72  ory database str
cff0: 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20  uctures. .  */. 
d000: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78   if( !pParse->ex
d010: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 49 6e 64  plain ){.    Ind
d020: 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73  ex *p;.    p = s
d030: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
d040: 26 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d  &db->aDb[pIndex-
d050: 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 0a  >iDb].idxHash, .
d060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d070: 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d           pIndex-
d080: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
d090: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c  Index->zName)+1,
d0a0: 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66   pIndex);.    if
d0b0: 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ( p ){.      ass
d0c0: 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29  ert( p==pIndex )
d0d0: 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
d0e0: 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f  t have failed */
d0f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
d100: 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  e(pIndex);.     
d110: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
d120: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
d130: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
d140: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
d150: 6e 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nges;.  }..  /* 
d160: 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69  When adding an i
d170: 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74  ndex to the list
d180: 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20   of indices for 
d190: 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20  a table, make.  
d1a0: 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69  ** sure all indi
d1b0: 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52  ces labeled OE_R
d1c0: 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65  eplace come afte
d1d0: 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65  r all those labe
d1e0: 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f  led.  ** OE_Igno
d1f0: 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  re.  This is nec
d200: 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63  essary for the c
d210: 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
d220: 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20   of UPDATE.  ** 
d230: 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f  and INSERT..  */
d240: 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d  .  if( onError!=
d250: 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54  OE_Replace || pT
d260: 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20  ab->pIndex==0.  
d270: 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49       || pTab->pI
d280: 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
d290: 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20  E_Replace){.    
d2a0: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
d2b0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
d2c0: 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d    pTab->pIndex =
d2d0: 20 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65   pIndex;.  }else
d2e0: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74  {.    Index *pOt
d2f0: 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  her = pTab->pInd
d300: 65 78 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  ex;.    while( p
d310: 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20  Other->pNext && 
d320: 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f  pOther->pNext->o
d330: 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
d340: 63 65 20 29 7b 0a 20 20 20 20 20 20 70 4f 74 68  ce ){.      pOth
d350: 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  er = pOther->pNe
d360: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  xt;.    }.    pI
d370: 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f  ndex->pNext = pO
d380: 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
d390: 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d   pOther->pNext =
d3a0: 20 70 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20   pIndex;.  }..  
d3b0: 2f 2a 20 49 66 20 74 68 65 20 69 6e 69 74 46 6c  /* If the initFl
d3c0: 61 67 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73  ag is 1 it means
d3d0: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
d3e0: 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a  the SQL off the.
d3f0: 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73    ** "sqlite_mas
d400: 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68  ter" table on th
d410: 65 20 64 69 73 6b 2e 20 20 53 6f 20 64 6f 20 6e  e disk.  So do n
d420: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
d430: 64 69 73 6b 0a 20 20 2a 2a 20 61 67 61 69 6e 2e  disk.  ** again.
d440: 20 20 45 78 74 72 61 63 74 20 74 68 65 20 74 61    Extract the ta
d450: 62 6c 65 20 6e 75 6d 62 65 72 20 66 72 6f 6d 20  ble number from 
d460: 74 68 65 20 70 50 61 72 73 65 2d 3e 6e 65 77 54  the pParse->newT
d470: 6e 75 6d 20 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a  num field..  */.
d480: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e    if( pParse->in
d490: 69 74 46 6c 61 67 20 26 26 20 70 54 61 62 6c 65  itFlag && pTable
d4a0: 21 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 64 65  !=0 ){.    pInde
d4b0: 78 2d 3e 74 6e 75 6d 20 3d 20 70 50 61 72 73 65  x->tnum = pParse
d4c0: 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a  ->newTnum;.  }..
d4d0: 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69 74    /* If the init
d4e0: 46 6c 61 67 20 69 73 20 30 20 74 68 65 6e 20 63  Flag is 0 then c
d4f0: 72 65 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  reate the index 
d500: 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20  on disk.  This. 
d510: 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69   ** involves wri
d520: 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69  ting the index i
d530: 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74  nto the master t
d540: 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67  able and filling
d550: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64   in the.  ** ind
d560: 65 78 20 77 69 74 68 20 74 68 65 20 63 75 72 72  ex with the curr
d570: 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e  ent table conten
d580: 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ts..  **.  ** Th
d590: 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 30 20  e initFlag is 0 
d5a0: 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 66 69  when the user fi
d5b0: 72 73 74 20 65 6e 74 65 72 73 20 61 20 43 52 45  rst enters a CRE
d5c0: 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20  ATE INDEX .  ** 
d5d0: 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 65 20 69 6e  command.  The in
d5e0: 69 74 46 6c 61 67 20 69 73 20 31 20 77 68 65 6e  itFlag is 1 when
d5f0: 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20 6f   a database is o
d600: 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20  pened and .  ** 
d610: 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
d620: 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64  tements are read
d630: 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74   out of the mast
d640: 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20  er table.  In.  
d650: 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63 61  ** the latter ca
d660: 73 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72  se the index alr
d670: 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64  eady exists on d
d680: 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68  isk, which is wh
d690: 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20  y.  ** we don't 
d6a0: 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65  want to recreate
d6b0: 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   it..  **.  ** I
d6c0: 66 20 70 54 61 62 6c 65 3d 3d 30 20 69 74 20 6d  f pTable==0 it m
d6d0: 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20  eans this index 
d6e0: 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20  is generated as 
d6f0: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20  a primary key.  
d700: 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ** or UNIQUE con
d710: 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45  straint of a CRE
d720: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
d730: 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20  ent.  Since the 
d740: 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a  table.  ** has j
d750: 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64  ust been created
d760: 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  , it contains no
d770: 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e   data and the in
d780: 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  dex initializati
d790: 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e  on.  ** step can
d7a0: 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a   be skipped..  *
d7b0: 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 50 61  /.  else if( pPa
d7c0: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 3d 3d 30  rse->initFlag==0
d7d0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20   ){.    int n;. 
d7e0: 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
d7f0: 69 6e 74 20 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a  int lbl1, lbl2;.
d800: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
d810: 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 76 20  nt addr;..    v 
d820: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
d830: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
d840: 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69   v==0 ) goto exi
d850: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
d860: 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d      if( pTable!=
d870: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
d880: 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  eBeginWriteOpera
d890: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
d8a0: 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73  isTemp);.      s
d8b0: 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54  qliteOpenMasterT
d8c0: 61 62 6c 65 28 76 2c 20 69 73 54 65 6d 70 29 3b  able(v, isTemp);
d8d0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
d8e0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
d8f0: 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29  _NewRecno, 0, 0)
d900: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
d910: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
d920: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ng, 0, 0);.    s
d930: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
d940: 33 28 76 2c 20 2d 31 2c 20 22 69 6e 64 65 78 22  3(v, -1, "index"
d950: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
d960: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
d970: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
d980: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
d990: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
d9a0: 20 2d 31 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61   -1, pIndex->zNa
d9b0: 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65  me, strlen(pInde
d9c0: 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
d9d0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
d9e0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
d9f0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
da00: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
da10: 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  1, pTab->zName, 
da20: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
da30: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62  addr = sqliteVdb
da40: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65  eAddOp(v, OP_Cre
da50: 61 74 65 49 6e 64 65 78 2c 20 30 2c 20 69 73 54  ateIndex, 0, isT
da60: 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  emp);.    sqlite
da70: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
da80: 61 64 64 72 2c 20 28 63 68 61 72 2a 29 26 70 49  addr, (char*)&pI
da90: 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50  ndex->tnum, P3_P
daa0: 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 70 49 6e  OINTER);.    pIn
dab0: 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20  dex->tnum = 0;. 
dac0: 20 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b     if( pTable ){
dad0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
dae0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
daf0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
db00: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
db10: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 73  , OP_Integer, is
db20: 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  Temp, 0);.      
db30: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
db40: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
db50: 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 0);.    }.  
db60: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56    addr = sqliteV
db70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
db80: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
db90: 20 20 69 66 28 20 70 53 74 61 72 74 20 26 26 20    if( pStart && 
dba0: 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 6e 20  pEnd ){.      n 
dbb0: 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20  = Addr(pEnd->z) 
dbc0: 2d 20 41 64 64 72 28 70 53 74 61 72 74 2d 3e 7a  - Addr(pStart->z
dbd0: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  ) + 1;.      sql
dbe0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
dbf0: 76 2c 20 61 64 64 72 2c 20 70 53 74 61 72 74 2d  v, addr, pStart-
dc00: 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  >z, n);.    }.  
dc10: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
dc20: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
dc30: 72 64 2c 20 35 2c 20 30 29 3b 0a 20 20 20 20 73  rd, 5, 0);.    s
dc40: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
dc50: 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20  , OP_PutIntKey, 
dc60: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
dc70: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73  Table ){.      s
dc80: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
dc90: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54  , OP_Integer, pT
dca0: 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20  ab->iDb, 0);.   
dcb0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
dcc0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  Op(v, OP_OpenRea
dcd0: 64 2c 20 32 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  d, 2, pTab->tnum
dce0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
dcf0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
dd00: 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  1, pTab->zName, 
dd10: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
dd20: 20 20 6c 62 6c 32 20 3d 20 73 71 6c 69 74 65 56    lbl2 = sqliteV
dd30: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
dd40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
dd50: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
dd60: 69 6e 64 2c 20 32 2c 20 6c 62 6c 32 29 3b 0a 20  ind, 2, lbl2);. 
dd70: 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69       lbl1 = sqli
dd80: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
dd90: 50 5f 52 65 63 6e 6f 2c 20 32 2c 20 30 29 3b 0a  P_Recno, 2, 0);.
dda0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
ddb0: 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  <pIndex->nColumn
ddc0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
ddd0: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49 6e 64 65  int iCol = pInde
dde0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  x->aiColumn[i];.
ddf0: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
de00: 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 29 7b  ->iPKey==iCol ){
de10: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
de20: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
de30: 5f 44 75 70 2c 20 69 2c 20 30 29 3b 0a 20 20 20  _Dup, i, 0);.   
de40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
de50: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
de60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
de70: 6d 6e 2c 20 32 2c 20 69 43 6f 6c 29 3b 0a 20 20  mn, 2, iCol);.  
de80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
de90: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
dea0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
deb0: 49 64 78 4b 65 79 2c 20 70 49 6e 64 65 78 2d 3e  IdxKey, pIndex->
dec0: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
ded0: 20 20 20 69 66 28 20 64 62 2d 3e 66 69 6c 65 5f     if( db->file_
dee0: 66 6f 72 6d 61 74 3e 3d 34 20 29 20 73 71 6c 69  format>=4 ) sqli
def0: 74 65 41 64 64 49 64 78 4b 65 79 54 79 70 65 28  teAddIdxKeyType(
df00: 76 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  v, pIndex);.    
df10: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
df20: 70 28 76 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20  p(v, OP_IdxPut, 
df30: 31 2c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  1, pIndex->onErr
df40: 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 3b 0a 20 20  or!=OE_None);.  
df50: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
df60: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 69  angeP3(v, -1, "i
df70: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61  ndexed columns a
df80: 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20  re not unique", 
df90: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
dfa0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
dfb0: 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 32 2c  p(v, OP_Next, 2,
dfc0: 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 73 71   lbl1);.      sq
dfd0: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
dfe0: 61 62 65 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a 20  abel(v, lbl2);. 
dff0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
e000: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
e010: 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 2, 0);.      s
e020: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
e030: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30  , OP_Close, 1, 0
e040: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
e050: 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20   pTable!=0 ){.  
e060: 20 20 20 20 69 66 28 20 21 69 73 54 65 6d 70 20      if( !isTemp 
e070: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
e080: 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  eChangeCookie(db
e090: 2c 20 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , v);.      }.  
e0a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
e0b0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
e0c0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
e0d0: 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
e0e0: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
e0f0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
e100: 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65  lean up before e
e110: 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63  xiting */.exit_c
e120: 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 73  reate_index:.  s
e130: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
e140: 65 28 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  e(pList);.  sqli
e150: 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  teSrcListDelete(
e160: 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  pTable);.  sqlit
e170: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
e180: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
e190: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
e1a0: 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74  ll drop an exist
e1b0: 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e  ing named index.
e1c0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
e1d0: 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  * implements the
e1e0: 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74   DROP INDEX stat
e1f0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
e200: 71 6c 69 74 65 44 72 6f 70 49 6e 64 65 78 28 50  qliteDropIndex(P
e210: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
e220: 63 4c 69 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20  cList *pName){. 
e230: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
e240: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
e250: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
e260: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61  ->db;..  if( pPa
e270: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
e280: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
e290: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  d ) return;.  as
e2a0: 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
e2b0: 63 3d 3d 31 20 29 3b 0a 20 20 70 49 6e 64 65 78  c==1 );.  pIndex
e2c0: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64   = sqliteFindInd
e2d0: 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b  ex(db, pName->a[
e2e0: 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  0].zName, pName-
e2f0: 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
e300: 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d  ;.  if( pIndex==
e310: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45  0 ){.    sqliteE
e320: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
e330: 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
e340: 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a  %S", pName, 0);.
e350: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
e360: 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
e370: 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f  if( pIndex->auto
e380: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c  Index ){.    sql
e390: 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72  iteErrorMsg(pPar
e3a0: 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63  se, "index assoc
e3b0: 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55  iated with UNIQU
e3c0: 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52  E ".      "or PR
e3d0: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
e3e0: 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64  aint cannot be d
e3f0: 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20  ropped", 0);.   
e400: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
e410: 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
e420: 20 70 49 6e 64 65 78 2d 3e 69 44 62 3e 31 20 29   pIndex->iDb>1 )
e430: 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f  {.    sqliteErro
e440: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61  rMsg(pParse, "ca
e450: 6e 6e 6f 74 20 61 6c 74 65 72 20 73 63 68 65 6d  nnot alter schem
e460: 61 20 6f 66 20 61 74 74 61 63 68 65 64 20 22 0a  a of attached ".
e470: 20 20 20 20 20 20 20 22 64 61 74 61 62 61 73 65         "database
e480: 73 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f  s", 0);.    goto
e490: 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
e4a0: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
e4b0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
e4c0: 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
e4d0: 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  int code = SQLIT
e4e0: 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20  E_DROP_INDEX;.  
e4f0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
e500: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a  pIndex->pTable;.
e510: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e520: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 49  zDb = db->aDb[pI
e530: 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65  ndex->iDb].zName
e540: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
e550: 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
e560: 54 41 42 4c 45 28 70 49 6e 64 65 78 2d 3e 69 44  TABLE(pIndex->iD
e570: 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  b);.    if( sqli
e580: 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  teAuthCheck(pPar
e590: 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
e5a0: 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
e5b0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
e5c0: 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
e5d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
e5e0: 6e 64 65 78 2d 3e 69 44 62 20 29 20 63 6f 64 65  ndex->iDb ) code
e5f0: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
e600: 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
e610: 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65  f( sqliteAuthChe
e620: 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
e630: 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
e640: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
e650: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
e660: 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
e670: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
e680: 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
e690: 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
e6a0: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72  the index and fr
e6b0: 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
e6c0: 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ble */.  v = sql
e6d0: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
e6e0: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
e6f0: 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
e700: 20 64 72 6f 70 49 6e 64 65 78 5b 5d 20 3d 20 7b   dropIndex[] = {
e710: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69  .      { OP_Rewi
e720: 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28  nd,     0, ADDR(
e730: 39 29 2c 20 30 7d 2c 20 0a 20 20 20 20 20 20 7b  9), 0}, .      {
e740: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20   OP_String,     
e750: 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  0, 0,       0}, 
e760: 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 1 */.      { 
e770: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31  OP_MemStore,   1
e780: 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 1,       0},. 
e790: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61       { OP_MemLoa
e7a0: 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  d,    1, 0,     
e7b0: 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20    0}, /* 3 */.  
e7c0: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
e7d0: 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20       0, 1,      
e7e0: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
e7f0: 45 71 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41  Eq,         0, A
e800: 44 44 52 28 38 29 2c 20 30 7d 2c 0a 20 20 20 20  DDR(8), 0},.    
e810: 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20    { OP_Next,    
e820: 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20 30     0, ADDR(3), 0
e830: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f  },.      { OP_Go
e840: 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44  to,       0, ADD
e850: 52 28 39 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20  R(9), 0},.      
e860: 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20  { OP_Delete,    
e870: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   0, 0,       0},
e880: 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 7d 3b 0a   /* 8 */.    };.
e890: 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a 0a 20      int base;.. 
e8a0: 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72     sqliteBeginWr
e8b0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
e8c0: 72 73 65 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  rse, 0, pIndex->
e8d0: 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
e8e0: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
e8f0: 76 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b  v, pIndex->iDb);
e900: 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69  .    base = sqli
e910: 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
e920: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f  v, ArraySize(dro
e930: 70 49 6e 64 65 78 29 2c 20 64 72 6f 70 49 6e 64  pIndex), dropInd
e940: 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  ex);.    sqliteV
e950: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62  dbeChangeP3(v, b
e960: 61 73 65 2b 31 2c 20 70 49 6e 64 65 78 2d 3e 7a  ase+1, pIndex->z
e970: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Name, 0);.    if
e980: 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 30  ( pIndex->iDb==0
e990: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e9a0: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
e9b0: 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   v);.    }.    s
e9c0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
e9d0: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30  , OP_Close, 0, 0
e9e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
e9f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73  eAddOp(v, OP_Des
ea00: 74 72 6f 79 2c 20 70 49 6e 64 65 78 2d 3e 74 6e  troy, pIndex->tn
ea10: 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29  um, pIndex->iDb)
ea20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57  ;.    sqliteEndW
ea30: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
ea40: 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arse);.  }..  /*
ea50: 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d   Delete the in-m
ea60: 65 6d 6f 72 79 20 64 65 73 63 72 69 70 74 69 6f  emory descriptio
ea70: 6e 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78 2e  n of this index.
ea80: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
ea90: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
eaa0: 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b      sqliteUnlink
eab0: 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64  AndDeleteIndex(d
eac0: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  b, pIndex);.    
ead0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
eae0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
eaf0: 73 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  s;.  }..exit_dro
eb00: 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74  p_index:.  sqlit
eb10: 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  eSrcListDelete(p
eb20: 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
eb30: 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65  Append a new ele
eb40: 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65  ment to the give
eb50: 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74  n IdList.  Creat
eb60: 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69  e a new IdList i
eb70: 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a  f.** need be..**
eb80: 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74  .** A new IdList
eb90: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
eba0: 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
ebb0: 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69  ) fails..*/.IdLi
ebc0: 73 74 20 2a 73 71 6c 69 74 65 49 64 4c 69 73 74  st *sqliteIdList
ebd0: 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a 70  Append(IdList *p
ebe0: 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
ebf0: 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ken){.  if( pLis
ec00: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
ec10: 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
ec20: 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29  ( sizeof(IdList)
ec30: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
ec40: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
ec50: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
ec60: 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  oc = 0;.  }.  if
ec70: 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3e 3d 70 4c  ( pList->nId>=pL
ec80: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  ist->nAlloc ){. 
ec90: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
eca0: 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 70 4c  _item *a;.    pL
ecb0: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4c  ist->nAlloc = pL
ecc0: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  ist->nAlloc*2 + 
ecd0: 35 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  5;.    a = sqlit
ece0: 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e  eRealloc(pList->
ecf0: 61 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  a, pList->nAlloc
ed00: 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61  *sizeof(pList->a
ed10: 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
ed20: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  a==0 ){.      sq
ed30: 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65  liteIdListDelete
ed40: 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72  (pList);.      r
ed50: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
ed60: 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b     pList->a = a;
ed70: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70  .  }.  memset(&p
ed80: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
ed90: 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  Id], 0, sizeof(p
eda0: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
edb0: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
edc0: 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70    char **pz = &p
edd0: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
ede0: 49 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73  Id].zName;.    s
edf0: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
ee00: 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70  pz, pToken->z, p
ee10: 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20  Token->n, 0);.  
ee20: 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a    if( *pz==0 ){.
ee30: 20 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c 69        sqliteIdLi
ee40: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
ee50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
ee60: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ee70: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
ee80: 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  *pz);.    }.  }.
ee90: 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a    pList->nId++;.
eea0: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
eeb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
eec0: 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  a new table name
eed0: 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72   to the given Sr
eee0: 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  cList.  Create a
eef0: 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a   new SrcList if.
ef00: 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e  ** need be.  A n
ef10: 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65 61  ew entry is crea
ef20: 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69  ted in the SrcLi
ef30: 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b 65  st even if pToke
ef40: 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n is NULL..**.**
ef50: 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   A new SrcList i
ef60: 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
ef70: 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  ULL if malloc() 
ef80: 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  fails..**.** If 
ef90: 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74  pDatabase is not
efa0: 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20   null, it means 
efb0: 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68  that the table h
efc0: 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a  as an optional.*
efd0: 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * database name 
efe0: 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68  prefix.  Like th
eff0: 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74  is:  "database.t
f000: 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74  able".  The pDat
f010: 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20  abase.** points 
f020: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  to the table nam
f030: 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65  e and the pTable
f040: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64   points to the d
f050: 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a  atabase name..**
f060: 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d   The SrcList.a[]
f070: 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20  .zName field is 
f080: 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
f090: 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68  table name which
f0a0: 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66   might.** come f
f0b0: 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70  rom pTable (if p
f0c0: 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c  Database is NULL
f0d0: 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62  ) or from pDatab
f0e0: 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73  ase.  .** SrcLis
f0f0: 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20  t.a[].zDatabase 
f100: 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
f110: 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
f120: 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a   from pTable,.**
f130: 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66   or with NULL if
f140: 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20   no database is 
f150: 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
f160: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
f170: 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68   if call like th
f180: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
f190: 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41    sqliteSrcListA
f1a0: 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a  ppend(A,B,0);.**
f1b0: 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20  .** Then B is a 
f1c0: 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
f1d0: 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
f1e0: 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e   is unspecified.
f1f0: 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c    If called.** l
f200: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
f210: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 72          sqliteSr
f220: 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c  cListAppend(A,B,
f230: 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43  C);.**.** Then C
f240: 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61   is the table na
f250: 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20  me and B is the 
f260: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
f270: 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
f280: 65 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 53  eSrcListAppend(S
f290: 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  rcList *pList, T
f2a0: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f  oken *pTable, To
f2b0: 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 29 7b  ken *pDatabase){
f2c0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
f2d0: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
f2e0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
f2f0: 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a  eof(SrcList) );.
f300: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
f310: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
f320: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
f330: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   1;.  }.  if( pL
f340: 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73 74  ist->nSrc>=pList
f350: 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
f360: 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
f370: 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
f380: 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65 77 20   *= 2;.    pNew 
f390: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
f3a0: 70 4c 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pList,.         
f3b0: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c        sizeof(*pL
f3c0: 69 73 74 29 20 2b 20 28 70 4c 69 73 74 2d 3e 6e  ist) + (pList->n
f3d0: 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28  Alloc-1)*sizeof(
f3e0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a  pList->a[0]) );.
f3f0: 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
f400: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
f410: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  rcListDelete(pLi
f420: 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
f430: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
f440: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
f450: 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74  .  memset(&pList
f460: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d  ->a[pList->nSrc]
f470: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73  , 0, sizeof(pLis
f480: 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28  t->a[0]));.  if(
f490: 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44   pDatabase && pD
f4a0: 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b  atabase->z==0 ){
f4b0: 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
f4c0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44   0;.  }.  if( pD
f4d0: 61 74 61 62 61 73 65 20 26 26 20 70 54 61 62 6c  atabase && pTabl
f4e0: 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a  e ){.    Token *
f4f0: 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73  pTemp = pDatabas
f500: 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  e;.    pDatabase
f510: 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70   = pTable;.    p
f520: 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20  Table = pTemp;. 
f530: 20 7d 0a 20 20 69 66 28 20 70 54 61 62 6c 65 20   }.  if( pTable 
f540: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a  ){.    char **pz
f550: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
f560: 73 74 2d 3e 6e 53 72 63 5d 2e 7a 4e 61 6d 65 3b  st->nSrc].zName;
f570: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53  .    sqliteSetNS
f580: 74 72 69 6e 67 28 70 7a 2c 20 70 54 61 62 6c 65  tring(pz, pTable
f590: 2d 3e 7a 2c 20 70 54 61 62 6c 65 2d 3e 6e 2c 20  ->z, pTable->n, 
f5a0: 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d  0);.    if( *pz=
f5b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
f5c0: 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  teSrcListDelete(
f5d0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
f5e0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73  turn 0;.    }els
f5f0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44  e{.      sqliteD
f600: 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20  equote(*pz);.   
f610: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61   }.  }.  if( pDa
f620: 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20 63 68  tabase ){.    ch
f630: 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74  ar **pz = &pList
f640: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d  ->a[pList->nSrc]
f650: 2e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20  .zDatabase;.    
f660: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
f670: 28 70 7a 2c 20 70 44 61 74 61 62 61 73 65 2d 3e  (pz, pDatabase->
f680: 7a 2c 20 70 44 61 74 61 62 61 73 65 2d 3e 6e 2c  z, pDatabase->n,
f690: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a   0);.    if( *pz
f6a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
f6b0: 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65  iteSrcListDelete
f6c0: 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72  (pList);.      r
f6d0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c  eturn 0;.    }el
f6e0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
f6f0: 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20  Dequote(*pz);.  
f700: 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d    }.  }.  pList-
f710: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e  >a[pList->nSrc].
f720: 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  iCursor = -1;.  
f730: 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20  pList->nSrc++;. 
f740: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
f750: 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63  ../*.** Assign c
f760: 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61  ursors to all ta
f770: 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73  bles in a SrcLis
f780: 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
f790: 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
f7a0: 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  sors(Parse *pPar
f7b0: 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  se, SrcList *pLi
f7c0: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
f7d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
f7e0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
f7f0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
f800: 5d 2e 69 43 75 72 73 6f 72 3c 30 20 29 7b 0a 20  ].iCursor<0 ){. 
f810: 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d       pList->a[i]
f820: 2e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  .iCursor = pPars
f830: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d  e->nTab++;.    }
f840: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
f850: 64 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68  d an alias to th
f860: 65 20 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65  e last identifie
f870: 72 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69  r on the given i
f880: 64 65 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a  dentifier list..
f890: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 72  */.void sqliteSr
f8a0: 63 4c 69 73 74 41 64 64 41 6c 69 61 73 28 53 72  cListAddAlias(Sr
f8b0: 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  cList *pList, To
f8c0: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
f8d0: 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69  if( pList && pLi
f8e0: 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20  st->nSrc>0 ){.  
f8f0: 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d    int i = pList-
f900: 3e 6e 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 73  >nSrc - 1;.    s
f910: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
f920: 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  &pList->a[i].zAl
f930: 69 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  ias, pToken->z, 
f940: 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20  pToken->n, 0);. 
f950: 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65     sqliteDequote
f960: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  (pList->a[i].zAl
f970: 69 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ias);.  }.}../*.
f980: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c  ** Delete an IdL
f990: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
f9a0: 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28  iteIdListDelete(
f9b0: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  IdList *pList){.
f9c0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
f9d0: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
f9e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
f9f0: 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
fa00: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
fa10: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
fa20: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
fa30: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a  Free(pList->a);.
fa40: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
fa50: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
fa60: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
fa70: 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69  n pList of the i
fa80: 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20  dentifier named 
fa90: 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  zId.  Return -1.
faa0: 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ** if not found.
fab0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 49 64  .*/.int sqliteId
fac0: 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74  ListIndex(IdList
fad0: 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63   *pList, const c
fae0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
faf0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
fb00: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31  t==0 ) return -1
fb10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
fb20: 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
fb30: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53  .    if( sqliteS
fb40: 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
fb50: 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  i].zName, zName)
fb60: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
fb70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
fb80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
fb90: 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69   an entire SrcLi
fba0: 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c  st including all
fbb0: 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
fbc0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
fbd0: 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53  eSrcListDelete(S
fbe0: 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
fbf0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
fc00: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
fc10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
fc20: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
fc30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
fc40: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 44 61  (pList->a[i].zDa
fc50: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c  tabase);.    sql
fc60: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
fc70: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
fc80: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
fc90: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a  ->a[i].zAlias);.
fca0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
fcb0: 5b 69 5d 2e 70 54 61 62 20 26 26 20 70 4c 69 73  [i].pTab && pLis
fcc0: 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d 3e 69 73  t->a[i].pTab->is
fcd0: 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20  Transient ){.   
fce0: 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54     sqliteDeleteT
fcf0: 61 62 6c 65 28 30 2c 20 70 4c 69 73 74 2d 3e 61  able(0, pList->a
fd00: 5b 69 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20 7d  [i].pTab);.    }
fd10: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63  .    sqliteSelec
fd20: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61  tDelete(pList->a
fd30: 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  [i].pSelect);.  
fd40: 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65    sqliteExprDele
fd50: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  te(pList->a[i].p
fd60: 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 49  On);.    sqliteI
fd70: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  dListDelete(pLis
fd80: 74 2d 3e 61 5b 69 5d 2e 70 55 73 69 6e 67 29 3b  t->a[i].pUsing);
fd90: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
fda0: 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pList);.}../*.
fdb0: 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73  ** Begin a trans
fdc0: 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
fdd0: 71 6c 69 74 65 42 65 67 69 6e 54 72 61 6e 73 61  qliteBeginTransa
fde0: 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
fdf0: 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72  rse, int onError
fe00: 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b  ){.  sqlite *db;
fe10: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
fe20: 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
fe30: 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  >db)==0 || db->a
fe40: 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
fe50: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
fe60: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
fe70: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
fe80: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
fe90: 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63  ( sqliteAuthChec
fea0: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
feb0: 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42  _TRANSACTION, "B
fec0: 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 20 72  EGIN", 0, 0) ) r
fed0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d  eturn;.  if( db-
fee0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
fef0: 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 73  InTrans ){.    s
ff00: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
ff10: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 73 74  arse, "cannot st
ff20: 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
ff30: 6e 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  n within a trans
ff40: 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65  action");.    re
ff50: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
ff60: 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  teBeginWriteOper
ff70: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
ff80: 20 30 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73   0);.  db->flags
ff90: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 54 72 61   |= SQLITE_InTra
ffa0: 6e 73 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f  ns;.  db->onErro
ffb0: 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a  r = onError;.}..
ffc0: 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74  /*.** Commit a t
ffd0: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
ffe0: 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74 54  id sqliteCommitT
fff0: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
10000 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
10010 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  ite *db;..  if( 
10020 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
10030 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
10040 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
10050 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
10060 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
10070 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c  r || sqlite_mall
10080 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
10090 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
100a0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
100b0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
100c0 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  TION, "COMMIT", 
100d0 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
100e0 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
100f0 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e   & SQLITE_InTran
10100 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  s)==0 ){.    sql
10110 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72  iteErrorMsg(pPar
10120 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d  se, "cannot comm
10130 69 74 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74  it - no transact
10140 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 29 3b  ion is active");
10150 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
10160 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
10170 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b  ~SQLITE_InTrans;
10180 0a 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74  .  sqliteEndWrit
10190 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
101a0 65 29 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f  e);.  db->onErro
101b0 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a  r = OE_Default;.
101c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
101d0 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  k a transaction.
101e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 52 6f  */.void sqliteRo
101f0 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f  llbackTransactio
10200 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
10210 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a  {.  sqlite *db;.
10220 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66    Vdbe *v;..  if
10230 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
10240 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
10250 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  0 || db->aDb[0].
10260 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBt==0 ) return;
10270 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
10280 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
10290 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
102a0 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
102b0 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  teAuthCheck(pPar
102c0 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
102d0 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43  ACTION, "ROLLBAC
102e0 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75  K", 0, 0) ) retu
102f0 72 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66  rn;.  if( (db->f
10300 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
10310 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20  Trans)==0 ){.   
10320 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28   sqliteErrorMsg(
10330 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
10340 72 6f 6c 6c 62 61 63 6b 20 2d 20 6e 6f 20 74 72  rollback - no tr
10350 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
10360 69 76 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ive");.    retur
10370 6e 3b 20 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  n; .  }.  v = sq
10380 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
10390 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
103a0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
103b0 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 6c 6c 62 61  dOp(v, OP_Rollba
103c0 63 6b 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  ck, 0, 0);.  }. 
103d0 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
103e0 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20  QLITE_InTrans;. 
103f0 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f   db->onError = O
10400 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a  E_Default;.}../*
10410 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
10420 45 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  E code that will
10430 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
10440 6d 61 20 63 6f 6f 6b 69 65 20 66 6f 72 20 61 6c  ma cookie for al
10450 6c 0a 2a 2a 20 6e 61 6d 65 64 20 64 61 74 61 62  l.** named datab
10460 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 76 6f  ase files..*/.vo
10470 69 64 20 73 71 6c 69 74 65 43 6f 64 65 56 65 72  id sqliteCodeVer
10480 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20  ifySchema(Parse 
10490 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
104a0 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  ){.  sqlite *db 
104b0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
104c0 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
104d0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
104e0 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
104f0 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
10500 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
10510 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d  ->aDb[iDb].pBt!=
10520 30 20 29 3b 0a 20 20 69 66 28 20 69 44 62 21 3d  0 );.  if( iDb!=
10530 31 20 26 26 20 21 44 62 48 61 73 50 72 6f 70 65  1 && !DbHasPrope
10540 72 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f  rty(db, iDb, DB_
10550 43 6f 6f 6b 69 65 29 20 29 7b 0a 20 20 20 20 73  Cookie) ){.    s
10560 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
10570 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69  , OP_VerifyCooki
10580 65 2c 20 69 44 62 2c 20 64 62 2d 3e 61 44 62 5b  e, iDb, db->aDb[
10590 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b  iDb].schema_cook
105a0 69 65 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72  ie);.    DbSetPr
105b0 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20  operty(db, iDb, 
105c0 44 42 5f 43 6f 6f 6b 69 65 29 3b 0a 20 20 7d 0a  DB_Cookie);.  }.
105d0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
105e0 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
105f0 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f   prepares for do
10600 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  ing an operation
10610 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63   that.** might c
10620 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61  hange the databa
10630 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
10640 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20  outine starts a 
10650 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
10660 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c  if we are not al
10670 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20  ready within.** 
10680 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  a transaction.  
10690 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  If we are alread
106a0 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  y within a trans
106b0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63  action, then a c
106c0 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20  heckpoint.** is 
106d0 73 65 74 20 69 66 20 74 68 65 20 73 65 74 43 68  set if the setCh
106e0 65 63 6b 70 6f 69 6e 74 20 70 61 72 61 6d 65 74  eckpoint paramet
106f0 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63  er is true.  A c
10700 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
10710 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f  .** be set for o
10720 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d  perations that m
10730 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74  ight fail (due t
10740 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  o a constraint) 
10750 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77  part of.** the w
10760 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77  ay through and w
10770 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74  hich will need t
10780 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74  o undo some writ
10790 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  es without havin
107a0 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  g to.** rollback
107b0 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
107c0 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65  action.  For ope
107d0 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c  rations where al
107e0 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  l constraints.**
107f0 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20   can be checked 
10800 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
10810 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74  es are made to t
10820 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
10830 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65  is never.** nece
10840 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20  ssary to undo a 
10850 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68  write and the ch
10860 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  eckpoint should 
10870 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a  not be set..**.*
10880 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  * Only database 
10890 69 44 62 20 61 6e 64 20 74 68 65 20 74 65 6d 70  iDb and the temp
108a0 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61   database are ma
108b0 64 65 20 77 72 69 74 61 62 6c 65 20 62 79 20 74  de writable by t
108c0 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20  his call..** If 
108d0 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  iDb==0, then the
108e0 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70 20 64   main and temp d
108f0 61 74 61 62 61 73 65 73 20 61 72 65 20 6d 61 64  atabases are mad
10900 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20 49 66  e writable.   If
10910 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e 20  .** iDb==1 then 
10920 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20 64 61  only the temp da
10930 74 61 62 61 73 65 20 69 73 20 6d 61 64 65 20 77  tabase is made w
10940 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69 44 62  ritable.  If iDb
10950 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73  >1 then the.** s
10960 70 65 63 69 66 69 65 64 20 61 75 78 69 6c 69 61  pecified auxilia
10970 72 79 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ry database and 
10980 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
10990 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  e are made writa
109a0 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
109b0 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65  iteBeginWriteOpe
109c0 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  ration(Parse *pP
109d0 61 72 73 65 2c 20 69 6e 74 20 73 65 74 43 68 65  arse, int setChe
109e0 63 6b 70 6f 69 6e 74 2c 20 69 6e 74 20 69 44 62  ckpoint, int iDb
109f0 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
10a00 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
10a10 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 44  rse->db;.  if( D
10a20 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
10a30 20 69 44 62 2c 20 44 42 5f 4c 6f 63 6b 65 64 29   iDb, DB_Locked)
10a40 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 20 3d   ) return;.  v =
10a50 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
10a60 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
10a70 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
10a80 66 28 20 21 64 62 2d 3e 61 44 62 5b 69 44 62 5d  f( !db->aDb[iDb]
10a90 2e 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20  .inTrans ){.    
10aa0 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
10ab0 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
10ac0 6e 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20  n, iDb, 0);.    
10ad0 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64 62  DbSetProperty(db
10ae0 2c 20 69 44 62 2c 20 44 42 5f 4c 6f 63 6b 65 64  , iDb, DB_Locked
10af0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 43 6f 64  );.    sqliteCod
10b00 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
10b10 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
10b20 69 66 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20  if( iDb!=1 ){.  
10b30 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57      sqliteBeginW
10b40 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
10b50 61 72 73 65 2c 20 73 65 74 43 68 65 63 6b 70 6f  arse, setCheckpo
10b60 69 6e 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  int, 1);.    }. 
10b70 20 7d 65 6c 73 65 20 69 66 28 20 73 65 74 43 68   }else if( setCh
10b80 65 63 6b 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  eckpoint ){.    
10b90 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
10ba0 76 2c 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74  v, OP_Checkpoint
10bb0 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 44  , iDb, 0);.    D
10bc0 62 53 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c  bSetProperty(db,
10bd0 20 69 44 62 2c 20 44 42 5f 4c 6f 63 6b 65 64 29   iDb, DB_Locked)
10be0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
10bf0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
10c00 74 20 63 6f 6e 63 6c 75 64 65 73 20 61 6e 20 6f  t concludes an o
10c10 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20 6d 61  peration that ma
10c20 79 20 68 61 76 65 20 63 68 61 6e 67 65 64 0a 2a  y have changed.*
10c30 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  * the database. 
10c40 20 49 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   If a statement 
10c50 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
10c60 73 74 61 72 74 65 64 2c 20 74 68 65 6e 20 65 6d  started, then em
10c70 69 74 0a 2a 2a 20 61 6e 20 4f 50 5f 43 6f 6d 6d  it.** an OP_Comm
10c80 69 74 20 74 68 61 74 20 77 69 6c 6c 20 63 61 75  it that will cau
10c90 73 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 74  se the changes t
10ca0 6f 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 74  o be committed t
10cb0 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  o disk..**.** No
10cc0 74 65 20 74 68 61 74 20 63 68 65 63 6b 70 6f 69  te that checkpoi
10cd0 6e 74 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69  nts are automati
10ce0 63 61 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 20  cally committed 
10cf0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a  at the end of.**
10d00 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4e   a statement.  N
10d10 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 74 68  ote also that th
10d20 65 72 65 20 63 61 6e 20 62 65 20 6d 75 6c 74 69  ere can be multi
10d30 70 6c 65 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a  ple calls to .**
10d40 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74   sqliteBeginWrit
10d50 65 4f 70 65 72 61 74 69 6f 6e 28 29 20 62 75 74  eOperation() but
10d60 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 6f 6e   there should on
10d70 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65 0a 2a  ly be a single.*
10d80 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  * call to sqlite
10d90 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
10da0 6e 28 29 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  n() at the concl
10db0 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61  usion of the sta
10dc0 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
10dd0 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70  sqliteEndWriteOp
10de0 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
10df0 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
10e00 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  v;.  sqlite *db 
10e10 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
10e20 69 66 28 20 70 50 61 72 73 65 2d 3e 74 72 69 67  if( pParse->trig
10e30 53 74 61 63 6b 20 29 20 72 65 74 75 72 6e 3b 20  Stack ) return; 
10e40 2f 2a 20 69 66 20 74 68 69 73 20 69 73 20 69 6e  /* if this is in
10e50 20 61 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20   a trigger */.  
10e60 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
10e70 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
10e80 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
10e90 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
10ea0 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  & SQLITE_InTrans
10eb0 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 42 45 47   ){.    /* A BEG
10ec0 49 4e 20 68 61 73 20 65 78 65 63 75 74 65 64 2e  IN has executed.
10ed0 20 20 44 6f 20 6e 6f 74 20 63 6f 6d 6d 69 74 20    Do not commit 
10ee0 75 6e 74 69 6c 20 77 65 20 73 65 65 20 61 6e 20  until we see an 
10ef0 65 78 70 6c 69 63 69 74 0a 20 20 20 20 2a 2a 20  explicit.    ** 
10f00 43 4f 4d 4d 49 54 20 73 74 61 74 65 6d 65 6e 74  COMMIT statement
10f10 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  . */.  }else{.  
10f20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
10f30 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20  p(v, OP_Commit, 
10f40 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a           0, 0);.  }.}.