/ Hex Artifact Content
Login

Artifact 95dfb188f448e6299108396546a8333ecdcb1716:


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 35 33 20 32 30 30 33 2f 30 35 2f 31 37 20 31  153 2003/05/17 1
0300: 37 3a 33 35 3a 31 31 20 64 72 68 20 45 78 70 20  7:35:11 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 7d 0a  e);.    }.  }.}.
0600: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
0610: 20 66 61 6b 65 20 63 61 6c 6c 62 61 63 6b 20 70   fake callback p
0620: 72 6f 63 65 64 75 72 65 20 75 73 65 64 20 77 68  rocedure used wh
0630: 65 6e 20 73 71 6c 69 74 65 5f 65 78 65 63 28 29  en sqlite_exec()
0640: 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 77   is.** invoked w
0650: 69 74 68 20 61 20 4e 55 4c 4c 20 63 61 6c 6c 62  ith a NULL callb
0660: 61 63 6b 20 70 6f 69 6e 74 65 72 2e 20 20 49 66  ack pointer.  If
0670: 20 77 65 20 70 61 73 73 20 61 20 4e 55 4c 4c 20   we pass a NULL 
0680: 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 70 6f 69 6e  callback.** poin
0690: 74 65 72 20 69 6e 74 6f 20 73 71 6c 69 74 65 56  ter into sqliteV
06a0: 64 62 65 45 78 65 63 28 29 20 69 74 20 77 69 6c  dbeExec() it wil
06b0: 6c 20 72 65 74 75 72 6e 20 61 74 20 65 76 65 72  l return at ever
06c0: 79 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 0a 2a  y OP_Callback,.*
06d0: 2a 20 77 68 69 63 68 20 77 65 20 64 6f 20 6e 6f  * which we do no
06e0: 74 20 77 61 6e 74 20 69 74 20 74 6f 20 64 6f 2e  t want it to do.
06f0: 20 20 53 6f 20 77 65 20 73 75 62 73 74 69 74 75    So we substitu
0700: 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  te a pointer to 
0710: 74 68 69 73 0a 2a 2a 20 70 72 6f 63 65 64 75 72  this.** procedur
0720: 65 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68  e in place of th
0730: 65 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  e NULL..*/.stati
0740: 63 20 69 6e 74 20 66 61 6b 65 43 61 6c 6c 62 61  c int fakeCallba
0750: 63 6b 28 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  ck(void *NotUsed
0760: 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 2a  , int n, char **
0770: 61 7a 31 2c 20 63 68 61 72 20 2a 2a 61 7a 32 29  az1, char **az2)
0780: 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  {.  return 0;.}.
0790: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
07a0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
07b0: 74 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c  ter a single SQL
07c0: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
07d0: 65 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e  een.** parsed an
07e0: 64 20 77 65 20 77 61 6e 74 20 74 6f 20 65 78 65  d we want to exe
07f0: 63 75 74 65 20 74 68 65 20 56 44 42 45 20 63 6f  cute the VDBE co
0800: 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  de to implement 
0810: 0a 2a 2a 20 74 68 61 74 20 73 74 61 74 65 6d 65  .** that stateme
0820: 6e 74 2e 20 20 50 72 69 6f 72 20 61 63 74 69 6f  nt.  Prior actio
0830: 6e 20 72 6f 75 74 69 6e 65 73 20 73 68 6f 75 6c  n routines shoul
0840: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a  d have already.*
0850: 2a 20 63 6f 6e 73 74 72 75 63 74 65 64 20 56 44  * constructed VD
0860: 42 45 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68  BE code to do th
0870: 65 20 77 6f 72 6b 20 6f 66 20 74 68 65 20 53 51  e work of the SQ
0880: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  L statement..** 
0890: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
08a0: 74 20 68 61 73 20 74 6f 20 65 78 65 63 75 74 65  t has to execute
08b0: 20 74 68 65 20 56 44 42 45 20 63 6f 64 65 2e 0a   the VDBE code..
08c0: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
08d0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
08e0: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
08f0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0900: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0910: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0920: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 65  /.void sqliteExe
0930: 63 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  c(Parse *pParse)
0940: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
0950: 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
0960: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
0970: 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  b;.  Vdbe *v = p
0980: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
0990: 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29  int (*xCallback)
09a0: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 2a  (void*,int,char*
09b0: 2a 2c 63 68 61 72 2a 2a 29 3b 0a 0a 20 20 69 66  *,char**);..  if
09c0: 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  ( sqlite_malloc_
09d0: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
09e0: 0a 20 20 78 43 61 6c 6c 62 61 63 6b 20 3d 20 70  .  xCallback = p
09f0: 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62 61 63 6b  Parse->xCallback
0a00: 3b 0a 20 20 69 66 28 20 78 43 61 6c 6c 62 61 63  ;.  if( xCallbac
0a10: 6b 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  k==0 && pParse->
0a20: 75 73 65 43 61 6c 6c 62 61 63 6b 20 29 20 78 43  useCallback ) xC
0a30: 61 6c 6c 62 61 63 6b 20 3d 20 66 61 6b 65 43 61  allback = fakeCa
0a40: 6c 6c 62 61 63 6b 3b 0a 20 20 69 66 28 20 76 20  llback;.  if( v 
0a50: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
0a60: 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a  =0 ){.    FILE *
0a70: 74 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61  trace = (db->fla
0a80: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
0a90: 54 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f  Trace)!=0 ? stdo
0aa0: 75 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69  ut : 0;.    sqli
0ab0: 74 65 56 64 62 65 54 72 61 63 65 28 76 2c 20 74  teVdbeTrace(v, t
0ac0: 72 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  race);.    sqlit
0ad0: 65 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76  eVdbeMakeReady(v
0ae0: 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20 70 50 61  , xCallback, pPa
0af0: 72 73 65 2d 3e 70 41 72 67 2c 20 70 50 61 72 73  rse->pArg, pPars
0b00: 65 2d 3e 65 78 70 6c 61 69 6e 29 3b 0a 20 20 20  e->explain);.   
0b10: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 75 73 65   if( pParse->use
0b20: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
0b30: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
0b40: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20  plain ){.       
0b50: 20 72 63 20 3d 20 73 71 6c 69 74 65 56 64 62 65   rc = sqliteVdbe
0b60: 4c 69 73 74 28 76 29 3b 0a 20 20 20 20 20 20 20  List(v);.       
0b70: 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65   db->next_cookie
0b80: 20 3d 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 63   = db->aDb[0].sc
0b90: 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20  hema_cookie;.   
0ba0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
0bb0: 20 20 73 71 6c 69 74 65 56 64 62 65 45 78 65 63    sqliteVdbeExec
0bc0: 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
0bd0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 56 64     rc = sqliteVd
0be0: 62 65 46 69 6e 61 6c 69 7a 65 28 76 2c 20 26 70  beFinalize(v, &p
0bf0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29 3b  Parse->zErrMsg);
0c00: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
0c10: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
0c20: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56        pParse->pV
0c30: 64 62 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  dbe = 0;.      p
0c40: 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a  Parse->rc = rc;.
0c50: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 70        if( rc ) p
0c60: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
0c70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
0c80: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 70 50 61  pParse->rc = pPa
0c90: 72 73 65 2d 3e 6e 45 72 72 20 3f 20 53 51 4c 49  rse->nErr ? SQLI
0ca0: 54 45 5f 45 52 52 4f 52 20 3a 20 53 51 4c 49 54  TE_ERROR : SQLIT
0cb0: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
0cc0: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
0cd0: 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  esSet = 0;.  }el
0ce0: 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 75  se if( pParse->u
0cf0: 73 65 43 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b  seCallback==0 ){
0d00: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
0d10: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
0d20: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54    }.  pParse->nT
0d30: 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ab = 0;.  pParse
0d40: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50  ->nMem = 0;.  pP
0d50: 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a  arse->nSet = 0;.
0d60: 20 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d    pParse->nAgg =
0d70: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63   0;.}../*.** Loc
0d80: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
0d90: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
0da0: 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61   describes .** a
0db0: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
0dc0: 62 61 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e  base table given
0dd0: 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
0de0: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
0df0: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
0e00: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
0e10: 62 61 73 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69  base.** containi
0e20: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
0e30: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
0e40: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53  t found..**.** S
0e50: 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 4c 6f  ee also sqliteLo
0e60: 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a  cateTable()..*/.
0e70: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 46 69 6e  Table *sqliteFin
0e80: 64 54 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64  dTable(sqlite *d
0e90: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
0ea0: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
0eb0: 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20   *zDatabase){.  
0ec0: 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20  Table *p = 0;.  
0ed0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
0ee0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
0ef0: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  ){.    int j = (
0f00: 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20  i<2) ? i^1 : i; 
0f10: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
0f20: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
0f30: 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73      if( zDatabas
0f40: 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 53 74  e!=0 && sqliteSt
0f50: 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c  rICmp(zDatabase,
0f60: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d   db->aDb[j].zNam
0f70: 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
0f80: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 48 61 73     p = sqliteHas
0f90: 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a  hFind(&db->aDb[j
0fa0: 5d 2e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65  ].tblHash, zName
0fb0: 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b  , strlen(zName)+
0fc0: 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20  1);.    if( p ) 
0fd0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
0fe0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
0ff0: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
1000: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
1010: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a  hat describes .*
1020: 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  * a particular d
1030: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 67 69  atabase table gi
1040: 76 65 6e 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20  ven the name.** 
1050: 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e  of that table an
1060: 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74  d (optionally) t
1070: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
1080: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 74 61  atabase.** conta
1090: 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e  ining the table.
10a0: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
10b0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
10c0: 2a 20 49 66 20 70 50 61 72 73 65 2d 3e 75 73 65  * If pParse->use
10d0: 44 62 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69  Db is not negati
10e0: 76 65 2c 20 74 68 65 6e 20 74 68 65 20 74 61 62  ve, then the tab
10f0: 6c 65 20 6d 75 73 74 20 62 65 0a 2a 2a 20 6c 6f  le must be.** lo
1100: 63 61 74 65 64 20 69 6e 20 74 68 61 74 20 64 61  cated in that da
1110: 74 61 62 61 73 65 2e 20 20 49 66 20 61 20 64 69  tabase.  If a di
1120: 66 66 65 72 65 6e 74 20 64 61 74 61 62 61 73 65  fferent database
1130: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 0a 2a   is specified,.*
1140: 2a 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  * an error messa
1150: 67 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  ge is generated 
1160: 69 6e 74 6f 20 70 50 61 72 73 65 2d 3e 7a 45 72  into pParse->zEr
1170: 72 4d 73 67 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  rMsg..*/.Table *
1180: 73 71 6c 69 74 65 4c 6f 63 61 74 65 54 61 62 6c  sqliteLocateTabl
1190: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
11a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
11b0: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
11c0: 7a 44 62 61 73 65 29 7b 0a 20 20 73 71 6c 69 74  zDbase){.  sqlit
11d0: 65 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  e *db;.  const c
11e0: 68 61 72 20 2a 7a 55 73 65 3b 0a 20 20 54 61 62  har *zUse;.  Tab
11f0: 6c 65 20 2a 70 3b 0a 20 20 64 62 20 3d 20 70 50  le *p;.  db = pP
1200: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
1210: 70 50 61 72 73 65 2d 3e 75 73 65 44 62 3c 30 20  pParse->useDb<0 
1220: 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  ){.    p = sqlit
1230: 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  eFindTable(db, z
1240: 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20  Name, zDbase);. 
1250: 20 7d 65 6c 73 65 20 7b 0a 20 20 20 20 61 73 73   }else {.    ass
1260: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 75 73 65  ert( pParse->use
1270: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
1280: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
1290: 62 5b 70 50 61 72 73 65 2d 3e 75 73 65 44 62 5d  b[pParse->useDb]
12a0: 2e 70 42 74 21 3d 30 20 29 3b 0a 20 20 20 20 7a  .pBt!=0 );.    z
12b0: 55 73 65 20 3d 20 64 62 2d 3e 61 44 62 5b 70 50  Use = db->aDb[pP
12c0: 61 72 73 65 2d 3e 75 73 65 44 62 5d 2e 7a 4e 61  arse->useDb].zNa
12d0: 6d 65 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 61  me;.    if( zDba
12e0: 73 65 20 26 26 20 70 50 61 72 73 65 2d 3e 75 73  se && pParse->us
12f0: 65 44 62 21 3d 31 20 26 26 20 73 71 6c 69 74 65  eDb!=1 && sqlite
1300: 53 74 72 49 43 6d 70 28 7a 44 62 61 73 65 2c 20  StrICmp(zDbase, 
1310: 7a 55 73 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  zUse)!=0 ){.    
1320: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
1330: 28 70 50 61 72 73 65 2c 22 63 61 6e 6e 6f 74 20  (pParse,"cannot 
1340: 75 73 65 20 64 61 74 61 62 61 73 65 20 25 73 20  use database %s 
1350: 69 6e 20 74 68 69 73 20 63 6f 6e 74 65 78 74 22  in this context"
1360: 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 20 20 20  , zDbase);.     
1370: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1380: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 46  .    p = sqliteF
1390: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
13a0: 6d 65 2c 20 7a 55 73 65 29 3b 0a 20 20 20 20 69  me, zUse);.    i
13b0: 66 28 20 70 3d 3d 30 20 26 26 20 70 50 61 72 73  f( p==0 && pPars
13c0: 65 2d 3e 75 73 65 44 62 3d 3d 31 20 26 26 20 7a  e->useDb==1 && z
13d0: 44 62 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Dbase==0 ){.    
13e0: 20 20 70 20 3d 20 73 71 6c 69 74 65 46 69 6e 64    p = sqliteFind
13f0: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
1400: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
1410: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
1420: 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20   if( zDbase ){. 
1430: 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72       sqliteError
1440: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
1450: 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 2e 25  such table: %s.%
1460: 73 22 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d  s", zDbase, zNam
1470: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  e);.    }else if
1480: 28 20 28 70 50 61 72 73 65 2d 3e 75 73 65 44 62  ( (pParse->useDb
1490: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 75  ==0 || pParse->u
14a0: 73 65 44 62 3e 3d 32 29 20 0a 20 20 20 20 20 20  seDb>=2) .      
14b0: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
14c0: 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  teFindTable(db, 
14d0: 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a  zName, 0)!=0 ){.
14e0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f        sqliteErro
14f0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
1500: 62 6c 65 20 5c 22 25 73 5c 22 20 69 73 20 6e 6f  ble \"%s\" is no
1510: 74 20 69 6e 20 64 61 74 61 62 61 73 65 20 5c 22  t in database \"
1520: 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\"",.         
1530: 7a 4e 61 6d 65 2c 20 7a 55 73 65 29 3b 0a 20 20  zName, zUse);.  
1540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1550: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
1560: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
1570: 61 62 6c 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65  able: %s", zName
1580: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1590: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
15a0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
15b0: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
15c0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
15d0: 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72  .** a particular
15e0: 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65   index given the
15f0: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e   name of that in
1600: 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e  dex.** and the n
1610: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1620: 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ase that contain
1630: 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20  s the index..** 
1640: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
1650: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 49 6e 64  ot found..*/.Ind
1660: 65 78 20 2a 73 71 6c 69 74 65 46 69 6e 64 49 6e  ex *sqliteFindIn
1670: 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20  dex(sqlite *db, 
1680: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1690: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
16a0: 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20  Db){.  Index *p 
16b0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
16c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
16d0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  Db; i++){.    in
16e0: 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e  t j = (i<2) ? i^
16f0: 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63  1 : i;  /* Searc
1700: 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41  h TEMP before MA
1710: 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44  IN */.    if( zD
1720: 62 20 26 26 20 73 71 6c 69 74 65 53 74 72 49 43  b && sqliteStrIC
1730: 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b  mp(zDb, db->aDb[
1740: 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74  j].zName) ) cont
1750: 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71  inue;.    p = sq
1760: 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 64 62  liteHashFind(&db
1770: 2d 3e 61 44 62 5b 6a 5d 2e 69 64 78 48 61 73 68  ->aDb[j].idxHash
1780: 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  , zName, strlen(
1790: 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69  zName)+1);.    i
17a0: 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20  f( p ) break;.  
17b0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
17c0: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
17d0: 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72  e given index fr
17e0: 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  om the index has
17f0: 68 20 74 61 62 6c 65 2c 20 61 6e 64 20 66 72 65  h table, and fre
1800: 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20  e.** its memory 
1810: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a  structures..**.*
1820: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 72  * The index is r
1830: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
1840: 64 61 74 61 62 61 73 65 20 68 61 73 68 20 74 61  database hash ta
1850: 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69 74 20 69  bles but.** it i
1860: 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66  s not unlinked f
1870: 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 74 68  rom the Table th
1880: 61 74 20 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a  at it indexes..*
1890: 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d  * Unlinking from
18a0: 20 74 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20   the Table must 
18b0: 62 65 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63  be done by the c
18c0: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
18d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18e0: 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65  sqliteDeleteInde
18f0: 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e  x(sqlite *db, In
1900: 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78  dex *p){.  Index
1910: 20 2a 70 4f 6c 64 3b 0a 0a 20 20 61 73 73 65 72   *pOld;..  asser
1920: 74 28 20 64 62 21 3d 30 20 26 26 20 70 2d 3e 7a  t( db!=0 && p->z
1930: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 4f 6c  Name!=0 );.  pOl
1940: 64 20 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e  d = sqliteHashIn
1950: 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d  sert(&db->aDb[p-
1960: 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70  >iDb].idxHash, p
1970: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 20 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61     strlen(p->zNa
19a0: 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28  me)+1, 0);.  if(
19b0: 20 70 4f 6c 64 21 3d 30 20 26 26 20 70 4f 6c 64   pOld!=0 && pOld
19c0: 21 3d 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=p ){.    sqlit
19d0: 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  eHashInsert(&db-
19e0: 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78  >aDb[p->iDb].idx
19f0: 48 61 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d  Hash, pOld->zNam
1a00: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1a10: 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e 28 70          strlen(p
1a20: 4f 6c 64 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70  Old->zName)+1, p
1a30: 4f 6c 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Old);.  }.  sqli
1a40: 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a  teFree(p);.}../*
1a50: 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67  .** Unlink the g
1a60: 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20  iven index from 
1a70: 69 74 73 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  its table, then 
1a80: 72 65 6d 6f 76 65 0a 2a 2a 20 74 68 65 20 69 6e  remove.** the in
1a90: 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64  dex from the ind
1aa0: 65 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e  ex hash table an
1ab0: 64 20 66 72 65 65 20 69 74 73 20 6d 65 6d 6f 72  d free its memor
1ac0: 79 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 2e  y.** structures.
1ad0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 55  .*/.void sqliteU
1ae0: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e  nlinkAndDeleteIn
1af0: 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20  dex(sqlite *db, 
1b00: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a  Index *pIndex){.
1b10: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54    if( pIndex->pT
1b20: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49  able->pIndex==pI
1b30: 6e 64 65 78 20 29 7b 0a 20 20 20 20 70 49 6e 64  ndex ){.    pInd
1b40: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
1b50: 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  ex = pIndex->pNe
1b60: 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  xt;.  }else{.   
1b70: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 66   Index *p;.    f
1b80: 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61  or(p=pIndex->pTa
1b90: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26  ble->pIndex; p &
1ba0: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
1bb0: 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b  ex; p=p->pNext){
1bc0: 7d 0a 20 20 20 20 69 66 28 20 70 20 26 26 20 70  }.    if( p && p
1bd0: 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20  ->pNext==pIndex 
1be0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  ){.      p->pNex
1bf0: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
1c00: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  t;.    }.  }.  s
1c10: 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78  qliteDeleteIndex
1c20: 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 7d 0a  (db, pIndex);.}.
1c30: 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c  ./*.** Erase all
1c40: 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74   schema informat
1c50: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d  ion from the in-
1c60: 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c  memory hash tabl
1c70: 65 73 20 6f 66 0a 2a 2a 20 64 61 74 61 62 61 73  es of.** databas
1c80: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54  e connection.  T
1c90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1ca0: 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c 61 69 6d  alled to reclaim
1cb0: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f 72   memory.** befor
1cc0: 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
1cd0: 20 63 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20   closes.  It is 
1ce0: 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69  also called duri
1cf0: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  ng a rollback.**
1d00: 20 69 66 20 74 68 65 72 65 20 77 65 72 65 20 73   if there were s
1d10: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75  chema changes du
1d20: 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63  ring the transac
1d30: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  tion..**.** If i
1d40: 44 62 3c 3d 30 20 74 68 65 6e 20 72 65 73 65 74  Db<=0 then reset
1d50: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63   the internal sc
1d60: 68 65 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20  hema tables for 
1d70: 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  all database.** 
1d80: 66 69 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d  files.  If iDb>=
1d90: 32 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65  2 then reset the
1da0: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
1db0: 20 66 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a   for only the.**
1dc0: 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64   single file ind
1dd0: 69 63 61 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  icates..*/.void 
1de0: 73 71 6c 69 74 65 52 65 73 65 74 49 6e 74 65 72  sqliteResetInter
1df0: 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65  nalSchema(sqlite
1e00: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
1e10: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65    HashElem *pEle
1e20: 6d 3b 0a 20 20 48 61 73 68 20 74 65 6d 70 31 3b  m;.  Hash temp1;
1e30: 0a 20 20 48 61 73 68 20 74 65 6d 70 32 3b 0a 20  .  Hash temp2;. 
1e40: 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73   int i, j;..  as
1e50: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
1e60: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
1e70: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
1e80: 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65  QLITE_Initialize
1e90: 64 3b 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20  d;.  for(i=iDb; 
1ea0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
1eb0: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
1ec0: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
1ed0: 74 65 6d 70 31 20 3d 20 70 44 62 2d 3e 74 62 6c  temp1 = pDb->tbl
1ee0: 48 61 73 68 3b 0a 20 20 20 20 74 65 6d 70 32 20  Hash;.    temp2 
1ef0: 3d 20 70 44 62 2d 3e 74 72 69 67 48 61 73 68 3b  = pDb->trigHash;
1f00: 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73 68 49  .    sqliteHashI
1f10: 6e 69 74 28 26 70 44 62 2d 3e 74 72 69 67 48 61  nit(&pDb->trigHa
1f20: 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f  sh, SQLITE_HASH_
1f30: 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20  STRING, 0);.    
1f40: 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28  sqliteHashClear(
1f50: 26 70 44 62 2d 3e 61 46 4b 65 79 29 3b 0a 20 20  &pDb->aFKey);.  
1f60: 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61    sqliteHashClea
1f70: 72 28 26 70 44 62 2d 3e 69 64 78 48 61 73 68 29  r(&pDb->idxHash)
1f80: 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d  ;.    for(pElem=
1f90: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
1fa0: 26 74 65 6d 70 32 29 3b 20 70 45 6c 65 6d 3b 20  &temp2); pElem; 
1fb0: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
1fc0: 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
1fd0: 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72      Trigger *pTr
1fe0: 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 48 61  igger = sqliteHa
1ff0: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
2000: 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74       sqliteDelet
2010: 65 54 72 69 67 67 65 72 28 70 54 72 69 67 67 65  eTrigger(pTrigge
2020: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
2030: 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28 26 74  liteHashClear(&t
2040: 65 6d 70 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  emp2);.    sqlit
2050: 65 48 61 73 68 49 6e 69 74 28 26 70 44 62 2d 3e  eHashInit(&pDb->
2060: 74 62 6c 48 61 73 68 2c 20 53 51 4c 49 54 45 5f  tblHash, SQLITE_
2070: 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b  HASH_STRING, 0);
2080: 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  .    for(pElem=s
2090: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
20a0: 74 65 6d 70 31 29 3b 20 70 45 6c 65 6d 3b 20 70  temp1); pElem; p
20b0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
20c0: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
20d0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
20e0: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
20f0: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 73 71  pElem);.      sq
2100: 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28  liteDeleteTable(
2110: 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d  db, pTab);.    }
2120: 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73 68 43  .    sqliteHashC
2130: 6c 65 61 72 28 26 74 65 6d 70 31 29 3b 0a 20 20  lear(&temp1);.  
2140: 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74    DbClearPropert
2150: 79 28 64 62 2c 20 69 2c 20 44 42 5f 53 63 68 65  y(db, i, DB_Sche
2160: 6d 61 4c 6f 61 64 65 64 29 3b 0a 20 20 20 20 69  maLoaded);.    i
2170: 66 28 20 69 44 62 3e 30 20 29 20 72 65 74 75 72  f( iDb>0 ) retur
2180: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
2190: 20 69 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d   iDb==0 );.  db-
21a0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
21b0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
21c0: 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72  ..  /* If one or
21d0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 61 75 78   more of the aux
21e0: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
21f0: 66 69 6c 65 73 20 68 61 73 20 62 65 65 6e 20 63  files has been c
2200: 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e  losed,.  ** then
2210: 20 72 65 6d 6f 76 65 20 74 68 65 6e 20 66 72 6f   remove then fro
2220: 6d 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  m the auxiliary 
2230: 64 61 74 61 62 61 73 65 20 6c 69 73 74 2e 20 20  database list.  
2240: 57 65 20 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a  We take the.  **
2250: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
2260: 64 6f 20 74 68 69 73 20 68 65 72 65 20 73 69 6e  do this here sin
2270: 63 65 20 77 65 20 68 61 76 65 20 6a 75 73 74 20  ce we have just 
2280: 64 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20 74  deleted all of t
2290: 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 68  he.  ** schema h
22a0: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74  ash tables and t
22b0: 68 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20  herefore do not 
22c0: 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79  have to make any
22d0: 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f   changes.  ** to
22e0: 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 74 61   any of those ta
22f0: 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  bles..  */.  for
2300: 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44  (i=j=2; i<db->nD
2310: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  b; i++){.    if(
2320: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d   db->aDb[i].pBt=
2330: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2340: 74 65 46 72 65 65 28 64 62 2d 3e 61 44 62 5b 69  teFree(db->aDb[i
2350: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
2360: 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65  db->aDb[i].zName
2370: 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = 0;.      cont
2380: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
2390: 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20  if( j<i ){.     
23a0: 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62   db->aDb[j] = db
23b0: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a  ->aDb[i];.    }.
23c0: 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d      j++;.  }.  m
23d0: 65 6d 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a  emset(&db->aDb[j
23e0: 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a  ], 0, (db->nDb-j
23f0: 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62  )*sizeof(db->aDb
2400: 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62  [j]));.  db->nDb
2410: 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e   = j;.  if( db->
2420: 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44  nDb<=2 && db->aD
2430: 62 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63  b!=db->aDbStatic
2440: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64   ){.    memcpy(d
2450: 62 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62  b->aDbStatic, db
2460: 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28  ->aDb, 2*sizeof(
2470: 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20  db->aDb[0]));.  
2480: 20 20 73 71 6c 69 74 65 46 72 65 65 28 64 62 2d    sqliteFree(db-
2490: 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61  >aDb);.    db->a
24a0: 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74  Db = db->aDbStat
24b0: 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ic;.  }.}../*.**
24c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
24d0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72   called whenever
24e0: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
24f0: 72 73 2e 20 20 49 66 20 74 68 65 72 65 20 77 65  rs.  If there we
2500: 72 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 68 61  re.** schema cha
2510: 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65 20  nges during the 
2520: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
2530: 6e 20 77 65 20 68 61 76 65 20 74 6f 20 72 65 73  n we have to res
2540: 65 74 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72 6e  et the.** intern
2550: 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 20 61  al hash tables a
2560: 6e 64 20 72 65 6c 6f 61 64 20 74 68 65 6d 20 66  nd reload them f
2570: 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f 69  rom disk..*/.voi
2580: 64 20 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63 6b  d sqliteRollback
2590: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
25a0: 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 69  sqlite *db){.  i
25b0: 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
25c0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
25d0: 67 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ges ){.    sqlit
25e0: 65 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  eResetInternalSc
25f0: 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d  hema(db, 0);.  }
2600: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2610: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2620: 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f   when a commit o
2630: 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ccurs..*/.void s
2640: 71 6c 69 74 65 43 6f 6d 6d 69 74 49 6e 74 65 72  qliteCommitInter
2650: 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74  nalChanges(sqlit
2660: 65 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 61 44  e *db){.  db->aD
2670: 62 5b 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b  b[0].schema_cook
2680: 69 65 20 3d 20 64 62 2d 3e 6e 65 78 74 5f 63 6f  ie = db->next_co
2690: 6f 6b 69 65 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  okie;.  db->flag
26a0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
26b0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
26c0: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
26d0: 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75  memory data stru
26e0: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
26f0: 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
2700: 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63  .** Table.  No c
2710: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
2720: 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20  to disk by this 
2730: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
2740: 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
2750: 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74   deletes the dat
2760: 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74  a structure.  It
2770: 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b   does not unlink
2780: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61  .** the table da
2790: 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ta structure fro
27a0: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
27b0: 2e 20 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72  .  Nor does it r
27c0: 65 6d 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e  emove.** foreign
27d0: 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73   keys from the s
27e0: 71 6c 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68  qlite.aFKey hash
27f0: 20 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20   table.  But it 
2800: 64 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20  does destroy.** 
2810: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
2820: 73 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73  s of the indices
2830: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
2840: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2850: 68 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e  h .** the table.
2860: 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61  .**.** Indices a
2870: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2880: 68 65 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c  he table are unl
2890: 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22  inked from the "
28a0: 64 62 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75  db".** data stru
28b0: 63 74 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c  cture if db!=NUL
28c0: 4c 2e 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c  L.  If db==NULL,
28d0: 20 69 6e 64 69 63 65 73 20 61 74 74 61 63 68 65   indices attache
28e0: 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d to.** the tabl
28f0: 65 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62  e are deleted, b
2900: 75 74 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  ut it is assumed
2910: 20 74 68 65 79 20 68 61 76 65 20 61 6c 72 65 61   they have alrea
2920: 64 79 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e  dy been.** unlin
2930: 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ked..*/.void sql
2940: 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 73  iteDeleteTable(s
2950: 71 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65  qlite *db, Table
2960: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74   *pTable){.  int
2970: 20 69 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   i;.  Index *pIn
2980: 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46  dex, *pNext;.  F
2990: 4b 65 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65  Key *pFKey, *pNe
29a0: 78 74 46 4b 65 79 3b 0a 0a 20 20 69 66 28 20 70  xtFKey;..  if( p
29b0: 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72  Table==0 ) retur
29c0: 6e 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  n;..  /* Delete 
29d0: 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f  all indices asso
29e0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
29f0: 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f   table.  */.  fo
2a00: 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c  r(pIndex = pTabl
2a10: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  e->pIndex; pInde
2a20: 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29  x; pIndex=pNext)
2a30: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49  {.    pNext = pI
2a40: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
2a50: 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
2a60: 3e 69 44 62 3d 3d 70 54 61 62 6c 65 2d 3e 69 44  >iDb==pTable->iD
2a70: 62 20 7c 7c 20 28 70 54 61 62 6c 65 2d 3e 69 44  b || (pTable->iD
2a80: 62 3d 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e  b==0 && pIndex->
2a90: 69 44 62 3d 3d 31 29 20 29 3b 0a 20 20 20 20 73  iDb==1) );.    s
2aa0: 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78  qliteDeleteIndex
2ab0: 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
2ac0: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  }..  /* Delete a
2ad0: 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  ll foreign keys 
2ae0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2af0: 74 68 69 73 20 74 61 62 6c 65 2e 20 20 54 68 65  this table.  The
2b00: 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c   keys.  ** shoul
2b10: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  d have already b
2b20: 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  een unlinked fro
2b30: 6d 20 74 68 65 20 64 62 2d 3e 61 46 4b 65 79 20  m the db->aFKey 
2b40: 68 61 73 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f  hash table .  */
2b50: 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61  .  for(pFKey=pTa
2b60: 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65  ble->pFKey; pFKe
2b70: 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b  y; pFKey=pNextFK
2b80: 65 79 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b  ey){.    pNextFK
2b90: 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78  ey = pFKey->pNex
2ba0: 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72  tFrom;.    asser
2bb0: 74 28 20 70 54 61 62 6c 65 2d 3e 69 44 62 3c 64  t( pTable->iDb<d
2bc0: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73  b->nDb );.    as
2bd0: 73 65 72 74 28 20 73 71 6c 69 74 65 48 61 73 68  sert( sqliteHash
2be0: 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70 54  Find(&db->aDb[pT
2bf0: 61 62 6c 65 2d 3e 69 44 62 5d 2e 61 46 4b 65 79  able->iDb].aFKey
2c00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 4b               pFK
2c20: 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e 28  ey->zTo, strlen(
2c30: 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d  pFKey->zTo)+1)!=
2c40: 70 46 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c  pFKey );.    sql
2c50: 69 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a  iteFree(pFKey);.
2c60: 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
2c70: 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
2c80: 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  ture itself..  *
2c90: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
2ca0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
2cb0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
2cc0: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  e(pTable->aCol[i
2cd0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ].zName);.    sq
2ce0: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
2cf0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 29 3b  >aCol[i].zDflt);
2d00: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2d10: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e  pTable->aCol[i].
2d20: 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zType);.  }.  sq
2d30: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
2d40: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  >zName);.  sqlit
2d50: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
2d60: 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c  ol);.  sqliteSel
2d70: 65 63 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65  ectDelete(pTable
2d80: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  ->pSelect);.  sq
2d90: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 29  liteFree(pTable)
2da0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  ;.}../*.** Unlin
2db0: 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c  k the given tabl
2dc0: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
2dd0: 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64  tables and the d
2de0: 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62  elete the.** tab
2df0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74  le structure wit
2e00: 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65  h all its indice
2e10: 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65  s and foreign ke
2e20: 79 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ys..*/.static vo
2e30: 69 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41  id sqliteUnlinkA
2e40: 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  ndDeleteTable(sq
2e50: 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20  lite *db, Table 
2e60: 2a 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 4f  *p){.  Table *pO
2e70: 6c 64 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c  ld;.  FKey *pF1,
2e80: 20 2a 70 46 32 3b 0a 20 20 69 6e 74 20 69 20 3d   *pF2;.  int i =
2e90: 20 70 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65 72   p->iDb;.  asser
2ea0: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 70 4f  t( db!=0 );.  pO
2eb0: 6c 64 20 3d 20 73 71 6c 69 74 65 48 61 73 68 49  ld = sqliteHashI
2ec0: 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69  nsert(&db->aDb[i
2ed0: 5d 2e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e  ].tblHash, p->zN
2ee0: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a  ame, strlen(p->z
2ef0: 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61  Name)+1, 0);.  a
2f00: 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c  ssert( pOld==0 |
2f10: 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66  | pOld==p );.  f
2f20: 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79 3b  or(pF1=p->pFKey;
2f30: 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e 70   pF1; pF1=pF1->p
2f40: 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 69  NextFrom){.    i
2f50: 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28  nt nTo = strlen(
2f60: 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20  pF1->zTo) + 1;. 
2f70: 20 20 20 70 46 32 20 3d 20 73 71 6c 69 74 65 48     pF2 = sqliteH
2f80: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62  ashFind(&db->aDb
2f90: 5b 69 5d 2e 61 46 4b 65 79 2c 20 70 46 31 2d 3e  [i].aFKey, pF1->
2fa0: 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 69  zTo, nTo);.    i
2fb0: 66 28 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20  f( pF2==pF1 ){. 
2fc0: 20 20 20 20 20 73 71 6c 69 74 65 48 61 73 68 49       sqliteHashI
2fd0: 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69  nsert(&db->aDb[i
2fe0: 5d 2e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54  ].aFKey, pF1->zT
2ff0: 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65  o, nTo, pF1->pNe
3000: 78 74 54 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  xtTo);.    }else
3010: 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  {.      while( p
3020: 46 32 20 26 26 20 70 46 32 2d 3e 70 4e 65 78 74  F2 && pF2->pNext
3030: 54 6f 21 3d 70 46 31 20 29 7b 20 70 46 32 3d 70  To!=pF1 ){ pF2=p
3040: 46 32 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20  F2->pNextTo; }. 
3050: 20 20 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a       if( pF2 ){.
3060: 20 20 20 20 20 20 20 20 70 46 32 2d 3e 70 4e 65          pF2->pNe
3070: 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e 65 78  xtTo = pF1->pNex
3080: 74 54 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  tTo;.      }.   
3090: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 44   }.  }.  sqliteD
30a0: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
30b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  );.}../*.** Cons
30c0: 74 72 75 63 74 20 74 68 65 20 6e 61 6d 65 20 6f  truct the name o
30d0: 66 20 61 20 75 73 65 72 20 74 61 62 6c 65 20 6f  f a user table o
30e0: 72 20 69 6e 64 65 78 20 66 72 6f 6d 20 61 20 74  r index from a t
30f0: 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  oken..**.** Spac
3100: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61  e to hold the na
3110: 6d 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  me is obtained f
3120: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
3130: 28 29 20 61 6e 64 20 6d 75 73 74 0a 2a 2a 20 62  () and must.** b
3140: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
3150: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
3160: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
3170: 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b  TableNameFromTok
3180: 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  en(Token *pName)
3190: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  {.  char *zName 
31a0: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
31b0: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
31c0: 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71  >n);.  sqliteDeq
31d0: 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72  uote(zName);.  r
31e0: 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a  eturn zName;.}..
31f0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
3200: 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ode to open the 
3210: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61 73 74  appropriate mast
3220: 65 72 20 74 61 62 6c 65 2e 20 20 54 68 65 20 74  er table.  The t
3230: 61 62 6c 65 0a 2a 2a 20 6f 70 65 6e 65 64 20 77  able.** opened w
3240: 69 6c 6c 20 62 65 20 53 51 4c 49 54 45 5f 4d 41  ill be SQLITE_MA
3250: 53 54 45 52 20 66 6f 72 20 70 65 72 73 69 73 74  STER for persist
3260: 65 6e 74 20 74 61 62 6c 65 73 20 61 6e 64 20 0a  ent tables and .
3270: 2a 2a 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 4d  ** SQLITE_TEMP_M
3280: 41 53 54 45 52 20 66 6f 72 20 74 65 6d 70 6f 72  ASTER for tempor
3290: 61 72 79 20 74 61 62 6c 65 73 2e 20 20 54 68 65  ary tables.  The
32a0: 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64   table is opened
32b0: 0a 2a 2a 20 6f 6e 20 63 75 72 73 6f 72 20 30 2e  .** on cursor 0.
32c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 4f  .*/.void sqliteO
32d0: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 56  penMasterTable(V
32e0: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 73 54 65  dbe *v, int isTe
32f0: 6d 70 29 7b 0a 20 20 73 71 6c 69 74 65 56 64 62  mp){.  sqliteVdb
3300: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
3310: 65 67 65 72 2c 20 69 73 54 65 6d 70 2c 20 30 29  eger, isTemp, 0)
3320: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64  ;.  sqliteVdbeAd
3330: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
3340: 69 74 65 2c 20 30 2c 20 32 29 3b 0a 7d 0a 0a 2f  ite, 0, 2);.}../
3350: 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74  *.** Begin const
3360: 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ructing a new ta
3370: 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
3380: 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54  on in memory.  T
3390: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
33a0: 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61  rst of several a
33b0: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74  ction routines t
33c0: 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69  hat get called i
33d0: 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f  n response.** to
33e0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
33f0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70  statement.  In p
3400: 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20  articular, this 
3410: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
3420: 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e  d.** after seein
3430: 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45  g tokens "CREATE
3440: 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e  " and "TABLE" an
3450: 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  d the table name
3460: 2e 20 20 54 68 65 0a 2a 2a 20 70 53 74 61 72 74  .  The.** pStart
3470: 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 43 52   token is the CR
3480: 45 41 54 45 20 61 6e 64 20 70 4e 61 6d 65 20 69  EATE and pName i
3490: 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  s the table name
34a0: 2e 20 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a  .  The isTemp.**
34b0: 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66   flag is true if
34c0: 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c   the table shoul
34d0: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
34e0: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
34f0: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e  abase.** file in
3500: 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20  stead of in the 
3510: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
3520: 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  le.  This is nor
3530: 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a  mally the case.*
3540: 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50  * when the "TEMP
3550: 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22  " or "TEMPORARY"
3560: 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20   keyword occurs 
3570: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52  in between.** CR
3580: 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a  EATE and TABLE..
3590: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61  **.** The new ta
35a0: 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e  ble record is in
35b0: 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75  itialized and pu
35c0: 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65  t in pParse->pNe
35d0: 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f  wTable..** As mo
35e0: 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  re of the CREATE
35f0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
3600: 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69   is parsed, addi
3610: 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a  tional action.**
3620: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62   routines will b
3630: 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20  e called to add 
3640: 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
3650: 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e   to this record.
3660: 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
3670: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
3680: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  LE statement, th
3690: 65 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65  e sqliteEndTable
36a0: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
36b0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
36c0: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
36d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
36e0: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
36f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 74 61 72  .void sqliteStar
3700: 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  tTable(.  Parse 
3710: 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
3720: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
3730: 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c    Token *pStart,
3740: 20 20 20 2f 2a 20 54 68 65 20 22 43 52 45 41 54     /* The "CREAT
3750: 45 22 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f  E" token */.  To
3760: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f  ken *pName,    /
3770: 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20  * Name of table 
3780: 6f 72 20 76 69 65 77 20 74 6f 20 63 72 65 61 74  or view to creat
3790: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  e */.  int isTem
37a0: 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  p,      /* True 
37b0: 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  if this is a TEM
37c0: 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  P table */.  int
37d0: 20 69 73 56 69 65 77 20 20 20 20 20 20 20 2f 2a   isView       /*
37e0: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
37f0: 20 61 20 56 49 45 57 20 2a 2f 0a 29 7b 0a 20 20   a VIEW */.){.  
3800: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
3810: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
3820: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73  char *zName;.  s
3830: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
3840: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
3850: 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  v;.  int iDb;.. 
3860: 20 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54   pParse->sFirstT
3870: 6f 6b 65 6e 20 3d 20 2a 70 53 74 61 72 74 3b 0a  oken = *pStart;.
3880: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
3890: 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b  TableNameFromTok
38a0: 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  en(pName);.  if(
38b0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75   zName==0 ) retu
38c0: 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
38d0: 2d 3e 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d  ->iDb==1 ) isTem
38e0: 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  p = 1;.#ifndef S
38f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
3900: 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72  RIZATION.  asser
3910: 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d  t( (isTemp & 1)=
3920: 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20  =isTemp );.  {. 
3930: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
3940: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 69 73 54   char *zDb = isT
3950: 65 6d 70 20 3f 20 22 74 65 6d 70 22 20 3a 20 22  emp ? "temp" : "
3960: 6d 61 69 6e 22 3b 0a 20 20 20 20 69 66 28 20 73  main";.    if( s
3970: 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70  qliteAuthCheck(p
3980: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
3990: 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
39a0: 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a  LE(isTemp), 0, z
39b0: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Db) ){.      sql
39c0: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
39d0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
39e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
39f0: 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
3a00: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
3a10: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
3a20: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
3a30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3a40: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
3a50: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
3a60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
3a70: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69  lse{.      if( i
3a80: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
3a90: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
3aa0: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
3ab0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3ac0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
3ad0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
3ae0: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
3af0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 41  .    if( sqliteA
3b00: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
3b10: 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c   code, zName, 0,
3b20: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 73   zDb) ){.      s
3b30: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
3b40: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
3b50: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
3b60: 0a 20 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20  . ..  /* Before 
3b70: 74 72 79 69 6e 67 20 74 6f 20 63 72 65 61 74 65  trying to create
3b80: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
3b90: 6c 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  le, make sure th
3ba0: 65 20 42 74 72 65 65 20 66 6f 72 0a 20 20 2a 2a  e Btree for.  **
3bb0: 20 68 6f 6c 64 69 6e 67 20 74 65 6d 70 6f 72 61   holding tempora
3bc0: 72 79 20 74 61 62 6c 65 73 20 69 73 20 6f 70 65  ry tables is ope
3bd0: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  n..  */.  if( is
3be0: 54 65 6d 70 20 26 26 20 64 62 2d 3e 61 44 62 5b  Temp && db->aDb[
3bf0: 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50  1].pBt==0 && !pP
3c00: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
3c10: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
3c20: 6c 69 74 65 42 74 72 65 65 46 61 63 74 6f 72 79  liteBtreeFactory
3c30: 28 64 62 2c 20 30 2c 20 30 2c 20 4d 41 58 5f 50  (db, 0, 0, MAX_P
3c40: 41 47 45 53 2c 20 26 64 62 2d 3e 61 44 62 5b 31  AGES, &db->aDb[1
3c50: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  ].pBt);.    if( 
3c60: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
3c70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74  .      sqliteSet
3c80: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
3c90: 7a 45 72 72 4d 73 67 2c 20 22 75 6e 61 62 6c 65  zErrMsg, "unable
3ca0: 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
3cb0: 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a  rary database ".
3cc0: 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f          "file fo
3cd0: 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72  r storing tempor
3ce0: 61 72 79 20 74 61 62 6c 65 73 22 2c 20 30 29 3b  ary tables", 0);
3cf0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
3d00: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Err++;.      ret
3d10: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
3d20: 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
3d30: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b  QLITE_InTrans ){
3d40: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
3d50: 74 65 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  teBtreeBeginTran
3d60: 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  s(db->aDb[1].pBt
3d70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
3d80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
3d90: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e        sqliteSetN
3da0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
3db0: 7a 45 72 72 4d 73 67 2c 20 22 75 6e 61 62 6c 65  zErrMsg, "unable
3dc0: 20 74 6f 20 67 65 74 20 61 20 77 72 69 74 65 20   to get a write 
3dd0: 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20  lock on ".      
3de0: 20 20 20 20 22 74 68 65 20 74 65 6d 70 6f 72 61      "the tempora
3df0: 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
3e00: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  ", 0);.        p
3e10: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
3e20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
3e30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
3e40: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
3e50: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e   the new table n
3e60: 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c  ame does not col
3e70: 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69  lide with an exi
3e80: 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78  sting.  ** index
3e90: 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20   or table name. 
3ea0: 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20   Issue an error 
3eb0: 6d 65 73 73 61 67 65 20 69 66 20 69 74 20 64 6f  message if it do
3ec0: 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  es..  **.  ** If
3ed0: 20 77 65 20 61 72 65 20 72 65 2d 72 65 61 64 69   we are re-readi
3ee0: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
3ef0: 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75  ster table becau
3f00: 73 65 20 6f 66 20 61 20 73 63 68 65 6d 61 0a 20  se of a schema. 
3f10: 20 2a 2a 20 63 68 61 6e 67 65 20 61 6e 64 20 61   ** change and a
3f20: 20 6e 65 77 20 70 65 72 6d 61 6e 65 6e 74 20 74   new permanent t
3f30: 61 62 6c 65 20 69 73 20 66 6f 75 6e 64 20 77 68  able is found wh
3f40: 6f 73 65 20 6e 61 6d 65 20 63 6f 6c 6c 69 64 65  ose name collide
3f50: 73 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 65  s with.  ** an e
3f60: 78 69 73 74 69 6e 67 20 74 65 6d 70 6f 72 61 72  xisting temporar
3f70: 79 20 74 61 62 6c 65 2c 20 74 68 61 74 20 69 73  y table, that is
3f80: 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 0a 20   not an error.. 
3f90: 20 2a 2f 0a 20 20 70 54 61 62 6c 65 20 3d 20 73   */.  pTable = s
3fa0: 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64  qliteFindTable(d
3fb0: 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b, zName, 0);.  
3fc0: 69 44 62 20 3d 20 69 73 54 65 6d 70 20 3f 20 31  iDb = isTemp ? 1
3fd0: 20 3a 20 70 50 61 72 73 65 2d 3e 69 44 62 3b 0a   : pParse->iDb;.
3fe0: 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20    if( pTable!=0 
3ff0: 26 26 20 28 70 54 61 62 6c 65 2d 3e 69 44 62 3d  && (pTable->iDb=
4000: 3d 69 44 62 20 7c 7c 20 21 70 50 61 72 73 65 2d  =iDb || !pParse-
4010: 3e 69 6e 69 74 46 6c 61 67 29 20 29 7b 0a 20 20  >initFlag) ){.  
4020: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
4030: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
4040: 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 30  Msg, "table ", 0
4050: 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  , pName->z, pNam
4060: 65 2d 3e 6e 2c 0a 20 20 20 20 20 20 20 20 22 20  e->n,.        " 
4070: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
4080: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
4090: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
40a0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
40b0: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
40c0: 20 7d 0a 20 20 69 66 28 20 28 70 49 64 78 20 3d   }.  if( (pIdx =
40d0: 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78   sqliteFindIndex
40e0: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21  (db, zName, 0))!
40f0: 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
4100: 28 70 49 64 78 2d 3e 69 44 62 3d 3d 30 20 7c 7c  (pIdx->iDb==0 ||
4110: 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c   !pParse->initFl
4120: 61 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ag) ){.    sqlit
4130: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
4140: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 68  se->zErrMsg, "th
4150: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
4160: 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 22 2c  n index named ",
4170: 20 0a 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20   .       zName, 
4180: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  0);.    sqliteFr
4190: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  ee(zName);.    p
41a0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
41b0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
41c0: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
41d0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54  Malloc( sizeof(T
41e0: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
41f0: 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
4200: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
4210: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
4220: 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61   }.  pTable->zNa
4230: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54  me = zName;.  pT
4240: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
4250: 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d    pTable->aCol =
4260: 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50   0;.  pTable->iP
4270: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62  Key = -1;.  pTab
4280: 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  le->pIndex = 0;.
4290: 20 20 70 54 61 62 6c 65 2d 3e 69 44 62 20 3d 20    pTable->iDb = 
42a0: 69 44 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73  iDb;.  if( pPars
42b0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 20 73  e->pNewTable ) s
42c0: 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65  qliteDeleteTable
42d0: 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65  (db, pParse->pNe
42e0: 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72 73  wTable);.  pPars
42f0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70  e->pNewTable = p
4300: 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 42 65 67  Table;..  /* Beg
4310: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  in generating th
4320: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
4330: 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c   insert the tabl
4340: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20  e record into.  
4350: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  ** the SQLITE_MA
4360: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74  STER table.  Not
4370: 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20  e in particular 
4380: 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20  that we must go 
4390: 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61  ahead.  ** and a
43a0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f  llocate the reco
43b0: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
43c0: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f  e table entry no
43d0: 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20  w.  Before any. 
43e0: 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
43f0: 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72  or UNIQUE keywor
4400: 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20  ds are parsed.  
4410: 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77  Those keywords w
4420: 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69  ill cause.  ** i
4430: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65  ndices to be cre
4440: 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62  ated and the tab
4450: 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63  le record must c
4460: 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a  ome before the .
4470: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48    ** indices.  H
4480: 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64  ence, the record
4490: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
44a0: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c  table must be al
44b0: 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77  located.  ** now
44c0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
44d0: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26  arse->initFlag &
44e0: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 47 65 74  & (v = sqliteGet
44f0: 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30  Vdbe(pParse))!=0
4500: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 42 65   ){.    sqliteBe
4510: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
4520: 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 73 54  n(pParse, 0, isT
4530: 65 6d 70 29 3b 0a 20 20 20 20 69 66 28 20 21 69  emp);.    if( !i
4540: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73  sTemp ){.      s
4550: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4560: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62  , OP_Integer, db
4570: 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 30  ->file_format, 0
4580: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
4590: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
45a0: 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 31 29 3b  etCookie, 0, 1);
45b0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
45c0: 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  eOpenMasterTable
45d0: 28 76 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20  (v, isTemp);.   
45e0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
45f0: 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c  (v, OP_NewRecno,
4600: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
4610: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4620: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
4630: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4640: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
4650: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
4660: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4670: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30  _PutIntKey, 0, 0
4680: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4690: 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e  Add a new column
46a0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
46b0: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
46c0: 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a  nstructed..**.**
46d0: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
46e0: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  s this routine o
46f0: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  nce for each col
4700: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  umn declaration.
4710: 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  ** in a CREATE T
4720: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
4730: 20 73 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c   sqliteStartTabl
4740: 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a  e() gets called.
4750: 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20  ** first to get 
4760: 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54  things going.  T
4770: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
4780: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65   is called for e
4790: 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a  ach.** column..*
47a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64  /.void sqliteAdd
47b0: 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50  Column(Parse *pP
47c0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
47d0: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  me){.  Table *p;
47e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
47f0: 20 2a 7a 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d   *z = 0;.  Colum
4800: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28  n *pCol;.  if( (
4810: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
4820: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
4830: 72 6e 3b 0a 20 20 73 71 6c 69 74 65 53 65 74 4e  rn;.  sqliteSetN
4840: 53 74 72 69 6e 67 28 26 7a 2c 20 70 4e 61 6d 65  String(&z, pName
4850: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30  ->z, pName->n, 0
4860: 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  );.  if( z==0 ) 
4870: 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
4880: 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f  Dequote(z);.  fo
4890: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
48a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
48b0: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c  sqliteStrICmp(z,
48c0: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d   p->aCol[i].zNam
48d0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  e)==0 ){.      s
48e0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
48f0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
4900: 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75   "duplicate colu
4910: 6d 6e 20 6e 61 6d 65 3a 20 22 2c 20 7a 2c 20 30  mn name: ", z, 0
4920: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
4930: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 73  >nErr++;.      s
4940: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
4950: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
4960: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  }.  }.  if( (p->
4970: 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29  nCol & 0x7)==0 )
4980: 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e  {.    Column *aN
4990: 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73  ew;.    aNew = s
49a0: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d  qliteRealloc( p-
49b0: 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b  >aCol, (p->nCol+
49c0: 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  8)*sizeof(p->aCo
49d0: 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  l[0]));.    if( 
49e0: 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  aNew==0 ) return
49f0: 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20  ;.    p->aCol = 
4a00: 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c  aNew;.  }.  pCol
4a10: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
4a20: 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  Col];.  memset(p
4a30: 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  Col, 0, sizeof(p
4a40: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70  ->aCol[0]));.  p
4a50: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a  Col->zName = z;.
4a60: 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65    pCol->sortOrde
4a70: 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  r = SQLITE_SO_NU
4a80: 4d 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a  M;.  p->nCol++;.
4a90: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
4aa0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
4ab0: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
4ac0: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
4ad0: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
4ae0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
4af0: 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f  tatement.  A "NO
4b00: 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69  T NULL" constrai
4b10: 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73  nt has.** been s
4b20: 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e  een on a column.
4b30: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
4b40: 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20  ets the notNull 
4b50: 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  flag on.** the c
4b60: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
4b70: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4b80: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
4b90: 74 65 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72  teAddNotNull(Par
4ba0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
4bb0: 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c  onError){.  Tabl
4bc0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
4bd0: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
4be0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
4bf0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
4c00: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
4c10: 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b   i>=0 ) p->aCol[
4c20: 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45  i].notNull = onE
4c30: 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rror;.}../*.** T
4c40: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
4c50: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
4c60: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
4c70: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
4c80: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
4c90: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
4ca0: 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65   The pFirst toke
4cb0: 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  n is the first.*
4cc0: 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73  * token in the s
4cd0: 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e  equence of token
4ce0: 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20  s that describe 
4cf0: 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a  the type of the.
4d00: 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e  ** column curren
4d10: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
4d20: 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20  uction.   pLast 
4d30: 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65  is the last toke
4d40: 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75  n.** in the sequ
4d50: 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20  ence.  Use this 
4d60: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63  information to c
4d70: 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e  onstruct a strin
4d80: 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69  g.** that contai
4d90: 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20  ns the typename 
4da0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e  of the column an
4db0: 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72  d store that str
4dc0: 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e  ing.** in zType.
4dd0: 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  .*/ .void sqlite
4de0: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61  AddColumnType(Pa
4df0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
4e00: 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65  en *pFirst, Toke
4e10: 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20 54 61 62  n *pLast){.  Tab
4e20: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 2c 20  le *p;.  int i, 
4e30: 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68  j;.  int n;.  ch
4e40: 61 72 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20 20 43  ar *z, **pz;.  C
4e50: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69  olumn *pCol;.  i
4e60: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
4e70: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
4e80: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
4e90: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69  >nCol-1;.  if( i
4ea0: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <0 ) return;.  p
4eb0: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69  Col = &p->aCol[i
4ec0: 5d 3b 0a 20 20 70 7a 20 3d 20 26 70 43 6f 6c 2d  ];.  pz = &pCol-
4ed0: 3e 7a 54 79 70 65 3b 0a 20 20 6e 20 3d 20 70 4c  >zType;.  n = pL
4ee0: 61 73 74 2d 3e 6e 20 2b 20 41 64 64 72 28 70 4c  ast->n + Addr(pL
4ef0: 61 73 74 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70  ast->z) - Addr(p
4f00: 46 69 72 73 74 2d 3e 7a 29 3b 0a 20 20 73 71 6c  First->z);.  sql
4f10: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a  iteSetNString(pz
4f20: 2c 20 70 46 69 72 73 74 2d 3e 7a 2c 20 6e 2c 20  , pFirst->z, n, 
4f30: 30 29 3b 0a 20 20 7a 20 3d 20 2a 70 7a 3b 0a 20  0);.  z = *pz;. 
4f40: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
4f50: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  rn;.  for(i=j=0;
4f60: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
4f70: 20 69 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20   int c = z[i];. 
4f80: 20 20 20 69 66 28 20 69 73 73 70 61 63 65 28 63     if( isspace(c
4f90: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
4fa0: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20    z[j++] = c;.  
4fb0: 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20  }.  z[j] = 0;.  
4fc0: 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
4fd0: 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29  file_format>=4 )
4fe0: 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 6f 72 74  {.    pCol->sort
4ff0: 4f 72 64 65 72 20 3d 20 73 71 6c 69 74 65 43 6f  Order = sqliteCo
5000: 6c 6c 61 74 65 54 79 70 65 28 7a 2c 20 6e 29 3b  llateType(z, n);
5010: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
5020: 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  ol->sortOrder = 
5030: 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20  SQLITE_SO_NUM;. 
5040: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
5050: 67 69 76 65 6e 20 74 6f 6b 65 6e 20 69 73 20 74  given token is t
5060: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
5070: 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 63 6f   for the last co
5080: 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 0a 2a 2a  lumn added to.**
5090: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
50a0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
50b0: 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 22 6d 69  ruction.  If "mi
50c0: 6e 75 73 46 6c 61 67 22 20 69 73 20 74 72 75 65  nusFlag" is true
50d0: 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  , it.** means th
50e0: 65 20 76 61 6c 75 65 20 74 6f 6b 65 6e 20 77 61  e value token wa
50f0: 73 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20  s preceded by a 
5100: 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a  minus sign..**.*
5110: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
5120: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
5130: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
5140: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
5150: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
5160: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
5170: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
5180: 65 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  eAddDefaultValue
5190: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
51a0: 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20 69 6e 74  Token *pVal, int
51b0: 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20 54   minusFlag){.  T
51c0: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
51d0: 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b 0a 20  ;.  char **pz;. 
51e0: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
51f0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
5200: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
5210: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
5220: 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20   i<0 ) return;. 
5230: 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69   pz = &p->aCol[i
5240: 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69 66 28 20 6d  ].zDflt;.  if( m
5250: 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20 20  inusFlag ){.    
5260: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
5270: 28 70 7a 2c 20 22 2d 22 2c 20 31 2c 20 70 56 61  (pz, "-", 1, pVa
5280: 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30  l->z, pVal->n, 0
5290: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
52a0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
52b0: 28 70 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56  (pz, pVal->z, pV
52c0: 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20  al->n, 0);.  }. 
52d0: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a   sqliteDequote(*
52e0: 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  pz);.}../*.** De
52f0: 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d  signate the PRIM
5300: 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20  ARY KEY for the 
5310: 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73  table.  pList is
5320: 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73   a list of names
5330: 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   .** of columns 
5340: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72  that form the pr
5350: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70  imary key.  If p
5360: 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  List is NULL, th
5370: 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72  en the.** most r
5380: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
5390: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
53a0: 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79  e is the primary
53b0: 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61   key..**.** A ta
53c0: 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20  ble can have at 
53d0: 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79  most one primary
53e0: 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61   key.  If the ta
53f0: 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a  ble already has.
5400: 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  ** a primary key
5410: 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68   (and this is th
5420: 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79  e second primary
5430: 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74   key) then creat
5440: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  e an.** error..*
5450: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d  *.** If the PRIM
5460: 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20  ARY KEY is on a 
5470: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68  single column wh
5480: 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20  ose datatype is 
5490: 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e  INTEGER,.** then
54a0: 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20   we will try to 
54b0: 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  use that column 
54c0: 61 73 20 74 68 65 20 72 6f 77 20 69 64 2e 20 20  as the row id.  
54d0: 28 45 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a 20 46  (Exception:.** F
54e0: 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  or backwards com
54f0: 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
5500: 6f 6c 64 65 72 20 64 61 74 61 62 61 73 65 73 2c  older databases,
5510: 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a   do not do this.
5520: 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 66  ** if the file f
5530: 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e 20 6e 75  ormat version nu
5540: 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
5550: 6e 20 31 2e 29 20 20 53 65 74 20 74 68 65 20 54  n 1.)  Set the T
5560: 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69  able.iPKey.** fi
5570: 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65  eld of the table
5580: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
5590: 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e  ion to be the in
55a0: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e  dex of the.** IN
55b0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
55c0: 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65  Y column.  Table
55d0: 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f  .iPKey is set to
55e0: 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a   -1 if there is.
55f0: 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52  ** no INTEGER PR
5600: 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a  IMARY KEY..**.**
5610: 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e   If the key is n
5620: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
5630: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
5640: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a  create a unique.
5650: 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65  ** index for the
5660: 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20   key.  No index 
5670: 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49  is created for I
5680: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
5690: 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  EYs..*/.void sql
56a0: 69 74 65 41 64 64 50 72 69 6d 61 72 79 4b 65 79  iteAddPrimaryKey
56b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
56c0: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69  IdList *pList, i
56d0: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54  nt onError){.  T
56e0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
56f0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
5700: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
5710: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
5720: 2d 31 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  -1;.  if( pTab==
5730: 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79  0 ) goto primary
5740: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28  _key_exit;.  if(
5750: 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65   pTab->hasPrimKe
5760: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  y ){.    sqliteS
5770: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
5780: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c  ->zErrMsg, "tabl
5790: 65 20 5c 22 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  e \"", pTab->zNa
57a0: 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 22 5c 22  me, .        "\"
57b0: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
57c0: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c  ne primary key",
57d0: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
57e0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
57f0: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
5800: 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e  it;.  }.  pTab->
5810: 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a  hasPrimKey = 1;.
5820: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
5830: 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61  {.    iCol = pTa
5840: 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 7d  b->nCol - 1;.  }
5850: 65 6c 73 65 20 69 66 28 20 70 4c 69 73 74 2d 3e  else if( pList->
5860: 6e 49 64 3d 3d 31 20 29 7b 0a 20 20 20 20 66 6f  nId==1 ){.    fo
5870: 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70  r(iCol=0; iCol<p
5880: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  Tab->nCol; iCol+
5890: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
58a0: 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73  liteStrICmp(pLis
58b0: 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70  t->a[0].zName, p
58c0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
58d0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  zName)==0 ) brea
58e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
58f0: 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  f( iCol>=0 && iC
5900: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  ol<pTab->nCol ){
5910: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61  .    zType = pTa
5920: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
5930: 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ype;.  }.  if( p
5940: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f  Parse->db->file_
5950: 66 6f 72 6d 61 74 3e 3d 31 20 26 26 20 0a 20 20  format>=1 && .  
5960: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 26           zType &
5970: 26 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  & sqliteStrICmp(
5980: 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22  zType, "INTEGER"
5990: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 62  )==0 ){.    pTab
59a0: 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a  ->iPKey = iCol;.
59b0: 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e      pTab->keyCon
59c0: 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 7d  f = onError;.  }
59d0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
59e0: 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72  CreateIndex(pPar
59f0: 73 65 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c  se, 0, 0, pList,
5a00: 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 2c 20   onError, 0, 0, 
5a10: 30 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  0);.    pList = 
5a20: 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f  0;.  }..primary_
5a30: 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  key_exit:.  sqli
5a40: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  teIdListDelete(p
5a50: 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b  List);.  return;
5a60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5a70: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
5a80: 20 63 6f 6c 6c 61 74 69 6e 67 20 74 79 70 65 20   collating type 
5a90: 67 69 76 65 6e 20 61 20 74 79 70 65 20 6e 61 6d  given a type nam
5aa0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  e..**.** The col
5ab0: 6c 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74  lation type is t
5ac0: 65 78 74 20 28 53 51 4c 49 54 45 5f 53 4f 5f 54  ext (SQLITE_SO_T
5ad0: 45 58 54 29 20 69 66 20 74 68 65 20 74 79 70 65  EXT) if the type
5ae0: 0a 2a 2a 20 6e 61 6d 65 20 63 6f 6e 74 61 69 6e  .** name contain
5af0: 73 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20  s the character 
5b00: 73 74 72 65 61 6d 20 22 74 65 78 74 22 20 6f 72  stream "text" or
5b10: 20 22 62 6c 6f 62 22 20 6f 72 0a 2a 2a 20 22 63   "blob" or.** "c
5b20: 6c 6f 62 22 2e 20 20 41 6e 79 20 6f 74 68 65 72  lob".  Any other
5b30: 20 74 79 70 65 20 6e 61 6d 65 20 69 73 20 63 6f   type name is co
5b40: 6c 6c 61 74 65 64 20 61 73 20 6e 75 6d 65 72 69  llated as numeri
5b50: 63 0a 2a 2a 20 28 53 51 4c 49 54 45 5f 53 4f 5f  c.** (SQLITE_SO_
5b60: 4e 55 4d 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  NUM)..*/.int sql
5b70: 69 74 65 43 6f 6c 6c 61 74 65 54 79 70 65 28 63  iteCollateType(c
5b80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
5b90: 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20  , int nType){.  
5ba0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
5bb0: 3b 20 69 3c 6e 54 79 70 65 2d 31 3b 20 69 2b 2b  ; i<nType-1; i++
5bc0: 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 7a  ){.    switch( z
5bd0: 54 79 70 65 5b 69 5d 20 29 7b 0a 20 20 20 20 20  Type[i] ){.     
5be0: 20 63 61 73 65 20 27 62 27 3a 0a 20 20 20 20 20   case 'b':.     
5bf0: 20 63 61 73 65 20 27 42 27 3a 20 7b 0a 20 20 20   case 'B': {.   
5c00: 20 20 20 20 20 69 66 28 20 69 3c 6e 54 79 70 65       if( i<nType
5c10: 2d 33 20 26 26 20 73 71 6c 69 74 65 53 74 72 4e  -3 && sqliteStrN
5c20: 49 43 6d 70 28 26 7a 54 79 70 65 5b 69 5d 2c 22  ICmp(&zType[i],"
5c30: 62 6c 6f 62 22 2c 34 29 3d 3d 30 20 29 7b 0a 20  blob",4)==0 ){. 
5c40: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
5c50: 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a  SQLITE_SO_TEXT;.
5c60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5c70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5c80: 0a 20 20 20 20 20 20 63 61 73 65 20 27 63 27 3a  .      case 'c':
5c90: 0a 20 20 20 20 20 20 63 61 73 65 20 27 43 27 3a  .      case 'C':
5ca0: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   {.        if( i
5cb0: 3c 6e 54 79 70 65 2d 33 20 26 26 20 28 73 71 6c  <nType-3 && (sql
5cc0: 69 74 65 53 74 72 4e 49 43 6d 70 28 26 7a 54 79  iteStrNICmp(&zTy
5cd0: 70 65 5b 69 5d 2c 22 63 68 61 72 22 2c 34 29 3d  pe[i],"char",4)=
5ce0: 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  =0 ||.          
5cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d00: 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28   sqliteStrNICmp(
5d10: 26 7a 54 79 70 65 5b 69 5d 2c 22 63 6c 6f 62 22  &zType[i],"clob"
5d20: 2c 34 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  ,4)==0).        
5d30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
5d40: 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45  urn SQLITE_SO_TE
5d50: 58 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  XT;.        }.  
5d60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5d70: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5d80: 27 78 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20  'x':.      case 
5d90: 27 58 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  'X': {.        i
5da0: 66 28 20 69 3e 3d 32 20 26 26 20 73 71 6c 69 74  f( i>=2 && sqlit
5db0: 65 53 74 72 4e 49 43 6d 70 28 26 7a 54 79 70 65  eStrNICmp(&zType
5dc0: 5b 69 2d 32 5d 2c 22 74 65 78 74 22 2c 34 29 3d  [i-2],"text",4)=
5dd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
5de0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f  return SQLITE_SO
5df0: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 20 20 7d  _TEXT;.        }
5e00: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5e10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65        }.      de
5e20: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
5e30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
5e40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5e50: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d  rn SQLITE_SO_NUM
5e60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5e70: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
5e80: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
5e90: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
5ea0: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
5eb0: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
5ec0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22   statement.  A "
5ed0: 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20  COLLATE" clause 
5ee0: 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e  has.** been seen
5ef0: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54   on a column.  T
5f00: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
5f10: 20 74 68 65 20 43 6f 6c 75 6d 6e 2e 73 6f 72 74   the Column.sort
5f20: 4f 72 64 65 72 20 6f 6e 0a 2a 2a 20 74 68 65 20  Order on.** the 
5f30: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
5f40: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
5f50: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
5f60: 69 74 65 41 64 64 43 6f 6c 6c 61 74 65 54 79 70  iteAddCollateTyp
5f70: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
5f80: 20 69 6e 74 20 63 6f 6c 6c 54 79 70 65 29 7b 0a   int collType){.
5f90: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
5fa0: 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  t i;.  if( (p = 
5fb0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
5fc0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
5fd0: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
5fe0: 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d  .  if( i>=0 ) p-
5ff0: 3e 61 43 6f 6c 5b 69 5d 2e 73 6f 72 74 4f 72 64  >aCol[i].sortOrd
6000: 65 72 20 3d 20 63 6f 6c 6c 54 79 70 65 3b 0a 7d  er = collType;.}
6010: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 65 20 75 70 20  ../*.** Come up 
6020: 77 69 74 68 20 61 20 6e 65 77 20 72 61 6e 64 6f  with a new rando
6030: 6d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  m value for the 
6040: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 20 20  schema cookie.  
6050: 4d 61 6b 65 20 73 75 72 65 0a 2a 2a 20 74 68 65  Make sure.** the
6060: 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20 64 69   new value is di
6070: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
6080: 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   old..**.** The 
6090: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
60a0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
60b0: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
60c0: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
60d0: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
60e0: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
60f0: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
6100: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
6110: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
6120: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
6130: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
6140: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
6150: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
6160: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
6170: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
6180: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
6190: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
61a0: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
61b0: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
61c0: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
61d0: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
61e0: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
61f0: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
6200: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
6210: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
6220: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
6230: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
6240: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
6250: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
6260: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
6270: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
6280: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
6290: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
62a0: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
62b0: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
62c0: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
62d0: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
62e0: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
62f0: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
6300: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
6310: 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64   enough..*/.void
6320: 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f   sqliteChangeCoo
6330: 6b 69 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20  kie(sqlite *db, 
6340: 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20  Vdbe *v){.  if( 
6350: 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 3d  db->next_cookie=
6360: 3d 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 63 68 65  =db->aDb[0].sche
6370: 6d 61 5f 63 6f 6f 6b 69 65 20 29 7b 0a 20 20 20  ma_cookie ){.   
6380: 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65   db->next_cookie
6390: 20 3d 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 63   = db->aDb[0].sc
63a0: 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 2b 20 73 71  hema_cookie + sq
63b0: 6c 69 74 65 52 61 6e 64 6f 6d 42 79 74 65 28 29  liteRandomByte()
63c0: 20 2b 20 31 3b 0a 20 20 20 20 64 62 2d 3e 66 6c   + 1;.    db->fl
63d0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
63e0: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20  ternChanges;.   
63f0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6400: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
6410: 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 2c  db->next_cookie,
6420: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
6430: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
6440: 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 30 29 3b  etCookie, 0, 0);
6450: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65  .  }.}../*.** Me
6460: 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72  asure the number
6470: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e   of characters n
6480: 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20  eeded to output 
6490: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65  the given.** ide
64a0: 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75  ntifier.  The nu
64b0: 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e  mber returned in
64c0: 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65  cludes any quote
64d0: 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f  s used.** but do
64e0: 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74  es not include t
64f0: 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74  he null terminat
6500: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
6510: 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f  t identLength(co
6520: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
6530: 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e 65 65  int n;.  int nee
6540: 64 51 75 6f 74 65 20 3d 20 30 3b 0a 20 20 66 6f  dQuote = 0;.  fo
6550: 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20  r(n=0; *z; n++, 
6560: 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a  z++){.    if( *z
6570: 3d 3d 27 5c 27 27 20 29 7b 20 6e 2b 2b 3b 20 6e  =='\'' ){ n++; n
6580: 65 65 64 51 75 6f 74 65 3d 31 3b 20 7d 0a 20 20  eedQuote=1; }.  
6590: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 6e  }.  return n + n
65a0: 65 65 64 51 75 6f 74 65 2a 32 3b 0a 7d 0a 0a 2f  eedQuote*2;.}../
65b0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 69 64  *.** Write an id
65c0: 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20 74 68  entifier onto th
65d0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 67 69 76  e end of the giv
65e0: 65 6e 20 73 74 72 69 6e 67 2e 20 20 41 64 64 0a  en string.  Add.
65f0: 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61 63 74  ** quote charact
6600: 65 72 73 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a  ers as needed..*
6610: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64  /.static void id
6620: 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20  entPut(char *z, 
6630: 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20  int *pIdx, char 
6640: 2a 7a 49 64 65 6e 74 29 7b 0a 20 20 69 6e 74 20  *zIdent){.  int 
6650: 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b  i, j, needQuote;
6660: 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20  .  i = *pIdx;.  
6670: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
6680: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66  j]; j++){.    if
6690: 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e  ( !isalnum(zIden
66a0: 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b  t[j]) && zIdent[
66b0: 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b  j]!='_' ) break;
66c0: 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65  .  }.  needQuote
66d0: 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30   =  zIdent[j]!=0
66e0: 20 7c 7c 20 69 73 64 69 67 69 74 28 7a 49 64 65   || isdigit(zIde
66f0: 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20  nt[0]).         
6700: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
6710: 74 65 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49  teKeywordCode(zI
6720: 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b  dent, j)!=TK_ID;
6730: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
6740: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27   ) z[i++] = '\''
6750: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
6760: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
6770: 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e    z[i++] = zIden
6780: 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49  t[j];.    if( zI
6790: 64 65 6e 74 5b 6a 5d 3d 3d 27 5c 27 27 20 29 20  dent[j]=='\'' ) 
67a0: 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20  z[i++] = '\'';. 
67b0: 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f   }.  if( needQuo
67c0: 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c  te ) z[i++] = '\
67d0: 27 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a  '';.  z[i] = 0;.
67e0: 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a    *pIdx = i;.}..
67f0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
6800: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
6810: 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69  atement appropri
6820: 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ate for the give
6830: 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d  n.** table.  Mem
6840: 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ory to hold the 
6850: 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61 74  text of the stat
6860: 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65  ement is obtaine
6870: 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65  d.** from sqlite
6880: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  Malloc() and mus
6890: 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
68a0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
68b0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  on..*/.static ch
68c0: 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53  ar *createTableS
68d0: 74 6d 74 28 54 61 62 6c 65 20 2a 70 29 7b 0a 20  tmt(Table *p){. 
68e0: 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20   int i, k, n;.  
68f0: 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63  char *zStmt;.  c
6900: 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70  har *zSep, *zSep
6910: 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 6e 20 3d 20  2, *zEnd;.  n = 
6920: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
6930: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
6940: 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e     n += identLen
6950: 67 74 68 28 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  gth(p->aCol[i].z
6960: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 6e 20 2b  Name);.  }.  n +
6970: 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d  = identLength(p-
6980: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e  >zName);.  if( n
6990: 3c 34 30 20 29 7b 0a 20 20 20 20 7a 53 65 70 20  <40 ){.    zSep 
69a0: 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  = "";.    zSep2 
69b0: 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20  = ",";.    zEnd 
69c0: 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = ")";.  }else{.
69d0: 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20      zSep = "\n  
69e0: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
69f0: 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64  ,\n  ";.    zEnd
6a00: 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20   = "\n)";.  }.  
6a10: 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e  n += 35 + 6*p->n
6a20: 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73  Col;.  zStmt = s
6a30: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
6a40: 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74  n );.  if( zStmt
6a50: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
6a60: 20 20 73 74 72 63 70 79 28 7a 53 74 6d 74 2c 20    strcpy(zStmt, 
6a70: 70 2d 3e 69 44 62 3d 3d 31 20 3f 20 22 43 52 45  p->iDb==1 ? "CRE
6a80: 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 22  ATE TEMP TABLE "
6a90: 20 3a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45   : "CREATE TABLE
6aa0: 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65   ");.  k = strle
6ab0: 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e  n(zStmt);.  iden
6ac0: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
6ad0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74  p->zName);.  zSt
6ae0: 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20  mt[k++] = '(';. 
6af0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
6b00: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Col; i++){.    s
6b10: 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c  trcpy(&zStmt[k],
6b20: 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d   zSep);.    k +=
6b30: 20 73 74 72 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b   strlen(&zStmt[k
6b40: 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a  ]);.    zSep = z
6b50: 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50  Sep2;.    identP
6b60: 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d  ut(zStmt, &k, p-
6b70: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  >aCol[i].zName);
6b80: 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28 26 7a  .  }.  strcpy(&z
6b90: 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a  Stmt[k], zEnd);.
6ba0: 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a    return zStmt;.
6bb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
6bc0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
6bd0: 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69  to report the fi
6be0: 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72  nal ")" that ter
6bf0: 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45  minates.** a CRE
6c00: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
6c10: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ent..**.** The t
6c20: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
6c30: 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e  hat other action
6c40: 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62   routines have b
6c50: 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20  een building.** 
6c60: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
6c70: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
6c80: 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e  bles, assuming n
6c90: 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a  o errors have.**
6ca0: 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a   occurred..**.**
6cb0: 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   An entry for th
6cc0: 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20  e table is made 
6cd0: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  in the master ta
6ce0: 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 0a 2a 2a 20  ble on disk,.** 
6cf0: 75 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20 61  unless this is a
6d00: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
6d10: 20 6f 72 20 69 6e 69 74 46 6c 61 67 3d 3d 31 2e   or initFlag==1.
6d20: 20 20 57 68 65 6e 20 69 6e 69 74 46 6c 61 67 3d    When initFlag=
6d30: 3d 31 2c 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20  =1,.** it means 
6d40: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
6d50: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
6d60: 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77   table because w
6d70: 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63  e just.** connec
6d80: 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ted to the datab
6d90: 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74  ase or because t
6da0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
6db0: 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65   table has.** re
6dc0: 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 2c 20  cently changes, 
6dd0: 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  so the entry for
6de0: 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65   this table alre
6df0: 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a  ady exists in.**
6e00: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
6e10: 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f  er table.  We do
6e20: 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65   not want to cre
6e30: 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a  ate it again..**
6e40: 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65  .** If the pSele
6e50: 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ct argument is n
6e60: 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e  ot NULL, it mean
6e70: 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  s that this rout
6e80: 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65  ine.** was calle
6e90: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61  d to create a ta
6ea0: 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72  ble generated fr
6eb0: 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45  om a .** "CREATE
6ec0: 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45   TABLE ... AS SE
6ed0: 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d  LECT ..." statem
6ee0: 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ent.  The column
6ef0: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
6f00: 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20   new table will 
6f10: 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74  match the result
6f20: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
6f30: 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
6f40: 74 65 45 6e 64 54 61 62 6c 65 28 50 61 72 73 65  teEndTable(Parse
6f50: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
6f60: 2a 70 45 6e 64 2c 20 53 65 6c 65 63 74 20 2a 70  *pEnd, Select *p
6f70: 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65  Select){.  Table
6f80: 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64   *p;.  sqlite *d
6f90: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
6fa0: 0a 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20  .  if( (pEnd==0 
6fb0: 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c  && pSelect==0) |
6fc0: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  | pParse->nErr |
6fd0: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
6fe0: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
6ff0: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
7000: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
7010: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  p==0 ) return;..
7020: 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c    /* If the tabl
7030: 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66  e is generated f
7040: 72 6f 6d 20 61 20 53 45 4c 45 43 54 2c 20 74 68  rom a SELECT, th
7050: 65 6e 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65  en construct the
7060: 0a 20 20 2a 2a 20 6c 69 73 74 20 6f 66 20 63 6f  .  ** list of co
7070: 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 74 65  lumns and the te
7080: 78 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  xt of the table.
7090: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c  .  */.  if( pSel
70a0: 65 63 74 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  ect ){.    Table
70b0: 20 2a 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69   *pSelTab = sqli
70c0: 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  teResultSetOfSel
70d0: 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ect(pParse, 0, p
70e0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28  Select);.    if(
70f0: 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65   pSelTab==0 ) re
7100: 74 75 72 6e 3b 0a 20 20 20 20 61 73 73 65 72 74  turn;.    assert
7110: 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ( p->aCol==0 );.
7120: 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53      p->nCol = pS
7130: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
7140: 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54   p->aCol = pSelT
7150: 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53  ab->aCol;.    pS
7160: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
7170: 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43  .    pSelTab->aC
7180: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ol = 0;.    sqli
7190: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  teDeleteTable(0,
71a0: 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 7d 0a 0a   pSelTab);.  }..
71b0: 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69 74    /* If the init
71c0: 46 6c 61 67 20 69 73 20 31 20 69 74 20 6d 65 61  Flag is 1 it mea
71d0: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
71e0: 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68  g the SQL off th
71f0: 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d  e.  ** "sqlite_m
7200: 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74  aster" or "sqlit
7210: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74  e_temp_master" t
7220: 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b  able on the disk
7230: 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74  ..  ** So do not
7240: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69   write to the di
7250: 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61  sk again.  Extra
7260: 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ct the root page
7270: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72   number.  ** for
7280: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
7290: 74 68 65 20 70 50 61 72 73 65 2d 3e 6e 65 77 54  the pParse->newT
72a0: 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65  num field.  (The
72b0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
72c0: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  * should have be
72d0: 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20  en put there by 
72e0: 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62  the sqliteOpenCb
72f0: 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a   routine.).  */.
7300: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e    if( pParse->in
7310: 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 70 2d  itFlag ){.    p-
7320: 3e 74 6e 75 6d 20 3d 20 70 50 61 72 73 65 2d 3e  >tnum = pParse->
7330: 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20  newTnum;.  }..  
7340: 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61  /* If not initia
7350: 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65  lizing, then cre
7360: 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72  ate a record for
7370: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20   the new table. 
7380: 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54   ** in the SQLIT
7390: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f  E_MASTER table o
73a0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
73b0: 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   The record numb
73c0: 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  er.  ** for the 
73d0: 6e 65 77 20 74 61 62 6c 65 20 65 6e 74 72 79 20  new table entry 
73e0: 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
73f0: 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a  e on the stack..
7400: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
7410: 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59  s is a TEMPORARY
7420: 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68   table, write th
7430: 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  e entry into the
7440: 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
7450: 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
7460: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
7470: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
7480: 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  /.  if( !pParse-
7490: 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20  >initFlag ){.   
74a0: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65   int n;.    Vdbe
74b0: 20 2a 76 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71   *v;..    v = sq
74c0: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
74d0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
74e0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
74f0: 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d  if( p->pSelect==
7500: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
7510: 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f  regular table */
7520: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
7530: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65  eAddOp(v, OP_Cre
7540: 61 74 65 54 61 62 6c 65 2c 20 30 2c 20 70 2d 3e  ateTable, 0, p->
7550: 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
7560: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
7570: 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 26 70  , -1, (char *)&p
7580: 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54  ->tnum, P3_POINT
7590: 45 52 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ER);.    }else{.
75a0: 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20        /* A view 
75b0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  */.      sqliteV
75c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
75d0: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
75e0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e 75 6d     }.    p->tnum
75f0: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
7600: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7610: 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Pull, 1, 0);.   
7620: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7630: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
7640: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  , 0);.    if( p-
7650: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
7660: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
7670: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
7680: 74 61 62 6c 65 22 2c 20 50 33 5f 53 54 41 54 49  table", P3_STATI
7690: 43 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  C);.    }else{. 
76a0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
76b0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
76c0: 76 69 65 77 22 2c 20 50 33 5f 53 54 41 54 49 43  view", P3_STATIC
76d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
76e0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
76f0: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
7700: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
7710: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
7720: 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  p->zName, P3_STA
7730: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
7740: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7750: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
7760: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
7770: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e  ngeP3(v, -1, p->
7780: 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
7790: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
77a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
77b0: 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 4, 0);.    sql
77c0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
77d0: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
77e0: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  ;.    if( pSelec
77f0: 74 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  t ){.      char 
7800: 2a 7a 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65  *z = createTable
7810: 53 74 6d 74 28 70 29 3b 0a 20 20 20 20 20 20 6e  Stmt(p);.      n
7820: 20 3d 20 7a 20 3f 20 73 74 72 6c 65 6e 28 7a 29   = z ? strlen(z)
7830: 20 3a 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   : 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 7a 2c 20 6e 29 3b 0a 20 20 20  , -1, z, n);.   
7860: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29     sqliteFree(z)
7870: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7880: 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 21     assert( pEnd!
7890: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  =0 );.      n = 
78a0: 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20  Addr(pEnd->z) - 
78b0: 41 64 64 72 28 70 50 61 72 73 65 2d 3e 73 46 69  Addr(pParse->sFi
78c0: 72 73 74 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b  rstToken.z) + 1;
78d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
78e0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
78f0: 20 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54   pParse->sFirstT
7900: 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20  oken.z, n);.    
7910: 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  }.    sqliteVdbe
7920: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
7930: 52 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a 20  Record, 5, 0);. 
7940: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7950: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b  Op(v, OP_PutIntK
7960: 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  ey, 0, 0);.    i
7970: 66 28 20 21 70 2d 3e 69 44 62 20 29 7b 0a 20 20  f( !p->iDb ){.  
7980: 20 20 20 20 73 71 6c 69 74 65 43 68 61 6e 67 65      sqliteChange
7990: 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a 20  Cookie(db, v);. 
79a0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
79b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
79c0: 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lose, 0, 0);.   
79d0: 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
79e0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
79f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
7a00: 67 65 72 2c 20 70 2d 3e 69 44 62 2c 20 30 29 3b  ger, p->iDb, 0);
7a10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
7a20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
7a30: 6e 57 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20  nWrite, 1, 0);. 
7a40: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
7a50: 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  b = 2;.      sql
7a60: 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65  iteSelect(pParse
7a70: 2c 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54  , pSelect, SRT_T
7a80: 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30  able, 1, 0, 0, 0
7a90: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
7aa0: 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61  iteEndWriteOpera
7ab0: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
7ac0: 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  }..  /* Add the 
7ad0: 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d  table to the in-
7ae0: 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
7af0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
7b00: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  abase..  */.  if
7b10: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
7b20: 6e 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  n==0 && pParse->
7b30: 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54  nErr==0 ){.    T
7b40: 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  able *pOld;.    
7b50: 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 20  FKey *pFKey;.   
7b60: 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61   pOld = sqliteHa
7b70: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44  shInsert(&db->aD
7b80: 62 5b 70 2d 3e 69 44 62 5d 2e 74 62 6c 48 61 73  b[p->iDb].tblHas
7b90: 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  h, .            
7ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bb0: 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  p->zName, strlen
7bc0: 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 29  (p->zName)+1, p)
7bd0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29  ;.    if( pOld )
7be0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
7bf0: 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d  p==pOld );  /* M
7c00: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
7c10: 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61  failed inside Ha
7c20: 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20  shInsert() */.  
7c30: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
7c40: 7d 0a 20 20 20 20 66 6f 72 28 70 46 4b 65 79 3d  }.    for(pFKey=
7c50: 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b  p->pFKey; pFKey;
7c60: 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e   pFKey=pFKey->pN
7c70: 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20  extFrom){.      
7c80: 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e  int nTo = strlen
7c90: 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31  (pFKey->zTo) + 1
7ca0: 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 70  ;.      pFKey->p
7cb0: 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69 74 65 48  NextTo = sqliteH
7cc0: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62  ashFind(&db->aDb
7cd0: 5b 70 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 20  [p->iDb].aFKey, 
7ce0: 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29  pFKey->zTo, nTo)
7cf0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 48 61  ;.      sqliteHa
7d00: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44  shInsert(&db->aD
7d10: 62 5b 70 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c  b[p->iDb].aFKey,
7d20: 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f   pFKey->zTo, nTo
7d30: 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d 0a  , pFKey);.    }.
7d40: 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77      pParse->pNew
7d50: 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64  Table = 0;.    d
7d60: 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20  b->nTable++;.   
7d70: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
7d80: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
7d90: 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  es;.  }.}../*.**
7da0: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
7db0: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  s this routine i
7dc0: 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74  n order to creat
7dd0: 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a  e a new VIEW.*/.
7de0: 76 6f 69 64 20 73 71 6c 69 74 65 43 72 65 61 74  void sqliteCreat
7df0: 65 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a  eView(.  Parse *
7e00: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54  pParse,     /* T
7e10: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
7e20: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
7e30: 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68  Begin,     /* Th
7e40: 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
7e50: 68 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73  hat begins the s
7e60: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
7e70: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20  ken *pName,     
7e80: 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68   /* The token th
7e90: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  at holds the nam
7ea0: 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f  e of the view */
7eb0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
7ec0: 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43  ct,   /* A SELEC
7ed0: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
7ee0: 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
7ef0: 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69   new view */.  i
7f00: 6e 74 20 69 73 54 65 6d 70 20 20 20 20 20 20 20  nt isTemp       
7f10: 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20    /* TRUE for a 
7f20: 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a  TEMPORARY view *
7f30: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
7f40: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73  .  int n;.  cons
7f50: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b  t char *z;.  Tok
7f60: 65 6e 20 73 45 6e 64 3b 0a 0a 20 20 73 71 6c 69  en sEnd;..  sqli
7f70: 74 65 53 74 61 72 74 54 61 62 6c 65 28 70 50 61  teStartTable(pPa
7f80: 72 73 65 2c 20 70 42 65 67 69 6e 2c 20 70 4e 61  rse, pBegin, pNa
7f90: 6d 65 2c 20 69 73 54 65 6d 70 2c 20 31 29 3b 0a  me, isTemp, 1);.
7fa0: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
7fb0: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
7fc0: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
7fd0: 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
7fe0: 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  eSelectDelete(pS
7ff0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
8000: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  rn;.  }..  /* Ma
8010: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
8020: 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73   entire SELECT s
8030: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
8040: 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
8050: 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66    ** This will f
8060: 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70  orce all the Exp
8070: 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73  r.token.z values
8080: 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
8090: 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
80a0: 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f  d rather than po
80b0: 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74  int to the input
80c0: 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20   string - which 
80d0: 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20  means that.  ** 
80e0: 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73  they will persis
80f0: 74 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  t after the curr
8100: 65 6e 74 20 73 71 6c 69 74 65 5f 65 78 65 63 28  ent sqlite_exec(
8110: 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a  ) call returns..
8120: 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63    */.  p->pSelec
8130: 74 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74  t = sqliteSelect
8140: 44 75 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  Dup(pSelect);.  
8150: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65  sqliteSelectDele
8160: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69  te(pSelect);.  i
8170: 66 28 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74  f( !pParse->init
8180: 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  Flag ){.    sqli
8190: 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  teViewGetColumnN
81a0: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b  ames(pParse, p);
81b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
81c0: 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
81d0: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
81e0: 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45  tement.  Make sE
81f0: 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a  nd point to.  **
8200: 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20   the end..  */. 
8210: 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e   sEnd = pParse->
8220: 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66  sLastToken;.  if
8230: 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26  ( sEnd.z[0]!=0 &
8240: 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27  & sEnd.z[0]!=';'
8250: 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b   ){.    sEnd.z +
8260: 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20  = sEnd.n;.  }.  
8270: 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20  sEnd.n = 0;.  n 
8280: 3d 20 28 28 69 6e 74 29 73 45 6e 64 2e 7a 29 20  = ((int)sEnd.z) 
8290: 2d 20 28 69 6e 74 29 70 42 65 67 69 6e 2d 3e 7a  - (int)pBegin->z
82a0: 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e  ;.  z = pBegin->
82b0: 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  z;.  while( n>0 
82c0: 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20  && (z[n-1]==';' 
82d0: 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31  || isspace(z[n-1
82e0: 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  ])) ){ n--; }.  
82f0: 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d  sEnd.z = &z[n-1]
8300: 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a  ;.  sEnd.n = 1;.
8310: 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65  .  /* Use sqlite
8320: 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64  EndTable() to ad
8330: 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68  d the view to th
8340: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
8350: 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
8360: 65 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  eEndTable(pParse
8370: 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72  , &sEnd, 0);.  r
8380: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
8390: 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
83a0: 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65  ure pTable is re
83b0: 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69  ally a VIEW.  Fi
83c0: 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20  ll in the names 
83d0: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  of.** the column
83e0: 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e  s of the view in
83f0: 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75   the pTable stru
8400: 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74  cture.  Return t
8410: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
8420: 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65  errors.  If an e
8430: 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61  rror is seen lea
8440: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
8450: 61 67 65 20 69 6e 20 70 50 61 72 65 2d 3e 7a 45  age in pPare->zE
8460: 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
8470: 6c 69 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d  liteViewGetColum
8480: 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50  nNames(Parse *pP
8490: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
84a0: 62 6c 65 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  ble){.  ExprList
84b0: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 53 65 6c 65   *pEList;.  Sele
84c0: 63 74 20 2a 70 53 65 6c 3b 0a 20 20 54 61 62 6c  ct *pSel;.  Tabl
84d0: 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20 69 6e  e *pSelTab;.  in
84e0: 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 61  t nErr = 0;..  a
84f0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b  ssert( pTable );
8500: 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76  ..  /* A positiv
8510: 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65  e nCol means the
8520: 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66   columns names f
8530: 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65  or this view are
8540: 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e  .  ** already kn
8550: 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  own..  */.  if( 
8560: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29  pTable->nCol>0 )
8570: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
8580: 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   A negative nCol
8590: 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61   is a special ma
85a0: 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61  rker meaning tha
85b0: 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74  t we are current
85c0: 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  ly.  ** trying t
85d0: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  o compute the co
85e0: 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20  lumn names.  If 
85f0: 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f  we enter this ro
8600: 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20  utine with.  ** 
8610: 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c  a negative nCol,
8620: 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72   it means two or
8630: 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d   more views form
8640: 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68   a loop, like th
8650: 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
8660: 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e    CREATE VIEW on
8670: 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  e AS SELECT * FR
8680: 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20  OM two;.  **    
8690: 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f   CREATE VIEW two
86a0: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
86b0: 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  M one;.  **.  **
86c0: 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20   Actually, this 
86d0: 65 72 72 6f 72 20 69 73 20 63 61 75 67 68 74 20  error is caught 
86e0: 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64 20 73  previously and s
86f0: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
8700: 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  test.  ** should
8710: 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 42   always fail.  B
8720: 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65  ut we will leave
8730: 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a 75 73   it in place jus
8740: 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a 20 20  t to be safe..  
8750: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
8760: 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73  >nCol<0 ){.    s
8770: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
8780: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
8790: 20 22 76 69 65 77 20 22 2c 20 70 54 61 62 6c 65   "view ", pTable
87a0: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
87b0: 20 20 22 20 69 73 20 63 69 72 63 75 6c 61 72 6c    " is circularl
87c0: 79 20 64 65 66 69 6e 65 64 22 2c 20 30 29 3b 0a  y defined", 0);.
87d0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
87e0: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ++;.    return 1
87f0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
8800: 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
8810: 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64  it means we need
8820: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
8830: 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  table names..  *
8840: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
8850: 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 20 2f  le->pSelect ); /
8860: 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c 20 74 68  * If nCol==0, th
8870: 65 6e 20 70 54 61 62 6c 65 20 6d 75 73 74 20 62  en pTable must b
8880: 65 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 70 53  e a VIEW */.  pS
8890: 65 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 70 53 65  el = pTable->pSe
88a0: 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65  lect;..  /* Note
88b0: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74   that the call t
88c0: 6f 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65  o sqliteResultSe
88d0: 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c  tOfSelect() will
88e0: 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a   expand any.  **
88f0: 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e   "*" elements in
8900: 20 74 68 69 73 20 6c 69 73 74 2e 20 20 42 75 74   this list.  But
8910: 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   we will need to
8920: 20 72 65 73 74 6f 72 65 20 74 68 65 20 6c 69 73   restore the lis
8930: 74 0a 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69  t.  ** back to i
8940: 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66  ts original conf
8950: 69 67 75 72 61 74 69 6f 6e 20 61 66 74 65 72 77  iguration afterw
8960: 61 72 64 73 2c 20 73 6f 20 77 65 20 73 61 76 65  ards, so we save
8970: 20 61 20 63 6f 70 79 20 6f 66 0a 20 20 2a 2a 20   a copy of.  ** 
8980: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 20  the original in 
8990: 70 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 70  pEList..  */.  p
89a0: 45 4c 69 73 74 20 3d 20 70 53 65 6c 2d 3e 70 45  EList = pSel->pE
89b0: 4c 69 73 74 3b 0a 20 20 70 53 65 6c 2d 3e 70 45  List;.  pSel->pE
89c0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78 70  List = sqliteExp
89d0: 72 4c 69 73 74 44 75 70 28 70 45 4c 69 73 74 29  rListDup(pEList)
89e0: 3b 0a 20 20 69 66 28 20 70 53 65 6c 2d 3e 70 45  ;.  if( pSel->pE
89f0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
8a00: 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45  Sel->pEList = pE
8a10: 4c 69 73 74 3b 0a 20 20 20 20 72 65 74 75 72 6e  List;.    return
8a20: 20 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66   1;  /* Malloc f
8a30: 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70  ailed */.  }.  p
8a40: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31  Table->nCol = -1
8a50: 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71  ;.  pSelTab = sq
8a60: 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53  liteResultSetOfS
8a70: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c  elect(pParse, 0,
8a80: 20 70 53 65 6c 29 3b 0a 20 20 69 66 28 20 70 53   pSel);.  if( pS
8a90: 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73  elTab ){.    ass
8aa0: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f  ert( pTable->aCo
8ab0: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62  l==0 );.    pTab
8ac0: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54  le->nCol = pSelT
8ad0: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 54  ab->nCol;.    pT
8ae0: 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65  able->aCol = pSe
8af0: 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
8b00: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
8b10: 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  0;.    pSelTab->
8b20: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71  aCol = 0;.    sq
8b30: 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28  liteDeleteTable(
8b40: 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20  0, pSelTab);.   
8b50: 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 70   DbSetProperty(p
8b60: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 6c  Parse->db, pTabl
8b70: 65 2d 3e 69 44 62 2c 20 44 42 5f 55 6e 72 65 73  e->iDb, DB_Unres
8b80: 65 74 56 69 65 77 73 29 3b 0a 20 20 7d 65 6c 73  etViews);.  }els
8b90: 65 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  e{.    pTable->n
8ba0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 6e 45 72  Col = 0;.    nEr
8bb0: 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  r++;.  }.  sqlit
8bc0: 65 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 70 53  eSelectUnbind(pS
8bd0: 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70  el);.  sqliteExp
8be0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 53 65 6c  rListDelete(pSel
8bf0: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 65  ->pEList);.  pSe
8c00: 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69  l->pEList = pELi
8c10: 73 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45 72  st;.  return nEr
8c20: 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  r;  .}../*.** Cl
8c30: 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
8c40: 61 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 56 49  ames from the VI
8c50: 45 57 20 70 54 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  EW pTable..**.**
8c60: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
8c70: 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72   called whenever
8c80: 20 61 6e 79 20 6f 74 68 65 72 20 74 61 62 6c 65   any other table
8c90: 20 6f 72 20 76 69 65 77 20 69 73 20 6d 6f 64 69   or view is modi
8ca0: 66 69 65 64 2e 0a 2a 2a 20 54 68 65 20 76 69 65  fied..** The vie
8cb0: 77 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68  w passed into th
8cc0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
8cd0: 20 64 65 70 65 6e 64 20 64 69 72 65 63 74 6c 79   depend directly
8ce0: 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 0a 2a   or indirectly.*
8cf0: 2a 20 6f 6e 20 74 68 65 20 6d 6f 64 69 66 69 65  * on the modifie
8d00: 64 20 6f 72 20 64 65 6c 65 74 65 64 20 74 61 62  d or deleted tab
8d10: 6c 65 20 73 6f 20 77 65 20 6e 65 65 64 20 74 6f  le so we need to
8d20: 20 63 6c 65 61 72 20 74 68 65 20 6f 6c 64 20 63   clear the old c
8d30: 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d 65 73 20 73  olumn.** names s
8d40: 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c  o that they will
8d50: 20 62 65 20 72 65 63 6f 6d 70 75 74 65 64 2e 0a   be recomputed..
8d60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
8d70: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 43 6f  qliteViewResetCo
8d80: 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20  lumnNames(Table 
8d90: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20  *pTable){.  int 
8da0: 69 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  i;.  if( pTable=
8db0: 3d 30 20 7c 7c 20 70 54 61 62 6c 65 2d 3e 70 53  =0 || pTable->pS
8dc0: 65 6c 65 63 74 3d 3d 30 20 29 20 72 65 74 75 72  elect==0 ) retur
8dd0: 6e 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  n;.  if( pTable-
8de0: 3e 6e 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72  >nCol==0 ) retur
8df0: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
8e00: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b  pTable->nCol; i+
8e10: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  +){.    sqliteFr
8e20: 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  ee(pTable->aCol[
8e30: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  i].zName);.    s
8e40: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
8e50: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 29  ->aCol[i].zDflt)
8e60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
8e70: 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d  (pTable->aCol[i]
8e80: 2e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73  .zType);.  }.  s
8e90: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
8ea0: 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70 54 61 62 6c  ->aCol);.  pTabl
8eb0: 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  e->aCol = 0;.  p
8ec0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
8ed0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
8ee0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
8ef0: 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57   from every VIEW
8f00: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78   in database idx
8f10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8f20: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
8f30: 41 6c 6c 28 73 71 6c 69 74 65 20 2a 64 62 2c 20  All(sqlite *db, 
8f40: 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68  int idx){.  Hash
8f50: 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21  Elem *i;.  if( !
8f60: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
8f70: 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
8f80: 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e  tViews) ) return
8f90: 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
8fa0: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
8fb0: 44 62 5b 69 64 78 5d 2e 74 62 6c 48 61 73 68 29  Db[idx].tblHash)
8fc0: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
8fd0: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54  hNext(i)){.    T
8fe0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
8ff0: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
9000: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
9010: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73  elect ){.      s
9020: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 43 6f  qliteViewResetCo
9030: 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b  lumnNames(pTab);
9040: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43  .    }.  }.  DbC
9050: 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c  learProperty(db,
9060: 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
9070: 56 69 65 77 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Views);.}../*.**
9080: 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20   Given a token, 
9090: 6c 6f 6f 6b 20 75 70 20 61 20 74 61 62 6c 65 20  look up a table 
90a0: 77 69 74 68 20 74 68 61 74 20 6e 61 6d 65 2e 20  with that name. 
90b0: 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c   If not found, l
90c0: 65 61 76 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  eave.** an error
90d0: 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20   for the parser 
90e0: 74 6f 20 66 69 6e 64 20 61 6e 64 20 72 65 74 75  to find and retu
90f0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c  rn NULL..*/.Tabl
9100: 65 20 2a 73 71 6c 69 74 65 54 61 62 6c 65 46 72  e *sqliteTableFr
9110: 6f 6d 54 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70  omToken(Parse *p
9120: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54  Parse, Token *pT
9130: 6f 6b 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  ok){.  char *zNa
9140: 6d 65 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  me;.  Table *pTa
9150: 62 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  b;.  zName = sql
9160: 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d  iteTableNameFrom
9170: 54 6f 6b 65 6e 28 70 54 6f 6b 29 3b 0a 20 20 69  Token(pTok);.  i
9180: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
9190: 74 75 72 6e 20 30 3b 0a 20 20 70 54 61 62 20 3d  turn 0;.  pTab =
91a0: 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65   sqliteFindTable
91b0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
91c0: 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  me, 0);.  sqlite
91d0: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69  Free(zName);.  i
91e0: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
91f0: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
9200: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
9210: 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  Msg, "no such ta
9220: 62 6c 65 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20  ble: ", 0, .    
9230: 20 20 20 20 70 54 6f 6b 2d 3e 7a 2c 20 70 54 6f      pTok->z, pTo
9240: 6b 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50  k->n, 0);.    pP
9250: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
9260: 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  }.  return pTab;
9270: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
9280: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
9290: 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20   to do the work 
92a0: 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20  of a DROP TABLE 
92b0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e  statement..** pN
92c0: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
92d0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
92e0: 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76  be dropped..*/.v
92f0: 6f 69 64 20 73 71 6c 69 74 65 44 72 6f 70 54 61  oid sqliteDropTa
9300: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
9310: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  e, Token *pName,
9320: 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20   int isView){.  
9330: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
9340: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
9350: 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65 20 2a  base;.  sqlite *
9360: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
9370: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69  .  int iDb;..  i
9380: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
9390: 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  || sqlite_malloc
93a0: 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  _failed ) return
93b0: 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  ;.  pTable = sql
93c0: 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65  iteTableFromToke
93d0: 6e 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 29  n(pParse, pName)
93e0: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ;.  if( pTable==
93f0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 44  0 ) return;.  iD
9400: 62 20 3d 20 70 54 61 62 6c 65 2d 3e 69 44 62 3b  b = pTable->iDb;
9410: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
9420: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
9430: 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
9440: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
9450: 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
9460: 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73  t code;.    cons
9470: 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
9480: 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 54 61 62  CHEMA_TABLE(pTab
9490: 6c 65 2d 3e 69 44 62 29 3b 0a 20 20 20 20 63 6f  le->iDb);.    co
94a0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
94b0: 64 62 2d 3e 61 44 62 5b 70 54 61 62 6c 65 2d 3e  db->aDb[pTable->
94c0: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
94d0: 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68  if( sqliteAuthCh
94e0: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
94f0: 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
9500: 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20   0, zDb)){.     
9510: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
9520: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
9530: 0a 20 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d  .      if( iDb==
9540: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
9550: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
9560: 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  TEMP_VIEW;.     
9570: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9580: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
9590: 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  OP_VIEW;.      }
95a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
95b0: 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a    if( iDb==1 ){.
95c0: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
95d0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
95e0: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  TABLE;.      }el
95f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
9600: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
9610: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
9620: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
9630: 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  teAuthCheck(pPar
9640: 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 6c 65  se, code, pTable
9650: 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  ->zName, 0, zDb)
9660: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
9670: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9680: 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28  sqliteAuthCheck(
9690: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
96a0: 45 4c 45 54 45 2c 20 70 54 61 62 6c 65 2d 3e 7a  ELETE, pTable->z
96b0: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
96c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
96d0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
96e0: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 72 65    if( pTable->re
96f0: 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71  adOnly ){.    sq
9700: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
9710: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
9720: 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 6c 65  "table ", pTable
9730: 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ->zName, .      
9740: 20 22 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72   " may not be dr
9750: 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  opped", 0);.    
9760: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
9770: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
9780: 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20    if( isView && 
9790: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3d  pTable->pSelect=
97a0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
97b0: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
97c0: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 73 65  e->zErrMsg, "use
97d0: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64   DROP TABLE to d
97e0: 65 6c 65 74 65 20 74 61 62 6c 65 20 22 2c 0a 20  elete table ",. 
97f0: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61       pTable->zNa
9800: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  me, 0);.    pPar
9810: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
9820: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
9830: 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61  ( !isView && pTa
9840: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  ble->pSelect ){.
9850: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
9860: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
9870: 72 4d 73 67 2c 20 22 75 73 65 20 44 52 4f 50 20  rMsg, "use DROP 
9880: 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76  VIEW to delete v
9890: 69 65 77 20 22 2c 0a 20 20 20 20 20 20 70 54 61  iew ",.      pTa
98a0: 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  ble->zName, 0);.
98b0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
98c0: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
98d0: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
98e0: 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
98f0: 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  e the table from
9900: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
9910: 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a  e.  ** on disk..
9920: 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
9930: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
9940: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
9950: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64   static VdbeOp d
9960: 72 6f 70 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20  ropTable[] = {. 
9970: 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64       { OP_Rewind
9980: 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28 38 29  ,     0, ADDR(8)
9990: 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ,  0},.      { O
99a0: 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c  P_String,     0,
99b0: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   0,        0}, /
99c0: 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 1 */.      { O
99d0: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c  P_MemStore,   1,
99e0: 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   1,        0},. 
99f0: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61       { OP_MemLoa
9a00: 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  d,    1, 0,     
9a10: 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20     0}, /* 3 */. 
9a20: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
9a30: 2c 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20  ,     0, 2,     
9a40: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
9a50: 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 30 2c  P_Ne,         0,
9a60: 20 41 44 44 52 28 37 29 2c 20 20 30 7d 2c 0a 20   ADDR(7),  0},. 
9a70: 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65       { OP_Delete
9a80: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
9a90: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
9aa0: 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c  P_Next,       0,
9ab0: 20 41 44 44 52 28 33 29 2c 20 20 30 7d 2c 20 2f   ADDR(3),  0}, /
9ac0: 2a 20 37 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  * 7 */.    };.  
9ad0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
9ae0: 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69     Trigger *pTri
9af0: 67 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  gger;.    sqlite
9b00: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
9b10: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ion(pParse, 0, p
9b20: 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 0a 20 20  Table->iDb);..  
9b30: 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72    /* Drop all tr
9b40: 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65  iggers associate
9b50: 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
9b60: 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 2a   being dropped *
9b70: 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d  /.    pTrigger =
9b80: 20 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65   pTable->pTrigge
9b90: 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54  r;.    while( pT
9ba0: 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20  rigger ){.      
9bb0: 53 72 63 4c 69 73 74 20 2a 70 4e 6d 3b 0a 20 20  SrcList *pNm;.  
9bc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69      assert( pTri
9bd0: 67 67 65 72 2d 3e 69 44 62 3d 3d 70 54 61 62 6c  gger->iDb==pTabl
9be0: 65 2d 3e 69 44 62 20 7c 7c 20 70 54 72 69 67 67  e->iDb || pTrigg
9bf0: 65 72 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20  er->iDb==1 );.  
9c00: 20 20 20 20 70 4e 6d 20 3d 20 73 71 6c 69 74 65      pNm = sqlite
9c10: 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 30 2c  SrcListAppend(0,
9c20: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e   0, 0);.      pN
9c30: 6d 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  m->a[0].zName = 
9c40: 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 54 72  sqliteStrDup(pTr
9c50: 69 67 67 65 72 2d 3e 6e 61 6d 65 29 3b 0a 20 20  igger->name);.  
9c60: 20 20 20 20 70 4e 6d 2d 3e 61 5b 30 5d 2e 7a 44      pNm->a[0].zD
9c70: 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65  atabase = sqlite
9c80: 53 74 72 44 75 70 28 64 62 2d 3e 61 44 62 5b 70  StrDup(db->aDb[p
9c90: 54 61 62 6c 65 2d 3e 69 44 62 5d 2e 7a 4e 61 6d  Table->iDb].zNam
9ca0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
9cb0: 44 72 6f 70 54 72 69 67 67 65 72 28 70 50 61 72  DropTrigger(pPar
9cc0: 73 65 2c 20 70 4e 6d 2c 20 31 29 3b 0a 20 20 20  se, pNm, 1);.   
9cd0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65     if( pParse->e
9ce0: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20  xplain ){.      
9cf0: 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72    pTrigger = pTr
9d00: 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  igger->pNext;.  
9d10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9d20: 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
9d30: 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72 3b 0a  able->pTrigger;.
9d40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
9d50: 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53     /* Drop all S
9d60: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 65 6e 74  QLITE_MASTER ent
9d70: 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20  ries that refer 
9d80: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  to the table */.
9d90: 20 20 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61      sqliteOpenMa
9da0: 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70 54 61  sterTable(v, pTa
9db0: 62 6c 65 2d 3e 69 44 62 29 3b 0a 20 20 20 20 62  ble->iDb);.    b
9dc0: 61 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ase = sqliteVdbe
9dd0: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
9de0: 61 79 53 69 7a 65 28 64 72 6f 70 54 61 62 6c 65  aySize(dropTable
9df0: 29 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a 20  ), dropTable);. 
9e00: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
9e10: 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31 2c  ngeP3(v, base+1,
9e20: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20   pTable->zName, 
9e30: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70  0);..    /* Drop
9e40: 20 61 6c 6c 20 53 51 4c 49 54 45 5f 54 45 4d 50   all SQLITE_TEMP
9e50: 5f 4d 41 53 54 45 52 20 65 6e 74 72 69 65 73 20  _MASTER entries 
9e60: 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
9e70: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  e table */.    i
9e80: 66 28 20 70 54 61 62 6c 65 2d 3e 69 44 62 21 3d  f( pTable->iDb!=
9e90: 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
9ea0: 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  eOpenMasterTable
9eb0: 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 61  (v, 1);.      ba
9ec0: 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  se = sqliteVdbeA
9ed0: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
9ee0: 79 53 69 7a 65 28 64 72 6f 70 54 61 62 6c 65 29  ySize(dropTable)
9ef0: 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a 20 20  , dropTable);.  
9f00: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
9f10: 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31  angeP3(v, base+1
9f20: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c  , pTable->zName,
9f30: 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   0);.    }..    
9f40: 69 66 28 20 70 54 61 62 6c 65 2d 3e 69 44 62 3d  if( pTable->iDb=
9f50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
9f60: 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  teChangeCookie(d
9f70: 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  b, v);.    }.   
9f80: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
9f90: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
9fa0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73   0);.    if( !is
9fb0: 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 73 71  View ){.      sq
9fc0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
9fd0: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 54 61   OP_Destroy, pTa
9fe0: 62 6c 65 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 6c  ble->tnum, pTabl
9ff0: 65 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 66  e->iDb);.      f
a000: 6f 72 28 70 49 64 78 3d 70 54 61 62 6c 65 2d 3e  or(pIdx=pTable->
a010: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
a020: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
a030: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
a040: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
a050: 65 73 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e  estroy, pIdx->tn
a060: 75 6d 2c 20 70 49 64 78 2d 3e 69 44 62 29 3b 0a  um, pIdx->iDb);.
a070: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a080: 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65    sqliteEndWrite
a090: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
a0a0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
a0b0: 65 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ete the in-memor
a0c0: 79 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  y description of
a0d0: 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2a   the table..  **
a0e0: 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a  .  ** Exception:
a0f0: 20 69 66 20 74 68 65 20 53 51 4c 20 73 74 61 74   if the SQL stat
a100: 65 6d 65 6e 74 20 62 65 67 61 6e 20 77 69 74 68  ement began with
a110: 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79   the EXPLAIN key
a120: 77 6f 72 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  word,.  ** then 
a130: 6e 6f 20 63 68 61 6e 67 65 73 20 73 68 6f 75 6c  no changes shoul
a140: 64 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a  d be made..  */.
a150: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65    if( !pParse->e
a160: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73 71  xplain ){.    sq
a170: 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  liteUnlinkAndDel
a180: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61  eteTable(db, pTa
a190: 62 6c 65 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c  ble);.    db->fl
a1a0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
a1b0: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d  ternChanges;.  }
a1c0: 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  .  sqliteViewRes
a1d0: 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a  etAll(db, iDb);.
a1e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
a1f0: 75 74 69 6e 65 20 63 6f 6e 73 74 72 75 63 74 73  utine constructs
a200: 20 61 20 50 33 20 73 74 72 69 6e 67 20 73 75 69   a P3 string sui
a210: 74 61 62 6c 65 20 66 6f 72 20 61 6e 20 4f 50 5f  table for an OP_
a220: 4d 61 6b 65 49 64 78 4b 65 79 0a 2a 2a 20 6f 70  MakeIdxKey.** op
a230: 63 6f 64 65 20 61 6e 64 20 61 64 64 73 20 74 68  code and adds th
a240: 61 74 20 50 33 20 73 74 72 69 6e 67 20 74 6f 20  at P3 string to 
a250: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
a260: 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72  y inserted instr
a270: 75 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65  uction.** in the
a280: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
a290: 2e 20 20 54 68 65 20 50 33 20 73 74 72 69 6e 67  .  The P3 string
a2a0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
a2b0: 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72 0a  ingle character.
a2c0: 2a 2a 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ** for each colu
a2d0: 6d 6e 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  mn in the index 
a2e0: 70 49 64 78 20 6f 66 20 74 61 62 6c 65 20 70 54  pIdx of table pT
a2f0: 61 62 2e 20 20 49 66 20 74 68 65 20 63 6f 6c 75  ab.  If the colu
a300: 6d 6e 20 75 73 65 73 0a 2a 2a 20 61 20 6e 75 6d  mn uses.** a num
a310: 65 72 69 63 20 73 6f 72 74 20 6f 72 64 65 72 2c  eric sort order,
a320: 20 74 68 65 6e 20 74 68 65 20 50 33 20 73 74 72   then the P3 str
a330: 69 6e 67 20 63 68 61 72 61 63 74 65 72 20 63 6f  ing character co
a340: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0a 2a  rresponding to.*
a350: 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 73  * that column is
a360: 20 27 6e 27 2e 20 20 49 66 20 74 68 65 20 63 6f   'n'.  If the co
a370: 6c 75 6d 6e 20 75 73 65 73 20 61 20 74 65 78 74  lumn uses a text
a380: 20 73 6f 72 74 20 6f 72 64 65 72 2c 20 74 68 65   sort order, the
a390: 6e 20 74 68 65 0a 2a 2a 20 50 33 20 73 74 72 69  n the.** P3 stri
a3a0: 6e 67 20 69 73 20 27 74 27 2e 20 20 53 65 65 20  ng is 't'.  See 
a3b0: 74 68 65 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65  the OP_MakeIdxKe
a3c0: 79 20 6f 70 63 6f 64 65 20 64 6f 63 75 6d 65 6e  y opcode documen
a3d0: 74 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 64  tation for.** ad
a3e0: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
a3f0: 74 69 6f 6e 2e 20 20 53 65 65 20 61 6c 73 6f 20  tion.  See also 
a400: 74 68 65 20 73 71 6c 69 74 65 41 64 64 4b 65 79  the sqliteAddKey
a410: 54 79 70 65 28 29 20 72 6f 75 74 69 6e 65 2e 0a  Type() routine..
a420: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64  */.void sqliteAd
a430: 64 49 64 78 4b 65 79 54 79 70 65 28 56 64 62 65  dIdxKeyType(Vdbe
a440: 20 2a 76 2c 20 49 6e 64 65 78 20 2a 70 49 64 78   *v, Index *pIdx
a450: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65  ){.  char *zType
a460: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
a470: 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61  .  int i, n;.  a
a480: 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 26  ssert( pIdx!=0 &
a490: 26 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 21 3d  & pIdx->pTable!=
a4a0: 30 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 70 49  0 );.  pTab = pI
a4b0: 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 6e 20  dx->pTable;.  n 
a4c0: 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  = pIdx->nColumn;
a4d0: 0a 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74  .  zType = sqlit
a4e0: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 2b 31 20  eMallocRaw( n+1 
a4f0: 29 3b 0a 20 20 69 66 28 20 7a 54 79 70 65 3d 3d  );.  if( zType==
a500: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
a510: 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
a520: 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  {.    int iCol =
a530: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
a540: 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
a550: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
a560: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
a570: 20 20 69 66 28 20 28 70 54 61 62 2d 3e 61 43 6f    if( (pTab->aCo
a580: 6c 5b 69 43 6f 6c 5d 2e 73 6f 72 74 4f 72 64 65  l[iCol].sortOrde
a590: 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f 54 59  r & SQLITE_SO_TY
a5a0: 50 45 4d 41 53 4b 29 3d 3d 53 51 4c 49 54 45 5f  PEMASK)==SQLITE_
a5b0: 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  SO_TEXT ){.     
a5c0: 20 7a 54 79 70 65 5b 69 5d 20 3d 20 27 74 27 3b   zType[i] = 't';
a5d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a5e0: 20 20 7a 54 79 70 65 5b 69 5d 20 3d 20 27 6e 27    zType[i] = 'n'
a5f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 54  ;.    }.  }.  zT
a600: 79 70 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 73 71  ype[n] = 0;.  sq
a610: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
a620: 28 76 2c 20 2d 31 2c 20 7a 54 79 70 65 2c 20 6e  (v, -1, zType, n
a630: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
a640: 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zType);.}../*.**
a650: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
a660: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
a670: 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20  e a new foreign 
a680: 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  key on the table
a690: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
a6a0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
a6b0: 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65  .  pFromCol dete
a6c0: 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c  rmines which col
a6d0: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63  umns.** in the c
a6e0: 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69  urrent table poi
a6f0: 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67  nt to the foreig
a700: 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d  n key.  If pFrom
a710: 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63  Col==0 then.** c
a720: 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74  onnect the key t
a730: 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  o the last colum
a740: 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f  n inserted.  pTo
a750: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a   is the name of.
a760: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66  ** the table ref
a770: 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f  erred to.  pToCo
a780: 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74  l is a list of t
a790: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68  ables in the oth
a7a0: 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20  er.** pTo table 
a7b0: 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e  that the foreign
a7c0: 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20   key points to. 
a7d0: 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20   flags contains 
a7e0: 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  all.** informati
a7f0: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  on about the con
a800: 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
a810: 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63   algorithms spec
a820: 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  ified.** in the 
a830: 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50  ON DELETE, ON UP
a840: 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45  DATE and ON INSE
a850: 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  RT clauses..**.*
a860: 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74  * An FKey struct
a870: 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61  ure is created a
a880: 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
a890: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a  table currently.
a8a0: 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ** under constru
a8b0: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61  ction in the pPa
a8c0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66  rse->pNewTable f
a8d0: 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20 46  ield.  The new F
a8e0: 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69  Key.** is not li
a8f0: 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46  nked into db->aF
a900: 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e  Key at this poin
a910: 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  t - that does no
a920: 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69  t happen.** unti
a930: 6c 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65  l sqliteEndTable
a940: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ()..**.** The fo
a950: 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74  reign key is set
a960: 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70   for IMMEDIATE p
a970: 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75  rocessing.  A su
a980: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a  bsequent call.**
a990: 20 74 6f 20 73 71 6c 69 74 65 44 65 66 65 72 46   to sqliteDeferF
a9a0: 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68  oreignKey() migh
a9b0: 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f  t change this to
a9c0: 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f   DEFERRED..*/.vo
a9d0: 69 64 20 73 71 6c 69 74 65 43 72 65 61 74 65 46  id sqliteCreateF
a9e0: 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72  oreignKey(.  Par
a9f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
aa00: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
aa10: 74 65 78 74 20 2a 2f 0a 20 20 49 64 4c 69 73 74  text */.  IdList
aa20: 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 20 20 2f   *pFromCol,    /
aa30: 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69  * Columns in thi
aa40: 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69  s table that poi
aa50: 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c  nt to other tabl
aa60: 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  e */.  Token *pT
aa70: 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  o,          /* N
aa80: 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72  ame of the other
aa90: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 64 4c 69   table */.  IdLi
aaa0: 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 20  st *pToCol,     
aab0: 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
aac0: 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
aad0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
aae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
aaf0: 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
ab00: 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29  algorithms. */.)
ab10: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70  {.  Table *p = p
ab20: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
ab30: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
ab40: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43   int i;.  int nC
ab50: 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  ol;.  char *z;. 
ab60: 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30   FKey *pFKey = 0
ab70: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  ;..  assert( pTo
ab80: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
ab90: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
aba0: 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  r ) goto fk_end;
abb0: 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
abc0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  =0 ){.    int iC
abd0: 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  ol = p->nCol-1;.
abe0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
abf0: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
ac00: 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20    if( pToCol && 
ac10: 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 31 20 29  pToCol->nId!=1 )
ac20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  {.      sqliteSe
ac30: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
ac40: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 66 6f 72 65  ->zErrMsg, "fore
ac50: 69 67 6e 20 6b 65 79 20 6f 6e 20 22 2c 20 2d 31  ign key on ", -1
ac60: 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43  ,.         p->aC
ac70: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20  ol[iCol].zName, 
ac80: 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 22 20  -1, .         " 
ac90: 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65  should reference
aca0: 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e   only one column
acb0: 20 6f 66 20 74 61 62 6c 65 20 22 2c 20 2d 31 2c   of table ", -1,
acc0: 0a 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 7a  .         pTo->z
acd0: 2c 20 70 54 6f 2d 3e 6e 2c 20 30 29 3b 0a 20 20  , pTo->n, 0);.  
ace0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
acf0: 2b 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  ++;.      goto f
ad00: 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  k_end;.    }.   
ad10: 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c   nCol = 1;.  }el
ad20: 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26  se if( pToCol &&
ad30: 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 70 46   pToCol->nId!=pF
ad40: 72 6f 6d 43 6f 6c 2d 3e 6e 49 64 20 29 7b 0a 20  romCol->nId ){. 
ad50: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
ad60: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
ad70: 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 22 6e  Msg, .        "n
ad80: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
ad90: 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
ada0: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
adb0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20  he number of ". 
adc0: 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20         "columns 
add0: 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  in the reference
ade0: 64 20 74 61 62 6c 65 22 2c 20 30 29 3b 0a 20 20  d table", 0);.  
adf0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
ae00: 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  ;.    goto fk_en
ae10: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
ae20: 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d  nCol = pFromCol-
ae30: 3e 6e 49 64 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  >nId;.  }.  nByt
ae40: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65  e = sizeof(*pFKe
ae50: 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66  y) + nCol*sizeof
ae60: 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29  (pFKey->aCol[0])
ae70: 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20   + pTo->n + 1;. 
ae80: 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
ae90: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
aea0: 6f 43 6f 6c 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  oCol->nId; i++){
aeb0: 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
aec0: 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61  strlen(pToCol->a
aed0: 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a  [i].zName) + 1;.
aee0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65      }.  }.  pFKe
aef0: 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  y = sqliteMalloc
af00: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
af10: 20 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f   pFKey==0 ) goto
af20: 20 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79   fk_end;.  pFKey
af30: 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70  ->pFrom = p;.  p
af40: 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20  FKey->pNextFrom 
af50: 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20  = p->pFKey;.  z 
af60: 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b  = (char*)&pFKey[
af70: 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f  1];.  pFKey->aCo
af80: 6c 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c  l = (struct sCol
af90: 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73  Map*)z;.  z += s
afa0: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f  izeof(struct sCo
afb0: 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46  lMap)*nCol;.  pF
afc0: 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20  Key->zTo = z;.  
afd0: 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a  memcpy(z, pTo->z
afe0: 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70  , pTo->n);.  z[p
aff0: 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20  To->n] = 0;.  z 
b000: 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70  += pTo->n+1;.  p
b010: 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20  FKey->pNextTo = 
b020: 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c  0;.  pFKey->nCol
b030: 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70   = nCol;.  if( p
b040: 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
b050: 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d    pFKey->aCol[0]
b060: 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c  .iFrom = p->nCol
b070: 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
b080: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
b090: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
b0a0: 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
b0b0: 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a  =0; j<p->nCol; j
b0c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
b0d0: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70   sqliteStrICmp(p
b0e0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
b0f0: 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
b100: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
b110: 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43         pFKey->aC
b120: 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b  ol[i].iFrom = j;
b130: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
b140: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b150: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e    }.      if( j>
b160: 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  =p->nCol ){.    
b170: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
b180: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
b190: 72 4d 73 67 2c 20 22 75 6e 6b 6e 6f 77 6e 20 63  rMsg, "unknown c
b1a0: 6f 6c 75 6d 6e 20 5c 22 22 2c 20 0a 20 20 20 20  olumn \"", .    
b1b0: 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e        pFromCol->
b1c0: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 22 5c 22 20  a[i].zName, "\" 
b1d0: 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
b1e0: 65 66 69 6e 69 74 69 6f 6e 22 2c 20 30 29 3b 0a  efinition", 0);.
b1f0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
b200: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
b210: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
b220: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
b230: 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
b240: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
b250: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
b260: 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70  int n = strlen(p
b270: 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
b280: 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
b290: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
b2a0: 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  z;.      memcpy(
b2b0: 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
b2c0: 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
b2d0: 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[n] = 0;.     
b2e0: 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d   z += n+1;.    }
b2f0: 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73  .  }.  pFKey->is
b300: 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20  Deferred = 0;.  
b310: 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e  pFKey->deleteCon
b320: 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66 66  f = flags & 0xff
b330: 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61 74  ;.  pFKey->updat
b340: 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e  eConf = (flags >
b350: 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20 20  > 8 ) & 0xff;.  
b360: 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e  pFKey->insertCon
b370: 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31 36  f = (flags >> 16
b380: 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a   ) & 0xff;..  /*
b390: 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67   Link the foreig
b3a0: 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62  n key to the tab
b3b0: 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73  le as the last s
b3c0: 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  tep..  */.  p->p
b3d0: 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20  FKey = pFKey;.  
b3e0: 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65  pFKey = 0;..fk_e
b3f0: 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65  nd:.  sqliteFree
b400: 28 70 46 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74  (pFKey);.  sqlit
b410: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 46  eIdListDelete(pF
b420: 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  romCol);.  sqlit
b430: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 54  eIdListDelete(pT
b440: 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  oCol);.}../*.** 
b450: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
b460: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49  called when an I
b470: 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
b480: 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  TE or INITIALLY 
b490: 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75  DEFERRED.** clau
b4a0: 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61  se is seen as pa
b4b0: 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20  rt of a foreign 
b4c0: 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20  key definition. 
b4d0: 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a   The isDeferred.
b4e0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
b4f0: 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  1 for INITIALLY 
b500: 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66  DEFERRED and 0 f
b510: 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  or INITIALLY IMM
b520: 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62  EDIATE..** The b
b530: 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d  ehavior of the m
b540: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65  ost recently cre
b550: 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  ated foreign key
b560: 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20   is adjusted.** 
b570: 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a  accordingly..*/.
b580: 76 6f 69 64 20 73 71 6c 69 74 65 44 65 66 65 72  void sqliteDefer
b590: 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65  ForeignKey(Parse
b5a0: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73   *pParse, int is
b5b0: 44 65 66 65 72 72 65 64 29 7b 0a 20 20 54 61 62  Deferred){.  Tab
b5c0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79  le *pTab;.  FKey
b5d0: 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28   *pFKey;.  if( (
b5e0: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
b5f0: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20  NewTable)==0 || 
b600: 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70  (pFKey = pTab->p
b610: 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72  FKey)==0 ) retur
b620: 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65  n;.  pFKey->isDe
b630: 66 65 72 72 65 64 20 3d 20 69 73 44 65 66 65 72  ferred = isDefer
b640: 72 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  red;.}../*.** Cr
b650: 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78  eate a new index
b660: 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c   for an SQL tabl
b670: 65 2e 20 20 70 49 6e 64 65 78 20 69 73 20 74 68  e.  pIndex is th
b680: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
b690: 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 61 62  dex .** and pTab
b6a0: 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  le is the name o
b6b0: 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  f the table that
b6c0: 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
b6d0: 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a  d.  Both will .*
b6e0: 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20  * be NULL for a 
b6f0: 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61  primary key or a
b700: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  n index that is 
b710: 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73  created to satis
b720: 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63  fy a.** UNIQUE c
b730: 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70  onstraint.  If p
b740: 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78  Table and pIndex
b750: 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70   are NULL, use p
b760: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
b770: 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65  .** as the table
b780: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
b790: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
b7a0: 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68  le is a table th
b7b0: 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  at is.** current
b7c0: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
b7d0: 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45  cted by a CREATE
b7e0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
b7f0: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73  ..**.** pList is
b800: 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   a list of colum
b810: 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
b820: 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65  .  pList will be
b830: 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a   NULL if this.**
b840: 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65   is a primary ke
b850: 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73  y or unique-cons
b860: 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f  traint on the mo
b870: 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e  st recent column
b880: 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65   added.** to the
b890: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
b8a0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
b8b0: 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73  ion.  .*/.void s
b8c0: 71 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65 78  qliteCreateIndex
b8d0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
b8e0: 65 2c 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f  e,   /* All info
b8f0: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
b900: 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f  is parse */.  To
b910: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f  ken *pName,    /
b920: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
b930: 64 65 78 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  dex.  May be NUL
b940: 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  L */.  SrcList *
b950: 70 54 61 62 6c 65 2c 20 2f 2a 20 4e 61 6d 65 20  pTable, /* Name 
b960: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
b970: 69 6e 64 65 78 2e 20 20 55 73 65 20 70 50 61 72  index.  Use pPar
b980: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66  se->pNewTable if
b990: 20 30 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a   0 */.  IdList *
b9a0: 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69  pList,   /* A li
b9b0: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
b9c0: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
b9d0: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
b9e0: 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f    /* OE_Abort, O
b9f0: 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70  E_Ignore, OE_Rep
ba00: 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65  lace, or OE_None
ba10: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
ba20: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
ba30: 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  f this is a temp
ba40: 6f 72 61 72 79 20 69 6e 64 65 78 20 2a 2f 0a 20  orary index */. 
ba50: 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20   Token *pStart, 
ba60: 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
ba70: 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
ba80: 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  s a CREATE TABLE
ba90: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
baa0: 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20  Token *pEnd     
bab0: 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74   /* The ")" that
bac0: 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41   closes the CREA
bad0: 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
bae0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  nt */.){.  Table
baf0: 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54   *pTab;     /* T
bb00: 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
bb10: 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
bb20: 49 6e 64 65 78 3b 20 20 20 2f 2a 20 54 68 65 20  Index;   /* The 
bb30: 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61  index to be crea
bb40: 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ted */.  char *z
bb50: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Name = 0;.  int 
bb60: 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75  i, j;.  Token nu
bb70: 6c 6c 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  llId;           
bb80: 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20    /* Fake token 
bb90: 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20  for an empty ID 
bba0: 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  list */.  sqlite
bbb0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
bbc0: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
bbd0: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
bbe0: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
bbf0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
bc00: 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20  e_index;..  /*. 
bc10: 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62   ** Find the tab
bc20: 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
bc30: 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72   indexed.  Retur
bc40: 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66  n early if not f
bc50: 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ound..  */.  if(
bc60: 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20   pTable!=0 ){.  
bc70: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 21    assert( pName!
bc80: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
bc90: 28 20 70 54 61 62 6c 65 2d 3e 6e 53 72 63 3d 3d  ( pTable->nSrc==
bca0: 31 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  1 );.    pTab = 
bcb0: 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 4c 6f   sqliteSrcListLo
bcc0: 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 61  okup(pParse, pTa
bcd0: 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ble);.  }else{. 
bce0: 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
bcf0: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20  ==0 );.    pTab 
bd00: 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  =  pParse->pNewT
bd10: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
bd20: 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73  pTab==0 || pPars
bd30: 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65  e->nErr ) goto e
bd40: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
bd50: 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65  ;.  if( pTab->re
bd60: 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71  adOnly ){.    sq
bd70: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
bd80: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
bd90: 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e  "table ", pTab->
bda0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 22 20 6d  zName,.      " m
bdb0: 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
bdc0: 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  d", 0);.    pPar
bdd0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
bde0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
bdf0: 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
be00: 28 20 21 69 73 54 65 6d 70 20 26 26 20 70 54 61  ( !isTemp && pTa
be10: 62 2d 3e 69 44 62 3e 3d 32 20 26 26 20 70 50 61  b->iDb>=2 && pPa
be20: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 3d 3d 30  rse->initFlag==0
be30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
be40: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
be50: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65  >zErrMsg, "table
be60: 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   ", pTab->zName,
be70: 20 0a 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f   .      " may no
be80: 74 20 68 61 76 65 20 6e 6f 6e 2d 74 65 6d 70 6f  t have non-tempo
be90: 72 61 72 79 20 69 6e 64 69 63 65 73 20 61 64 64  rary indices add
bea0: 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ed", 0);.    pPa
beb0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
bec0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
bed0: 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  e_index;.  }.  i
bee0: 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
bef0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
bf00: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
bf10: 3e 7a 45 72 72 4d 73 67 2c 20 22 76 69 65 77 73  >zErrMsg, "views
bf20: 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
bf30: 78 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50  xed", 0);.    pP
bf40: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
bf50: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
bf60: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
bf70: 69 66 28 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31  if( pTab->iDb==1
bf80: 20 29 7b 0a 20 20 20 20 69 73 54 65 6d 70 20 3d   ){.    isTemp =
bf90: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20   1;.  }..  /*.  
bfa0: 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65  ** Find the name
bfb0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
bfc0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
bfd0: 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
bfe0: 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65  nother.  ** inde
bff0: 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20  x or table with 
c000: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
c010: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
c020: 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65  tion:  If we are
c030: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d   reading the nam
c040: 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20  es of permanent 
c050: 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65  indices from the
c060: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73  .  ** sqlite_mas
c070: 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75  ter table (becau
c080: 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
c090: 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68  ocess changed th
c0a0: 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20  e schema) and.  
c0b0: 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  ** one of the in
c0c0: 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64  dex names collid
c0d0: 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  es with the name
c0e0: 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   of a temporary 
c0f0: 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e  table or.  ** in
c100: 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c  dex, then we wil
c110: 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72  l continue to pr
c120: 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78  ocess this index
c130: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
c140: 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
c150: 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a   that we are.  *
c160: 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  * dealing with a
c170: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
c180: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
c190: 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  t.  We have to i
c1a0: 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f  nvent our.  ** o
c1b0: 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  wn name..  */.  
c1c0: 69 66 28 20 70 4e 61 6d 65 20 26 26 20 21 70 50  if( pName && !pP
c1d0: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29  arse->initFlag )
c1e0: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 53  {.    Index *pIS
c1f0: 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41  ameName;    /* A
c200: 6e 6f 74 68 65 72 20 69 6e 64 65 78 20 77 69 74  nother index wit
c210: 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
c220: 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
c230: 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  SameName;    /* 
c240: 41 20 74 61 62 6c 65 20 77 69 74 68 20 73 61 6d  A table with sam
c250: 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 69 6e  e name as the in
c260: 64 65 78 20 2a 2f 0a 20 20 20 20 7a 4e 61 6d 65  dex */.    zName
c270: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
c280: 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65  (pName->z, pName
c290: 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  ->n);.    if( zN
c2a0: 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ame==0 ) goto ex
c2b0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
c2c0: 0a 20 20 20 20 69 66 28 20 28 70 49 53 61 6d 65  .    if( (pISame
c2d0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 46 69 6e  Name = sqliteFin
c2e0: 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
c2f0: 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 0))!=0 ){.    
c300: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
c310: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
c320: 73 67 2c 20 22 69 6e 64 65 78 20 22 2c 20 7a 4e  sg, "index ", zN
c330: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 22  ame, .         "
c340: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
c350: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
c360: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
c370: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
c380: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
c390: 20 20 20 20 69 66 28 20 28 70 54 53 61 6d 65 4e      if( (pTSameN
c3a0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  ame = sqliteFind
c3b0: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
c3c0: 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   0))!=0 ){.     
c3d0: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
c3e0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
c3f0: 67 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  g, "there is alr
c400: 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d  eady a table nam
c410: 65 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 7a  ed ",.         z
c420: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Name, 0);.      
c430: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
c440: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
c450: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
c460: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
c470: 70 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pName==0 ){.    
c480: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
c490: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e     int n;.    In
c4a0: 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  dex *pLoop;.    
c4b0: 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e  for(pLoop=pTab->
c4c0: 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f  pIndex, n=1; pLo
c4d0: 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
c4e0: 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20  >pNext, n++){}. 
c4f0: 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
c500: 22 25 64 29 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e  "%d)",n);.    zN
c510: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ame = 0;.    sql
c520: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e  iteSetString(&zN
c530: 61 6d 65 2c 20 22 28 22 2c 20 70 54 61 62 2d 3e  ame, "(", pTab->
c540: 7a 4e 61 6d 65 2c 20 22 20 61 75 74 6f 69 6e 64  zName, " autoind
c550: 65 78 20 22 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  ex ", zBuf, 0);.
c560: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
c570: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
c580: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 65 6c  ate_index;.  }el
c590: 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  se{.    zName = 
c5a0: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e  sqliteStrNDup(pN
c5b0: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
c5c0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  );.  }..  /* Che
c5d0: 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61  ck for authoriza
c5e0: 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61  tion to create a
c5f0: 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69  n index..  */.#i
c600: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c610: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
c620: 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68    {.    const ch
c630: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
c640: 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61  b[pTab->iDb].zNa
c650: 6d 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  me;..    assert(
c660: 20 69 73 54 65 6d 70 3d 3d 30 20 7c 7c 20 69 73   isTemp==0 || is
c670: 54 65 6d 70 3d 3d 31 20 29 3b 0a 20 20 20 20 61  Temp==1 );.    a
c680: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 44 62  ssert( pTab->iDb
c690: 3d 3d 70 50 61 72 73 65 2d 3e 69 44 62 20 7c 7c  ==pParse->iDb ||
c6a0: 20 69 73 54 65 6d 70 3d 3d 31 20 29 3b 0a 20 20   isTemp==1 );.  
c6b0: 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68    if( sqliteAuth
c6c0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
c6d0: 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
c6e0: 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70  EMA_TABLE(isTemp
c6f0: 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  ), 0, zDb) ){.  
c700: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
c710: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
c720: 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45  }.    i = SQLITE
c730: 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20  _CREATE_INDEX;. 
c740: 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 20     if( isTemp ) 
c750: 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
c760: 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  E_TEMP_INDEX;.  
c770: 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68    if( sqliteAuth
c780: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c  Check(pParse, i,
c790: 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e   zName, pTab->zN
c7a0: 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ame, zDb) ){.   
c7b0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
c7c0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
c7d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
c7e0: 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69  * If pList==0, i
c7f0: 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75  t means this rou
c800: 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20  tine was called 
c810: 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72  to make a primar
c820: 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f  y.  ** key out o
c830: 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  f the last colum
c840: 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  n added to the t
c850: 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
c860: 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f  ruction..  ** So
c870: 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c   create a fake l
c880: 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  ist to simulate 
c890: 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  this..  */.  if(
c8a0: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
c8b0: 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62   nullId.z = pTab
c8c0: 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f  ->aCol[pTab->nCo
c8d0: 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  l-1].zName;.    
c8e0: 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65  nullId.n = strle
c8f0: 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20  n(nullId.z);.   
c900: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 49   pList = sqliteI
c910: 64 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 26  dListAppend(0, &
c920: 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28  nullId);.    if(
c930: 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f   pList==0 ) goto
c940: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
c950: 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20  ex;.  }..  /* . 
c960: 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   ** Allocate the
c970: 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
c980: 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78  . .  */.  pIndex
c990: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
c9a0: 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b   sizeof(Index) +
c9b0: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b   strlen(zName) +
c9c0: 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20   1 +.           
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
c9e0: 65 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d 3e  eof(int)*pList->
c9f0: 6e 49 64 20 29 3b 0a 20 20 69 66 28 20 70 49 6e  nId );.  if( pIn
ca00: 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  dex==0 ) goto ex
ca10: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
ca20: 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  .  pIndex->aiCol
ca30: 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e  umn = (int*)&pIn
ca40: 64 65 78 5b 31 5d 3b 0a 20 20 70 49 6e 64 65 78  dex[1];.  pIndex
ca50: 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ->zName = (char*
ca60: 29 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  )&pIndex->aiColu
ca70: 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b 0a  mn[pList->nId];.
ca80: 20 20 73 74 72 63 70 79 28 70 49 6e 64 65 78 2d    strcpy(pIndex-
ca90: 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a  >zName, zName);.
caa0: 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
cab0: 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65   = pTab;.  pInde
cac0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69  x->nColumn = pLi
cad0: 73 74 2d 3e 6e 49 64 3b 0a 20 20 70 49 6e 64 65  st->nId;.  pInde
cae0: 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45  x->onError = onE
caf0: 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  rror;.  pIndex->
cb00: 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d  autoIndex = pNam
cb10: 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  e==0;.  pIndex->
cb20: 69 44 62 20 3d 20 69 73 54 65 6d 70 20 3f 20 31  iDb = isTemp ? 1
cb30: 20 3a 20 70 50 61 72 73 65 2d 3e 69 44 62 3b 0a   : pParse->iDb;.
cb40: 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e  .  /* Scan the n
cb50: 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75  ames of the colu
cb60: 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  mns of the table
cb70: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61   to be indexed a
cb80: 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65  nd.  ** load the
cb90: 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20   column indices 
cba0: 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73  into the Index s
cbb0: 74 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72  tructure.  Repor
cbc0: 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20  t an error.  ** 
cbd0: 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73  if any column is
cbe0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
cbf0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
cc00: 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
cc10: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
cc20: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
cc30: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
cc40: 65 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  eStrICmp(pList->
cc50: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62  a[i].zName, pTab
cc60: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  ->aCol[j].zName)
cc70: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
cc80: 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54   }.    if( j>=pT
cc90: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
cca0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
ccb0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
ccc0: 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54  sg, "table ", pT
ccd0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  ab->zName, .    
cce0: 20 20 20 20 22 20 68 61 73 20 6e 6f 20 63 6f 6c      " has no col
ccf0: 75 6d 6e 20 6e 61 6d 65 64 20 22 2c 20 70 4c 69  umn named ", pLi
cd00: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
cd10: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
cd20: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
cd30: 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65  sqliteFree(pInde
cd40: 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  x);.      goto e
cd50: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
cd60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
cd70: 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
cd80: 3d 20 6a 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  = j;.  }..  /* L
cd90: 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65  ink the new Inde
cda0: 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  x structure to i
cdb0: 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20  ts table and to 
cdc0: 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69  the other.  ** i
cdd0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
cde0: 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20  e structures. . 
cdf0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
ce00: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
ce10: 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
ce20: 70 20 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e  p = sqliteHashIn
ce30: 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69 73  sert(&db->aDb[is
ce40: 54 65 6d 70 5d 2e 69 64 78 48 61 73 68 2c 20 0a  Temp].idxHash, .
ce50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce60: 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d           pIndex-
ce70: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a  >zName, strlen(z
ce80: 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29  Name)+1, pIndex)
ce90: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
cea0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
ceb0: 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61  pIndex );  /* Ma
cec0: 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
ced0: 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73  ailed */.      s
cee0: 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65 78  qliteFree(pIndex
cef0: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  );.      goto ex
cf00: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
cf10: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66  .    }.    db->f
cf20: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
cf30: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
cf40: 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64  }..  /* When add
cf50: 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ing an index to 
cf60: 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69  the list of indi
cf70: 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c  ces for a table,
cf80: 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20   make.  ** sure 
cf90: 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65  all indices labe
cfa0: 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63  led OE_Replace c
cfb0: 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68  ome after all th
cfc0: 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a  ose labeled.  **
cfd0: 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69   OE_Ignore.  Thi
cfe0: 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66  s is necessary f
cff0: 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f  or the correct o
d000: 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41  peration of UPDA
d010: 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45  TE.  ** and INSE
d020: 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  RT..  */.  if( o
d030: 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
d040: 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64  ce || pTab->pInd
d050: 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ex==0.       || 
d060: 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e  pTab->pIndex->on
d070: 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
d080: 65 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  e){.    pIndex->
d090: 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49  pNext = pTab->pI
d0a0: 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62 2d 3e  ndex;.    pTab->
d0b0: 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b  pIndex = pIndex;
d0c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e  .  }else{.    In
d0d0: 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54  dex *pOther = pT
d0e0: 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
d0f0: 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70  while( pOther->p
d100: 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e  Next && pOther->
d110: 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d  pNext->onError!=
d120: 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20  OE_Replace ){.  
d130: 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74      pOther = pOt
d140: 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
d150: 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e  }.    pIndex->pN
d160: 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  ext = pOther->pN
d170: 65 78 74 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d  ext;.    pOther-
d180: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b  >pNext = pIndex;
d190: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
d1a0: 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31 20  e initFlag is 1 
d1b0: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
d1c0: 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20  reading the SQL 
d1d0: 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71  off the.  ** "sq
d1e0: 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 74 61 62  lite_master" tab
d1f0: 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 20  le on the disk. 
d200: 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65   So do not write
d210: 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 20 20 2a   to the disk.  *
d220: 2a 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63  * again.  Extrac
d230: 74 20 74 68 65 20 74 61 62 6c 65 20 6e 75 6d 62  t the table numb
d240: 65 72 20 66 72 6f 6d 20 74 68 65 20 70 50 61 72  er from the pPar
d250: 73 65 2d 3e 6e 65 77 54 6e 75 6d 20 66 69 65 6c  se->newTnum fiel
d260: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
d270: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26  arse->initFlag &
d280: 26 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20  & pTable!=0 ){. 
d290: 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
d2a0: 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75  = pParse->newTnu
d2b0: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  m;.  }..  /* If 
d2c0: 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20  the initFlag is 
d2d0: 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68  0 then create th
d2e0: 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e  e index on disk.
d2f0: 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f    This.  ** invo
d300: 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65  lves writing the
d310: 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   index into the 
d320: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
d330: 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a   filling in the.
d340: 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20    ** index with 
d350: 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
d360: 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a  e contents..  **
d370: 0a 20 20 2a 2a 20 54 68 65 20 69 6e 69 74 46 6c  .  ** The initFl
d380: 61 67 20 69 73 20 30 20 77 68 65 6e 20 74 68 65  ag is 0 when the
d390: 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65   user first ente
d3a0: 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45  rs a CREATE INDE
d3b0: 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e  X .  ** command.
d3c0: 20 20 54 68 65 20 69 6e 69 74 46 6c 61 67 20 69    The initFlag i
d3d0: 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62  s 1 when a datab
d3e0: 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e  ase is opened an
d3f0: 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49  d .  ** CREATE I
d400: 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20  NDEX statements 
d410: 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20  are read out of 
d420: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
d430: 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c  .  In.  ** the l
d440: 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69  atter case the i
d450: 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
d460: 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69  sts on disk, whi
d470: 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77  ch is why.  ** w
d480: 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20  e don't want to 
d490: 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a  recreate it..  *
d4a0: 2a 0a 20 20 2a 2a 20 49 66 20 70 54 61 62 6c 65  *.  ** If pTable
d4b0: 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69  ==0 it means thi
d4c0: 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72  s index is gener
d4d0: 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61 72  ated as a primar
d4e0: 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e  y key.  ** or UN
d4f0: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
d500: 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  of a CREATE TABL
d510: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69  E statement.  Si
d520: 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  nce the table.  
d530: 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ** has just been
d540: 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e   created, it con
d550: 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e  tains no data an
d560: 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74  d the index init
d570: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  ialization.  ** 
d580: 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70  step can be skip
d590: 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  ped..  */.  else
d5a0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69   if( pParse->ini
d5b0: 74 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20  tFlag==0 ){.    
d5c0: 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20  int n;.    Vdbe 
d5d0: 2a 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31  *v;.    int lbl1
d5e0: 2c 20 6c 62 6c 32 3b 0a 20 20 20 20 69 6e 74 20  , lbl2;.    int 
d5f0: 69 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b  i;.    int addr;
d600: 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
d610: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
d620: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
d630: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
d640: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
d650: 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20  pTable!=0 ){.   
d660: 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72     sqliteBeginWr
d670: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
d680: 72 73 65 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b  rse, 0, isTemp);
d690: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 70 65  .      sqliteOpe
d6a0: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20  nMasterTable(v, 
d6b0: 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  isTemp);.    }. 
d6c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
d6d0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e  Op(v, OP_NewRecn
d6e0: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  o, 0, 0);.    sq
d6f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
d700: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
d710: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
d720: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
d730: 20 22 69 6e 64 65 78 22 2c 20 50 33 5f 53 54 41   "index", P3_STA
d740: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
d750: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d760: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
d770: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
d780: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 6e  ngeP3(v, -1, pIn
d790: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  dex->zName, P3_S
d7a0: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
d7b0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d7c0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
d7d0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
d7e0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
d7f0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Tab->zName, P3_S
d800: 54 41 54 49 43 29 3b 0a 20 20 20 20 61 64 64 72  TATIC);.    addr
d810: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
d820: 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49  Op(v, OP_CreateI
d830: 6e 64 65 78 2c 20 30 2c 20 69 73 54 65 6d 70 29  ndex, 0, isTemp)
d840: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
d850: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
d860: 2c 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78  , (char*)&pIndex
d870: 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54  ->tnum, P3_POINT
d880: 45 52 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d  ER);.    pIndex-
d890: 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69  >tnum = 0;.    i
d8a0: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
d8b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
d8c0: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
d8d0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
d8e0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
d8f0: 5f 49 6e 74 65 67 65 72 2c 20 69 73 54 65 6d 70  _Integer, isTemp
d900: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
d910: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d920: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20  P_OpenWrite, 1, 
d930: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64  0);.    }.    ad
d940: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
d950: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
d960: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  g, 0, 0);.    if
d970: 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e 64  ( pStart && pEnd
d980: 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 41 64   ){.      n = Ad
d990: 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64  dr(pEnd->z) - Ad
d9a0: 64 72 28 70 53 74 61 72 74 2d 3e 7a 29 20 2b 20  dr(pStart->z) + 
d9b0: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  1;.      sqliteV
d9c0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
d9d0: 64 64 72 2c 20 70 53 74 61 72 74 2d 3e 7a 2c 20  ddr, pStart->z, 
d9e0: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  n);.    }.    sq
d9f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
da00: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
da10: 35 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  5, 0);.    sqlit
da20: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
da30: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30  _PutIntKey, 0, 0
da40: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c  );.    if( pTabl
da50: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
da60: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
da70: 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e  _Integer, pTab->
da80: 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  iDb, 0);.      s
da90: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
daa0: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 32  , OP_OpenRead, 2
dab0: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20  , pTab->tnum);. 
dac0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
dad0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
dae0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Tab->zName, P3_S
daf0: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 6c 62  TATIC);.      lb
db00: 6c 32 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  l2 = sqliteVdbeM
db10: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
db20: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
db30: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
db40: 20 32 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20   2, lbl2);.     
db50: 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 56 64   lbl1 = sqliteVd
db60: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
db70: 63 6e 6f 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  cno, 2, 0);.    
db80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e    for(i=0; i<pIn
db90: 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  dex->nColumn; i+
dba0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
dbb0: 69 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 61  iCol = pIndex->a
dbc0: 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
dbd0: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50      if( pTab->iP
dbe0: 4b 65 79 3d 3d 69 43 6f 6c 20 29 7b 0a 20 20 20  Key==iCol ){.   
dbf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
dc00: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
dc10: 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , i, 0);.       
dc20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
dc30: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
dc40: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
dc50: 32 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  2, iCol);.      
dc60: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
dc70: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
dc80: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 49 64 78 4b  p(v, OP_MakeIdxK
dc90: 65 79 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ey, pIndex->nCol
dca0: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  umn, 0);.      i
dcb0: 66 28 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d  f( db->file_form
dcc0: 61 74 3e 3d 34 20 29 20 73 71 6c 69 74 65 41 64  at>=4 ) sqliteAd
dcd0: 64 49 64 78 4b 65 79 54 79 70 65 28 76 2c 20 70  dIdxKeyType(v, p
dce0: 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 73 71  Index);.      sq
dcf0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
dd00: 20 4f 50 5f 49 64 78 50 75 74 2c 20 31 2c 20 70   OP_IdxPut, 1, p
dd10: 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
dd20: 4f 45 5f 4e 6f 6e 65 29 3b 0a 20 20 20 20 20 20  OE_None);.      
dd30: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
dd40: 50 33 28 76 2c 20 2d 31 2c 20 22 69 6e 64 65 78  P3(v, -1, "index
dd50: 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e  ed columns are n
dd60: 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33 5f 53  ot unique", P3_S
dd70: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71  TATIC);.      sq
dd80: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
dd90: 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c 62 6c   OP_Next, 2, lbl
dda0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
ddb0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
ddc0: 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20  (v, lbl2);.     
ddd0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
dde0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 32 2c  (v, OP_Close, 2,
ddf0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
de00: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
de10: 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20  _Close, 1, 0);. 
de20: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61     }.    if( pTa
de30: 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ble!=0 ){.      
de40: 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20  if( !isTemp ){. 
de50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 43 68 61         sqliteCha
de60: 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29  ngeCookie(db, v)
de70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
de80: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
de90: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20  v, OP_Close, 0, 
dea0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
deb0: 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
dec0: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  n(pParse);.    }
ded0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
dee0: 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69   up before exiti
def0: 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74  ng */.exit_creat
df00: 65 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74  e_index:.  sqlit
df10: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  eIdListDelete(pL
df20: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 53 72  ist);.  sqliteSr
df30: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54 61 62  cListDelete(pTab
df40: 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  le);.  sqliteFre
df50: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  e(zName);.  retu
df60: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rn;.}../*.** Thi
df70: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  s routine will d
df80: 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20  rop an existing 
df90: 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68  named index.  Th
dfa0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d  is routine.** im
dfb0: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f  plements the DRO
dfc0: 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  P INDEX statemen
dfd0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
dfe0: 65 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65  eDropIndex(Parse
dff0: 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
e000: 74 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64  t *pName){.  Ind
e010: 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64  ex *pIndex;.  Vd
e020: 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20  be *v;.  sqlite 
e030: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
e040: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
e050: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f  >nErr || sqlite_
e060: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
e070: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
e080: 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
e090: 20 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73   );.  pIndex = s
e0a0: 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64  qliteFindIndex(d
e0b0: 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  b, pName->a[0].z
e0c0: 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
e0d0: 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
e0e0: 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b  if( pIndex==0 ){
e0f0: 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72  .    sqliteError
e100: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
e110: 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c  such index: %S",
e120: 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   pName, 0);.    
e130: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
e140: 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
e150: 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65  pIndex->autoInde
e160: 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45  x ){.    sqliteE
e170: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
e180: 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65  "index associate
e190: 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a  d with UNIQUE ".
e1a0: 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52        "or PRIMAR
e1b0: 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
e1c0: 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70   cannot be dropp
e1d0: 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74  ed", 0);.    got
e1e0: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
e1f0: 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  x;.  }.  if( pIn
e200: 64 65 78 2d 3e 69 44 62 3e 31 20 29 7b 0a 20 20  dex->iDb>1 ){.  
e210: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
e220: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
e230: 20 61 6c 74 65 72 20 73 63 68 65 6d 61 20 6f 66   alter schema of
e240: 20 61 74 74 61 63 68 65 64 20 22 0a 20 20 20 20   attached ".    
e250: 20 20 20 22 64 61 74 61 62 61 73 65 73 22 2c 20     "databases", 
e260: 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  0);.    goto exi
e270: 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
e280: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
e290: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
e2a0: 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ION.  {.    int 
e2b0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
e2c0: 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61  OP_INDEX;.    Ta
e2d0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
e2e0: 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20  ex->pTable;.    
e2f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
e300: 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78  = db->aDb[pIndex
e310: 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->iDb].zName;.  
e320: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
e330: 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
e340: 45 28 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a  E(pIndex->iDb);.
e350: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75      if( sqliteAu
e360: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
e370: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
e380: 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Tab, 0, zDb) ){.
e390: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
e3a0: 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
e3b0: 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  }.    if( pIndex
e3c0: 2d 3e 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53  ->iDb ) code = S
e3d0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
e3e0: 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
e3f0: 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70  qliteAuthCheck(p
e400: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e  Parse, code, pIn
e410: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62  dex->zName, pTab
e420: 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
e430: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
e440: 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20  _drop_index;.   
e450: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
e460: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
e470: 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
e480: 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74  index and from t
e490: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
e4a0: 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  */.  v = sqliteG
e4b0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
e4c0: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
e4d0: 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 72 6f  tatic VdbeOp dro
e4e0: 70 49 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20 20 20  pIndex[] = {.   
e4f0: 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20     { OP_Rewind, 
e500: 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20      0, ADDR(9), 
e510: 30 7d 2c 20 0a 20 20 20 20 20 20 7b 20 4f 50 5f  0}, .      { OP_
e520: 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30  String,     0, 0
e530: 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31  ,       0}, /* 1
e540: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d   */.      { OP_M
e550: 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c  emStore,   1, 1,
e560: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
e570: 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20   { OP_MemLoad,  
e580: 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 30 7d    1, 0,       0}
e590: 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20  , /* 3 */.      
e5a0: 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20  { OP_Column,    
e5b0: 20 30 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c   0, 1,       0},
e5c0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 45 71 2c 20  .      { OP_Eq, 
e5d0: 20 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28          0, ADDR(
e5e0: 38 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  8), 0},.      { 
e5f0: 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30  OP_Next,       0
e600: 2c 20 41 44 44 52 28 33 29 2c 20 30 7d 2c 0a 20  , ADDR(3), 0},. 
e610: 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20       { OP_Goto, 
e620: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29        0, ADDR(9)
e630: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
e640: 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20  _Delete,     0, 
e650: 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  0,       0}, /* 
e660: 38 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20  8 */.    };.    
e670: 69 6e 74 20 62 61 73 65 3b 0a 0a 20 20 20 20 73  int base;..    s
e680: 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
e690: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
e6a0: 20 30 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29   0, pIndex->iDb)
e6b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 70 65 6e  ;.    sqliteOpen
e6c0: 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70  MasterTable(v, p
e6d0: 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20  Index->iDb);.   
e6e0: 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 56 64   base = sqliteVd
e6f0: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
e700: 72 72 61 79 53 69 7a 65 28 64 72 6f 70 49 6e 64  rraySize(dropInd
e710: 65 78 29 2c 20 64 72 6f 70 49 6e 64 65 78 29 3b  ex), dropIndex);
e720: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
e730: 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b  hangeP3(v, base+
e740: 31 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  1, pIndex->zName
e750: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 49  , 0);.    if( pI
e760: 6e 64 65 78 2d 3e 69 44 62 3d 3d 30 20 29 7b 0a  ndex->iDb==0 ){.
e770: 20 20 20 20 20 20 73 71 6c 69 74 65 43 68 61 6e        sqliteChan
e780: 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b  geCookie(db, v);
e790: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
e7a0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
e7b0: 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20  _Close, 0, 0);. 
e7c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
e7d0: 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79  Op(v, OP_Destroy
e7e0: 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20  , pIndex->tnum, 
e7f0: 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20  pIndex->iDb);.  
e800: 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65    sqliteEndWrite
e810: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
e820: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
e830: 65 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ete the in-memor
e840: 79 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  y description of
e850: 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a   this index..  *
e860: 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  /.  if( !pParse-
e870: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
e880: 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44  sqliteUnlinkAndD
e890: 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70  eleteIndex(db, p
e8a0: 49 6e 64 65 78 29 3b 0a 20 20 20 20 64 62 2d 3e  Index);.    db->
e8b0: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
e8c0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
e8d0: 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e   }..exit_drop_in
e8e0: 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 53 72 63  dex:.  sqliteSrc
e8f0: 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65  ListDelete(pName
e900: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  );.}../*.** Appe
e910: 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  nd a new element
e920: 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64   to the given Id
e930: 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20  List.  Create a 
e940: 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a  new IdList if.**
e950: 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20   need be..**.** 
e960: 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20  A new IdList is 
e970: 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
e980: 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  L if malloc() fa
e990: 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a  ils..*/.IdList *
e9a0: 73 71 6c 69 74 65 49 64 4c 69 73 74 41 70 70 65  sqliteIdListAppe
e9b0: 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  nd(IdList *pList
e9c0: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
e9d0: 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  {.  if( pList==0
e9e0: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
e9f0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
ea00: 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a  zeof(IdList) );.
ea10: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
ea20: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
ea30: 0a 20 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e  .  if( (pList->n
ea40: 49 64 20 26 20 37 29 3d 3d 30 20 29 7b 0a 20 20  Id & 7)==0 ){.  
ea50: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
ea60: 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 20 3d  item *a;.    a =
ea70: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70   sqliteRealloc(p
ea80: 4c 69 73 74 2d 3e 61 2c 20 28 70 4c 69 73 74 2d  List->a, (pList-
ea90: 3e 6e 49 64 2b 38 29 2a 73 69 7a 65 6f 66 28 70  >nId+8)*sizeof(p
eaa0: 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  List->a[0]) );. 
eab0: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20     if( a==0 ){. 
eac0: 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c 69 73       sqliteIdLis
ead0: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
eae0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
eaf0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
eb00: 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65  >a = a;.  }.  me
eb10: 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70  mset(&pList->a[p
eb20: 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73  List->nId], 0, s
eb30: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
eb40: 5d 29 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  ]));.  if( pToke
eb50: 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a  n ){.    char **
eb60: 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  pz = &pList->a[p
eb70: 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65  List->nId].zName
eb80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  ;.    sqliteSetN
eb90: 53 74 72 69 6e 67 28 70 7a 2c 20 70 54 6f 6b 65  String(pz, pToke
eba0: 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c  n->z, pToken->n,
ebb0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a   0);.    if( *pz
ebc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
ebd0: 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28  iteIdListDelete(
ebe0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
ebf0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73  turn 0;.    }els
ec00: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44  e{.      sqliteD
ec10: 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20  equote(*pz);.   
ec20: 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e   }.  }.  pList->
ec30: 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  nId++;.  return 
ec40: 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
ec50: 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62  Append a new tab
ec60: 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67  le name to the g
ec70: 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43  iven SrcList.  C
ec80: 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c  reate a new SrcL
ec90: 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
eca0: 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  e.  A new entry 
ecb0: 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  is created in th
ecc0: 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69  e SrcList even i
ecd0: 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
ece0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72  ..**.** A new Sr
ecf0: 63 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  cList is returne
ed00: 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61  d, or NULL if ma
ed10: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2a  lloc() fails..**
ed20: 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65  .** If pDatabase
ed30: 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74   is not null, it
ed40: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
ed50: 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74  table has an opt
ed60: 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ional.** databas
ed70: 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20  e name prefix.  
ed80: 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74  Like this:  "dat
ed90: 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54  abase.table".  T
eda0: 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20  he pDatabase.** 
edb0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61  points to the ta
edc0: 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
edd0: 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74   pTable points t
ede0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  o the database n
edf0: 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c  ame..** The SrcL
ee00: 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69  ist.a[].zName fi
ee10: 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69  eld is filled wi
ee20: 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  th the table nam
ee30: 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a  e which might.**
ee40: 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   come from pTabl
ee50: 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20  e (if pDatabase 
ee60: 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d  is NULL) or from
ee70: 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a   pDatabase.  .**
ee80: 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61   SrcList.a[].zDa
ee90: 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64  tabase is filled
eea0: 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
eeb0: 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61  se name from pTa
eec0: 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20  ble,.** or with 
eed0: 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62  NULL if no datab
eee0: 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ase is specified
eef0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ..**.** In other
ef00: 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20   words, if call 
ef10: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
ef20: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53           sqliteS
ef30: 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42  rcListAppend(A,B
ef40: 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,0);.**.** Then 
ef50: 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d  B is a table nam
ef60: 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
ef70: 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65  se name is unspe
ef80: 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c  cified.  If call
ef90: 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a  ed.** like this:
efa0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  .**.**         s
efb0: 71 6c 69 74 65 53 72 63 4c 69 73 74 41 70 70 65  qliteSrcListAppe
efc0: 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a  nd(A,B,C);.**.**
efd0: 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74   Then C is the t
efe0: 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20  able name and B 
eff0: 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
f000: 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  name..*/.SrcList
f010: 20 2a 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41   *sqliteSrcListA
f020: 70 70 65 6e 64 28 53 72 63 4c 69 73 74 20 2a 70  ppend(SrcList *p
f030: 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 61  List, Token *pTa
f040: 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70 44 61 74  ble, Token *pDat
f050: 61 62 61 73 65 29 7b 0a 20 20 69 66 28 20 70 4c  abase){.  if( pL
f060: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
f070: 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ist = sqliteMall
f080: 6f 63 28 20 73 69 7a 65 6f 66 28 53 72 63 4c 69  oc( sizeof(SrcLi
f090: 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
f0a0: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
f0b0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   0;.  }.  if( (p
f0c0: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 20 37 29 3d  List->nSrc & 7)=
f0d0: 3d 31 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  =1 ){.    SrcLis
f0e0: 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65  t *pNew;.    pNe
f0f0: 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
f100: 63 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20 20  c(pList,.       
f110: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
f120: 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74 2d  pList) + (pList-
f130: 3e 6e 53 72 63 2b 38 29 2a 73 69 7a 65 6f 66 28  >nSrc+8)*sizeof(
f140: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a  pList->a[0]) );.
f150: 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
f160: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
f170: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  rcListDelete(pLi
f180: 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
f190: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
f1a0: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
f1b0: 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74  .  memset(&pList
f1c0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d  ->a[pList->nSrc]
f1d0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73  , 0, sizeof(pLis
f1e0: 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28  t->a[0]));.  if(
f1f0: 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44   pDatabase && pD
f200: 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b  atabase->z==0 ){
f210: 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
f220: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44   0;.  }.  if( pD
f230: 61 74 61 62 61 73 65 20 26 26 20 70 54 61 62 6c  atabase && pTabl
f240: 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a  e ){.    Token *
f250: 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73  pTemp = pDatabas
f260: 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  e;.    pDatabase
f270: 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70   = pTable;.    p
f280: 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20  Table = pTemp;. 
f290: 20 7d 0a 20 20 69 66 28 20 70 54 61 62 6c 65 20   }.  if( pTable 
f2a0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a  ){.    char **pz
f2b0: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
f2c0: 73 74 2d 3e 6e 53 72 63 5d 2e 7a 4e 61 6d 65 3b  st->nSrc].zName;
f2d0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53  .    sqliteSetNS
f2e0: 74 72 69 6e 67 28 70 7a 2c 20 70 54 61 62 6c 65  tring(pz, pTable
f2f0: 2d 3e 7a 2c 20 70 54 61 62 6c 65 2d 3e 6e 2c 20  ->z, pTable->n, 
f300: 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d  0);.    if( *pz=
f310: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
f320: 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  teSrcListDelete(
f330: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
f340: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73  turn 0;.    }els
f350: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44  e{.      sqliteD
f360: 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20  equote(*pz);.   
f370: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61   }.  }.  if( pDa
f380: 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20 63 68  tabase ){.    ch
f390: 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74  ar **pz = &pList
f3a0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d  ->a[pList->nSrc]
f3b0: 2e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20  .zDatabase;.    
f3c0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
f3d0: 28 70 7a 2c 20 70 44 61 74 61 62 61 73 65 2d 3e  (pz, pDatabase->
f3e0: 7a 2c 20 70 44 61 74 61 62 61 73 65 2d 3e 6e 2c  z, pDatabase->n,
f3f0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a   0);.    if( *pz
f400: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
f410: 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65  iteSrcListDelete
f420: 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72  (pList);.      r
f430: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c  eturn 0;.    }el
f440: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
f450: 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20  Dequote(*pz);.  
f460: 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d    }.  }.  pList-
f470: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e  >a[pList->nSrc].
f480: 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  iCursor = -1;.  
f490: 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20  pList->nSrc++;. 
f4a0: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
f4b0: 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63  ../*.** Assign c
f4c0: 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61  ursors to all ta
f4d0: 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73  bles in a SrcLis
f4e0: 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
f4f0: 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
f500: 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  sors(Parse *pPar
f510: 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  se, SrcList *pLi
f520: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
f530: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
f540: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
f550: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
f560: 5d 2e 69 43 75 72 73 6f 72 3c 30 20 29 7b 0a 20  ].iCursor<0 ){. 
f570: 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d       pList->a[i]
f580: 2e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  .iCursor = pPars
f590: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d  e->nTab++;.    }
f5a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
f5b0: 64 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68  d an alias to th
f5c0: 65 20 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65  e last identifie
f5d0: 72 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69  r on the given i
f5e0: 64 65 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a  dentifier list..
f5f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 72  */.void sqliteSr
f600: 63 4c 69 73 74 41 64 64 41 6c 69 61 73 28 53 72  cListAddAlias(Sr
f610: 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  cList *pList, To
f620: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
f630: 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69  if( pList && pLi
f640: 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20  st->nSrc>0 ){.  
f650: 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d    int i = pList-
f660: 3e 6e 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 73  >nSrc - 1;.    s
f670: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
f680: 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  &pList->a[i].zAl
f690: 69 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  ias, pToken->z, 
f6a0: 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20  pToken->n, 0);. 
f6b0: 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65     sqliteDequote
f6c0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  (pList->a[i].zAl
f6d0: 69 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ias);.  }.}../*.
f6e0: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c  ** Delete an IdL
f6f0: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
f700: 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28  iteIdListDelete(
f710: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  IdList *pList){.
f720: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
f730: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
f740: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
f750: 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
f760: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
f770: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
f780: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
f790: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a  Free(pList->a);.
f7a0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
f7b0: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
f7c0: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
f7d0: 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69  n pList of the i
f7e0: 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20  dentifier named 
f7f0: 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  zId.  Return -1.
f800: 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ** if not found.
f810: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 49 64  .*/.int sqliteId
f820: 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74  ListIndex(IdList
f830: 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63   *pList, const c
f840: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
f850: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
f860: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31  t==0 ) return -1
f870: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
f880: 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
f890: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53  .    if( sqliteS
f8a0: 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
f8b0: 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  i].zName, zName)
f8c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
f8d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
f8e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
f8f0: 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69   an entire SrcLi
f900: 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c  st including all
f910: 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
f920: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
f930: 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53  eSrcListDelete(S
f940: 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
f950: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
f960: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
f970: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
f980: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
f990: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
f9a0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 44 61  (pList->a[i].zDa
f9b0: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c  tabase);.    sql
f9c0: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
f9d0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
f9e0: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
f9f0: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a  ->a[i].zAlias);.
fa00: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
fa10: 5b 69 5d 2e 70 54 61 62 20 26 26 20 70 4c 69 73  [i].pTab && pLis
fa20: 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d 3e 69 73  t->a[i].pTab->is
fa30: 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20  Transient ){.   
fa40: 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54     sqliteDeleteT
fa50: 61 62 6c 65 28 30 2c 20 70 4c 69 73 74 2d 3e 61  able(0, pList->a
fa60: 5b 69 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20 7d  [i].pTab);.    }
fa70: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63  .    sqliteSelec
fa80: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61  tDelete(pList->a
fa90: 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  [i].pSelect);.  
faa0: 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65    sqliteExprDele
fab0: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  te(pList->a[i].p
fac0: 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 49  On);.    sqliteI
fad0: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  dListDelete(pLis
fae0: 74 2d 3e 61 5b 69 5d 2e 70 55 73 69 6e 67 29 3b  t->a[i].pUsing);
faf0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
fb00: 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pList);.}../*.
fb10: 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73  ** Begin a trans
fb20: 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
fb30: 71 6c 69 74 65 42 65 67 69 6e 54 72 61 6e 73 61  qliteBeginTransa
fb40: 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
fb50: 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72  rse, int onError
fb60: 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b  ){.  sqlite *db;
fb70: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
fb80: 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
fb90: 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  >db)==0 || db->a
fba0: 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
fbb0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
fbc0: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
fbd0: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
fbe0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
fbf0: 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63  ( sqliteAuthChec
fc00: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
fc10: 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42  _TRANSACTION, "B
fc20: 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 20 72  EGIN", 0, 0) ) r
fc30: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d  eturn;.  if( db-
fc40: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
fc50: 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 73  InTrans ){.    s
fc60: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
fc70: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 73 74  arse, "cannot st
fc80: 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
fc90: 6e 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  n within a trans
fca0: 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65  action");.    re
fcb0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
fcc0: 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  teBeginWriteOper
fcd0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
fce0: 20 30 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73   0);.  db->flags
fcf0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 54 72 61   |= SQLITE_InTra
fd00: 6e 73 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f  ns;.  db->onErro
fd10: 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a  r = onError;.}..
fd20: 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74  /*.** Commit a t
fd30: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
fd40: 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74 54  id sqliteCommitT
fd50: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
fd60: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
fd70: 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  ite *db;..  if( 
fd80: 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
fd90: 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
fda0: 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
fdb0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
fdc0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
fdd0: 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c  r || sqlite_mall
fde0: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
fdf0: 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
fe00: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
fe10: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
fe20: 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  TION, "COMMIT", 
fe30: 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
fe40: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
fe50: 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e   & SQLITE_InTran
fe60: 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  s)==0 ){.    sql
fe70: 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72  iteErrorMsg(pPar
fe80: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d  se, "cannot comm
fe90: 69 74 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74  it - no transact
fea0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 29 3b  ion is active");
feb0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
fec0: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
fed0: 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b  ~SQLITE_InTrans;
fee0: 0a 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74  .  sqliteEndWrit
fef0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
ff00: 65 29 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f  e);.  db->onErro
ff10: 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a  r = OE_Default;.
ff20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
ff30: 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  k a transaction.
ff40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 52 6f  */.void sqliteRo
ff50: 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f  llbackTransactio
ff60: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
ff70: 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a  {.  sqlite *db;.
ff80: 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66    Vdbe *v;..  if
ff90: 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
ffa0: 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
ffb0: 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  0 || db->aDb[0].
ffc0: 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBt==0 ) return;
ffd0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
ffe0: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
fff0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
10000 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
10010 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  teAuthCheck(pPar
10020 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
10030 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43  ACTION, "ROLLBAC
10040 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75  K", 0, 0) ) retu
10050 72 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66  rn;.  if( (db->f
10060 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
10070 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20  Trans)==0 ){.   
10080 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28   sqliteErrorMsg(
10090 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
100a0 72 6f 6c 6c 62 61 63 6b 20 2d 20 6e 6f 20 74 72  rollback - no tr
100b0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
100c0 69 76 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ive");.    retur
100d0 6e 3b 20 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  n; .  }.  v = sq
100e0 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
100f0 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
10100 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
10110 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 6c 6c 62 61  dOp(v, OP_Rollba
10120 63 6b 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  ck, 0, 0);.  }. 
10130 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
10140 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20  QLITE_InTrans;. 
10150 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f   db->onError = O
10160 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a  E_Default;.}../*
10170 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
10180 45 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  E code that will
10190 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
101a0 6d 61 20 63 6f 6f 6b 69 65 20 66 6f 72 20 61 6c  ma cookie for al
101b0 6c 0a 2a 2a 20 6e 61 6d 65 64 20 64 61 74 61 62  l.** named datab
101c0 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 76 6f  ase files..*/.vo
101d0 69 64 20 73 71 6c 69 74 65 43 6f 64 65 56 65 72  id sqliteCodeVer
101e0 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20  ifySchema(Parse 
101f0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
10200 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  ){.  sqlite *db 
10210 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
10220 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
10230 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
10240 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
10250 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
10260 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
10270 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d  ->aDb[iDb].pBt!=
10280 30 20 29 3b 0a 20 20 69 66 28 20 69 44 62 21 3d  0 );.  if( iDb!=
10290 31 20 26 26 20 21 44 62 48 61 73 50 72 6f 70 65  1 && !DbHasPrope
102a0 72 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f  rty(db, iDb, DB_
102b0 43 6f 6f 6b 69 65 29 20 29 7b 0a 20 20 20 20 73  Cookie) ){.    s
102c0 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
102d0 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69  , OP_VerifyCooki
102e0 65 2c 20 69 44 62 2c 20 64 62 2d 3e 61 44 62 5b  e, iDb, db->aDb[
102f0 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b  iDb].schema_cook
10300 69 65 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72  ie);.    DbSetPr
10310 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20  operty(db, iDb, 
10320 44 42 5f 43 6f 6f 6b 69 65 29 3b 0a 20 20 7d 0a  DB_Cookie);.  }.
10330 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
10340 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
10350 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f   prepares for do
10360 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  ing an operation
10370 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63   that.** might c
10380 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61  hange the databa
10390 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
103a0 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20  outine starts a 
103b0 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
103c0 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c  if we are not al
103d0 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20  ready within.** 
103e0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  a transaction.  
103f0 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  If we are alread
10400 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  y within a trans
10410 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63  action, then a c
10420 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20  heckpoint.** is 
10430 73 65 74 20 69 66 20 74 68 65 20 73 65 74 43 68  set if the setCh
10440 65 63 6b 70 6f 69 6e 74 20 70 61 72 61 6d 65 74  eckpoint paramet
10450 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63  er is true.  A c
10460 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
10470 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f  .** be set for o
10480 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d  perations that m
10490 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74  ight fail (due t
104a0 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  o a constraint) 
104b0 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77  part of.** the w
104c0 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77  ay through and w
104d0 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74  hich will need t
104e0 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74  o undo some writ
104f0 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  es without havin
10500 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  g to.** rollback
10510 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
10520 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65  action.  For ope
10530 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c  rations where al
10540 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  l constraints.**
10550 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20   can be checked 
10560 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
10570 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74  es are made to t
10580 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
10590 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65  is never.** nece
105a0 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20  ssary to undo a 
105b0 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68  write and the ch
105c0 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  eckpoint should 
105d0 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a  not be set..**.*
105e0 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  * Only database 
105f0 69 44 62 20 61 6e 64 20 74 68 65 20 74 65 6d 70  iDb and the temp
10600 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61   database are ma
10610 64 65 20 77 72 69 74 61 62 6c 65 20 62 79 20 74  de writable by t
10620 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20  his call..** If 
10630 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  iDb==0, then the
10640 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70 20 64   main and temp d
10650 61 74 61 62 61 73 65 73 20 61 72 65 20 6d 61 64  atabases are mad
10660 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20 49 66  e writable.   If
10670 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e 20  .** iDb==1 then 
10680 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20 64 61  only the temp da
10690 74 61 62 61 73 65 20 69 73 20 6d 61 64 65 20 77  tabase is made w
106a0 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69 44 62  ritable.  If iDb
106b0 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73  >1 then the.** s
106c0 70 65 63 69 66 69 65 64 20 61 75 78 69 6c 69 61  pecified auxilia
106d0 72 79 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ry database and 
106e0 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
106f0 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  e are made writa
10700 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
10710 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65  iteBeginWriteOpe
10720 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  ration(Parse *pP
10730 61 72 73 65 2c 20 69 6e 74 20 73 65 74 43 68 65  arse, int setChe
10740 63 6b 70 6f 69 6e 74 2c 20 69 6e 74 20 69 44 62  ckpoint, int iDb
10750 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
10760 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
10770 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 44  rse->db;.  if( D
10780 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
10790 20 69 44 62 2c 20 44 42 5f 4c 6f 63 6b 65 64 29   iDb, DB_Locked)
107a0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 20 3d   ) return;.  v =
107b0 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
107c0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
107d0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
107e0 66 28 20 21 64 62 2d 3e 61 44 62 5b 69 44 62 5d  f( !db->aDb[iDb]
107f0 2e 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20  .inTrans ){.    
10800 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
10810 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
10820 6e 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20  n, iDb, 0);.    
10830 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64 62  DbSetProperty(db
10840 2c 20 69 44 62 2c 20 44 42 5f 4c 6f 63 6b 65 64  , iDb, DB_Locked
10850 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 43 6f 64  );.    sqliteCod
10860 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
10870 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
10880 69 66 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20  if( iDb!=1 ){.  
10890 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57      sqliteBeginW
108a0 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
108b0 61 72 73 65 2c 20 73 65 74 43 68 65 63 6b 70 6f  arse, setCheckpo
108c0 69 6e 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  int, 1);.    }. 
108d0 20 7d 65 6c 73 65 20 69 66 28 20 73 65 74 43 68   }else if( setCh
108e0 65 63 6b 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  eckpoint ){.    
108f0 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
10900 76 2c 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74  v, OP_Checkpoint
10910 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 44  , iDb, 0);.    D
10920 62 53 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c  bSetProperty(db,
10930 20 69 44 62 2c 20 44 42 5f 4c 6f 63 6b 65 64 29   iDb, DB_Locked)
10940 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
10950 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
10960 74 20 63 6f 6e 63 6c 75 64 65 73 20 61 6e 20 6f  t concludes an o
10970 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20 6d 61  peration that ma
10980 79 20 68 61 76 65 20 63 68 61 6e 67 65 64 0a 2a  y have changed.*
10990 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  * the database. 
109a0 20 49 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   If a statement 
109b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
109c0 73 74 61 72 74 65 64 2c 20 74 68 65 6e 20 65 6d  started, then em
109d0 69 74 0a 2a 2a 20 61 6e 20 4f 50 5f 43 6f 6d 6d  it.** an OP_Comm
109e0 69 74 20 74 68 61 74 20 77 69 6c 6c 20 63 61 75  it that will cau
109f0 73 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 74  se the changes t
10a00 6f 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 74  o be committed t
10a10 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  o disk..**.** No
10a20 74 65 20 74 68 61 74 20 63 68 65 63 6b 70 6f 69  te that checkpoi
10a30 6e 74 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69  nts are automati
10a40 63 61 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 20  cally committed 
10a50 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a  at the end of.**
10a60 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4e   a statement.  N
10a70 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 74 68  ote also that th
10a80 65 72 65 20 63 61 6e 20 62 65 20 6d 75 6c 74 69  ere can be multi
10a90 70 6c 65 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a  ple calls to .**
10aa0 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74   sqliteBeginWrit
10ab0 65 4f 70 65 72 61 74 69 6f 6e 28 29 20 62 75 74  eOperation() but
10ac0 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 6f 6e   there should on
10ad0 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65 0a 2a  ly be a single.*
10ae0 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  * call to sqlite
10af0 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
10b00 6e 28 29 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  n() at the concl
10b10 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61  usion of the sta
10b20 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
10b30 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70  sqliteEndWriteOp
10b40 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
10b50 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
10b60 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  v;.  sqlite *db 
10b70 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
10b80 69 66 28 20 70 50 61 72 73 65 2d 3e 74 72 69 67  if( pParse->trig
10b90 53 74 61 63 6b 20 29 20 72 65 74 75 72 6e 3b 20  Stack ) return; 
10ba0 2f 2a 20 69 66 20 74 68 69 73 20 69 73 20 69 6e  /* if this is in
10bb0 20 61 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20   a trigger */.  
10bc0 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
10bd0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
10be0 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
10bf0 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
10c00 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  & SQLITE_InTrans
10c10 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 42 45 47   ){.    /* A BEG
10c20 49 4e 20 68 61 73 20 65 78 65 63 75 74 65 64 2e  IN has executed.
10c30 20 20 44 6f 20 6e 6f 74 20 63 6f 6d 6d 69 74 20    Do not commit 
10c40 75 6e 74 69 6c 20 77 65 20 73 65 65 20 61 6e 20  until we see an 
10c50 65 78 70 6c 69 63 69 74 0a 20 20 20 20 2a 2a 20  explicit.    ** 
10c60 43 4f 4d 4d 49 54 20 73 74 61 74 65 6d 65 6e 74  COMMIT statement
10c70 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  . */.  }else{.  
10c80 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
10c90 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20  p(v, OP_Commit, 
10ca0 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a           0, 0);.  }.}.