/ Hex Artifact Content
Login

Artifact e6d71a3babd1f523abdd806555be3430adbd69eb:


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 37 30 20 32 30 30 34 2f 30 32 2f 31 34 20 32  170 2004/02/14 2
0300: 33 3a 35 39 3a 35 37 20 64 72 68 20 45 78 70 20  3:59:57 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 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  && db->init.busy
04e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ==0 ){.    int r
04f0: 63 20 3d 20 73 71 6c 69 74 65 49 6e 69 74 28 64  c = sqliteInit(d
0500: 62 2c 20 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  b, &pParse->zErr
0510: 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Msg);.    if( rc
0520: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
0530: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
0540: 3d 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 72  = rc;.      pPar
0550: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
0560: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  }.  }.  for(i=0;
0570: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
0580: 7b 0a 20 20 20 20 44 62 43 6c 65 61 72 50 72 6f  {.    DbClearPro
0590: 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f  perty(db, i, DB_
05a0: 4c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28  Locked);.    if(
05b0: 20 21 64 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54   !db->aDb[i].inT
05c0: 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 44 62  rans ){.      Db
05d0: 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62  ClearProperty(db
05e0: 2c 20 69 2c 20 44 42 5f 43 6f 6f 6b 69 65 29 3b  , i, DB_Cookie);
05f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61  .    }.  }.  pPa
0600: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 7d  rse->nVar = 0;.}
0610: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
0620: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
0630: 66 74 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51  fter a single SQ
0640: 4c 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20  L statement has 
0650: 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61  been.** parsed a
0660: 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 20 65 78  nd we want to ex
0670: 65 63 75 74 65 20 74 68 65 20 56 44 42 45 20 63  ecute the VDBE c
0680: 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ode to implement
0690: 20 0a 2a 2a 20 74 68 61 74 20 73 74 61 74 65 6d   .** that statem
06a0: 65 6e 74 2e 20 20 50 72 69 6f 72 20 61 63 74 69  ent.  Prior acti
06b0: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 73 68 6f 75  on routines shou
06c0: 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  ld have already.
06d0: 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65 64 20 56  ** constructed V
06e0: 44 42 45 20 63 6f 64 65 20 74 6f 20 64 6f 20 74  DBE code to do t
06f0: 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 65 20 53  he work of the S
0700: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
0710: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0720: 73 74 20 68 61 73 20 74 6f 20 65 78 65 63 75 74  st has to execut
0730: 65 20 74 68 65 20 56 44 42 45 20 63 6f 64 65 2e  e the VDBE code.
0740: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
0750: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
0760: 75 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20  urred, it might 
0770: 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
0780: 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65  .** no VDBE code
0790: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a   was generated..
07a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78  */.void sqliteEx
07b0: 65 63 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ec(Parse *pParse
07c0: 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  ){.  sqlite *db 
07d0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
07e0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
07f0: 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 69 66 28 20  ->pVdbe;..  if( 
0800: 76 3d 3d 30 20 26 26 20 28 76 20 3d 20 73 71 6c  v==0 && (v = sql
0810: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
0820: 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  e))!=0 ){.    sq
0830: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
0840: 20 4f 50 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b   OP_Halt, 0, 0);
0850: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
0860: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
0870: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
0880: 76 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72  v && pParse->nEr
0890: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45  r==0 ){.    FILE
08a0: 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d 3e 66   *trace = (db->f
08b0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
08c0: 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20 73 74  beTrace)!=0 ? st
08d0: 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20 73 71  dout : 0;.    sq
08e0: 6c 69 74 65 56 64 62 65 54 72 61 63 65 28 76 2c  liteVdbeTrace(v,
08f0: 20 74 72 61 63 65 29 3b 0a 20 20 20 20 73 71 6c   trace);.    sql
0900: 69 74 65 56 64 62 65 4d 61 6b 65 52 65 61 64 79  iteVdbeMakeReady
0910: 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  (v, pParse->nVar
0920: 2c 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  , pParse->explai
0930: 6e 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  n);.    pParse->
0940: 72 63 20 3d 20 70 50 61 72 73 65 2d 3e 6e 45 72  rc = pParse->nEr
0950: 72 20 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  r ? SQLITE_ERROR
0960: 20 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   : SQLITE_DONE;.
0970: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e      pParse->colN
0980: 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d  amesSet = 0;.  }
0990: 65 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d  else if( pParse-
09a0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
09b0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  {.    pParse->rc
09c0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
09d0: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
09e0: 54 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Tab = 0;.  pPars
09f0: 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70  e->nMem = 0;.  p
0a00: 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b  Parse->nSet = 0;
0a10: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20  .  pParse->nAgg 
0a20: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
0a30: 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Var = 0;.}../*.*
0a40: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
0a50: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
0a60: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
0a70: 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72  .** a particular
0a80: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
0a90: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 0a 2a  given the name.*
0aa0: 2a 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20  * of that table 
0ab0: 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
0ac0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
0ad0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
0ae0: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
0af0: 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
0b00: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
0b10: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
0b20: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
0b30: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
0b40: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
0b50: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
0b60: 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20   matching table 
0b70: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
0b80: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
0b90: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
0ba0: 65 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  e names is done.
0bb0: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
0bc0: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
0bd0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
0be0: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
0bf0: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
0c00: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
0c10: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
0c20: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
0c30: 73 71 6c 69 74 65 4c 6f 63 61 74 65 54 61 62 6c  sqliteLocateTabl
0c40: 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  e()..*/.Table *s
0c50: 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 73  qliteFindTable(s
0c60: 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73 74  qlite *db, const
0c70: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
0c80: 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62  nst char *zDatab
0c90: 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ase){.  Table *p
0ca0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
0cb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
0cc0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
0cd0: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
0ce0: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
0cf0: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
0d00: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  MAIN */.    if( 
0d10: 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20  zDatabase!=0 && 
0d20: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 44  sqliteStrICmp(zD
0d30: 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62  atabase, db->aDb
0d40: 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e  [j].zName) ) con
0d50: 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73  tinue;.    p = s
0d60: 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 64  qliteHashFind(&d
0d70: 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62 6c 48 61 73  b->aDb[j].tblHas
0d80: 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  h, zName, strlen
0d90: 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20  (zName)+1);.    
0da0: 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20  if( p ) break;. 
0db0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
0dc0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
0dd0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
0de0: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
0df0: 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74  ribes .** a part
0e00: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  icular database 
0e10: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
0e20: 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68 61 74 20  name.** of that 
0e30: 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f  table and (optio
0e40: 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20  nally) the name 
0e50: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
0e60: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
0e70: 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
0e80: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
0e90: 6e 64 2e 0a 2a 2a 20 41 6c 73 6f 20 6c 65 61 76  nd..** Also leav
0ea0: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
0eb0: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
0ec0: 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rrMsg..**.** The
0ed0: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
0ee0: 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
0ef0: 20 61 6e 64 20 73 71 6c 69 74 65 46 69 6e 64 54   and sqliteFindT
0f00: 61 62 6c 65 28 29 0a 2a 2a 20 69 73 20 74 68 61  able().** is tha
0f10: 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  t this routine l
0f20: 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  eaves an error m
0f30: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
0f40: 2d 3e 7a 45 72 72 4d 73 67 0a 2a 2a 20 77 68 65  ->zErrMsg.** whe
0f50: 72 65 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62  re sqliteFindTab
0f60: 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  le() does not..*
0f70: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 4c  /.Table *sqliteL
0f80: 6f 63 61 74 65 54 61 62 6c 65 28 50 61 72 73 65  ocateTable(Parse
0f90: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
0fa0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
0fb0: 73 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65 29  st char *zDbase)
0fc0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20  {.  Table *p;.. 
0fd0: 20 70 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54   p = sqliteFindT
0fe0: 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
0ff0: 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b   zName, zDbase);
1000: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
1010: 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b     if( zDbase ){
1020: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72  .      sqliteErr
1030: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
1040: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
1050: 2e 25 73 22 2c 20 7a 44 62 61 73 65 2c 20 7a 4e  .%s", zDbase, zN
1060: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ame);.    }else 
1070: 69 66 28 20 73 71 6c 69 74 65 46 69 6e 64 54 61  if( sqliteFindTa
1080: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
1090: 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a  zName, 0)!=0 ){.
10a0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f        sqliteErro
10b0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
10c0: 62 6c 65 20 5c 22 25 73 5c 22 20 69 73 20 6e 6f  ble \"%s\" is no
10d0: 74 20 69 6e 20 64 61 74 61 62 61 73 65 20 5c 22  t in database \"
10e0: 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\"",.         
10f0: 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a  zName, zDbase);.
1100: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1110: 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28   sqliteErrorMsg(
1120: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1130: 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 4e 61   table: %s", zNa
1140: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
1150: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1160: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
1170: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
1180: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
1190: 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c  s .** a particul
11a0: 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74  ar index given t
11b0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
11c0: 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65  index.** and the
11d0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
11e0: 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61  abase that conta
11f0: 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ins the index..*
1200: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
1210: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
1220: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
1230: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
1240: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
1250: 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  for the.** table
1260: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d   and the first m
1270: 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73  atching index is
1280: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
1290: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20  checking.** for 
12a0: 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20  duplicate index 
12b0: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
12c0: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
12d0: 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72  r is.** TEMP fir
12e0: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
12f0: 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72  hen any auxiliar
1300: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
1310: 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41  d.** using the A
1320: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
1330: 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 46  /.Index *sqliteF
1340: 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65 20  indIndex(sqlite 
1350: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
1360: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
1370: 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65  ar *zDb){.  Inde
1380: 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  x *p = 0;.  int 
1390: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
13a0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
13b0: 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29     int j = (i<2)
13c0: 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20   ? i^1 : i;  /* 
13d0: 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f  Search TEMP befo
13e0: 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69  re MAIN */.    i
13f0: 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65  f( zDb && sqlite
1400: 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d  StrICmp(zDb, db-
1410: 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29  >aDb[j].zName) )
1420: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
1430: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e   = sqliteHashFin
1440: 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 69 64  d(&db->aDb[j].id
1450: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74  xHash, zName, st
1460: 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a  rlen(zName)+1);.
1470: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
1480: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
1490: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  p;.}../*.** Remo
14a0: 76 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64  ve the given ind
14b0: 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ex from the inde
14c0: 78 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e  x hash table, an
14d0: 64 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65  d free.** its me
14e0: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 2e  mory structures.
14f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  .**.** The index
1500: 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   is removed from
1510: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
1520: 73 68 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a  sh tables but.**
1530: 20 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e   it is not unlin
1540: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62  ked from the Tab
1550: 6c 65 20 74 68 61 74 20 69 74 20 69 6e 64 65 78  le that it index
1560: 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67  es..** Unlinking
1570: 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20   from the Table 
1580: 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20  must be done by 
1590: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
15a0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
15b0: 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74  void sqliteDelet
15c0: 65 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64  eIndex(sqlite *d
15d0: 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  b, Index *p){.  
15e0: 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 0a 20 20  Index *pOld;..  
15f0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 26 26  assert( db!=0 &&
1600: 20 70 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a   p->zName!=0 );.
1610: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48    pOld = sqliteH
1620: 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61  ashInsert(&db->a
1630: 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61  Db[p->iDb].idxHa
1640: 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  sh, p->zName,.  
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e 28 70          strlen(p
1670: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a  ->zName)+1, 0);.
1680: 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 26 26    if( pOld!=0 &&
1690: 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20   pOld!=p ){.    
16a0: 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74  sqliteHashInsert
16b0: 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62  (&db->aDb[p->iDb
16c0: 5d 2e 69 64 78 48 61 73 68 2c 20 70 4f 6c 64 2d  ].idxHash, pOld-
16d0: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
16f0: 6c 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 29  len(pOld->zName)
1700: 2b 31 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d 0a 20  +1, pOld);.  }. 
1710: 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a   sqliteFree(p);.
1720: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
1730: 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20  the given index 
1740: 66 72 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c 20  from its table, 
1750: 74 68 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20 74  then remove.** t
1760: 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68  he index from th
1770: 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62  e index hash tab
1780: 6c 65 20 61 6e 64 20 66 72 65 65 20 69 74 73 20  le and free its 
1790: 6d 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63 74  memory.** struct
17a0: 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ures..*/.void sq
17b0: 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  liteUnlinkAndDel
17c0: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 20  eteIndex(sqlite 
17d0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  *db, Index *pInd
17e0: 65 78 29 7b 0a 20 20 69 66 28 20 70 49 6e 64 65  ex){.  if( pInde
17f0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
1800: 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  x==pIndex ){.   
1810: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
1820: 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
1830: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
1840: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a  {.    Index *p;.
1850: 20 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78      for(p=pIndex
1860: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
1870: 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21  ; p && p->pNext!
1880: 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e  =pIndex; p=p->pN
1890: 65 78 74 29 7b 7d 0a 20 20 20 20 69 66 28 20 70  ext){}.    if( p
18a0: 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49   && p->pNext==pI
18b0: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 2d  ndex ){.      p-
18c0: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d  >pNext = pIndex-
18d0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
18e0: 7d 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65  }.  sqliteDelete
18f0: 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
1900: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73  );.}../*.** Eras
1910: 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66  e all schema inf
1920: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
1930: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  e in-memory hash
1940: 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 64 61   tables of.** da
1950: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1960: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
1970: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
1980: 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20  claim memory.** 
1990: 62 65 66 6f 72 65 20 74 68 65 20 63 6f 6e 6e 65  before the conne
19a0: 63 74 69 6f 6e 20 63 6c 6f 73 65 73 2e 20 20 49  ction closes.  I
19b0: 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64  t is also called
19c0: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
19d0: 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77  ck.** if there w
19e0: 65 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ere schema chang
19f0: 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72  es during the tr
1a00: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1a10: 20 49 66 20 69 44 62 3c 3d 30 20 74 68 65 6e 20   If iDb<=0 then 
1a20: 72 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e  reset the intern
1a30: 61 6c 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73  al schema tables
1a40: 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73   for all databas
1a50: 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20 49 66 20  e.** files.  If 
1a60: 69 44 62 3e 3d 32 20 74 68 65 6e 20 72 65 73 65  iDb>=2 then rese
1a70: 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  t the internal s
1a80: 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c 79 20 74  chema for only t
1a90: 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 66 69 6c  he.** single fil
1aa0: 65 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a  e indicated..*/.
1ab0: 76 6f 69 64 20 73 71 6c 69 74 65 52 65 73 65 74  void sqliteReset
1ac0: 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 73  InternalSchema(s
1ad0: 71 6c 69 74 65 20 2a 64 62 2c 20 69 6e 74 20 69  qlite *db, int i
1ae0: 44 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  Db){.  HashElem 
1af0: 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 74  *pElem;.  Hash t
1b00: 65 6d 70 31 3b 0a 20 20 48 61 73 68 20 74 65 6d  emp1;.  Hash tem
1b10: 70 32 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  p2;.  int i, j;.
1b20: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
1b30: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
1b40: 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20   );.  db->flags 
1b50: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 69 74 69  &= ~SQLITE_Initi
1b60: 61 6c 69 7a 65 64 3b 0a 20 20 66 6f 72 28 69 3d  alized;.  for(i=
1b70: 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  iDb; i<db->nDb; 
1b80: 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44  i++){.    Db *pD
1b90: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
1ba0: 0a 20 20 20 20 74 65 6d 70 31 20 3d 20 70 44 62  .    temp1 = pDb
1bb0: 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 20 20 74  ->tblHash;.    t
1bc0: 65 6d 70 32 20 3d 20 70 44 62 2d 3e 74 72 69 67  emp2 = pDb->trig
1bd0: 48 61 73 68 3b 0a 20 20 20 20 73 71 6c 69 74 65  Hash;.    sqlite
1be0: 48 61 73 68 49 6e 69 74 28 26 70 44 62 2d 3e 74  HashInit(&pDb->t
1bf0: 72 69 67 48 61 73 68 2c 20 53 51 4c 49 54 45 5f  rigHash, SQLITE_
1c00: 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b  HASH_STRING, 0);
1c10: 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73 68 43  .    sqliteHashC
1c20: 6c 65 61 72 28 26 70 44 62 2d 3e 61 46 4b 65 79  lear(&pDb->aFKey
1c30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73  );.    sqliteHas
1c40: 68 43 6c 65 61 72 28 26 70 44 62 2d 3e 69 64 78  hClear(&pDb->idx
1c50: 48 61 73 68 29 3b 0a 20 20 20 20 66 6f 72 28 70  Hash);.    for(p
1c60: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
1c70: 69 72 73 74 28 26 74 65 6d 70 32 29 3b 20 70 45  irst(&temp2); pE
1c80: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
1c90: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
1ca0: 29 7b 0a 20 20 20 20 20 20 54 72 69 67 67 65 72  ){.      Trigger
1cb0: 20 2a 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c   *pTrigger = sql
1cc0: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
1cd0: 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
1ce0: 44 65 6c 65 74 65 54 72 69 67 67 65 72 28 70 54  DeleteTrigger(pT
1cf0: 72 69 67 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  rigger);.    }. 
1d00: 20 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65     sqliteHashCle
1d10: 61 72 28 26 74 65 6d 70 32 29 3b 0a 20 20 20 20  ar(&temp2);.    
1d20: 73 71 6c 69 74 65 48 61 73 68 49 6e 69 74 28 26  sqliteHashInit(&
1d30: 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 53 51  pDb->tblHash, SQ
1d40: 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47  LITE_HASH_STRING
1d50: 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 70 45  , 0);.    for(pE
1d60: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
1d70: 72 73 74 28 26 74 65 6d 70 31 29 3b 20 70 45 6c  rst(&temp1); pEl
1d80: 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
1d90: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
1da0: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
1db0: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
1dc0: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
1dd0: 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54     sqliteDeleteT
1de0: 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
1df0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1e00: 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70 31  HashClear(&temp1
1e10: 29 3b 0a 20 20 20 20 44 62 43 6c 65 61 72 50 72  );.    DbClearPr
1e20: 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42  operty(db, i, DB
1e30: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3b 0a  _SchemaLoaded);.
1e40: 20 20 20 20 69 66 28 20 69 44 62 3e 30 20 29 20      if( iDb>0 ) 
1e50: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
1e60: 73 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a  sert( iDb==0 );.
1e70: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
1e80: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
1e90: 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f  nges;..  /* If o
1ea0: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
1eb0: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
1ec0: 62 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62  base files has b
1ed0: 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a  een closed,.  **
1ee0: 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   then remove the
1ef0: 6e 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c  n from the auxil
1f00: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69  iary database li
1f10: 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65  st.  We take the
1f20: 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74  .  ** opportunit
1f30: 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72  y to do this her
1f40: 65 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20  e since we have 
1f50: 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c  just deleted all
1f60: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68   of the.  ** sch
1f70: 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20  ema hash tables 
1f80: 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f  and therefore do
1f90: 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b   not have to mak
1fa0: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20  e any changes.  
1fb0: 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f  ** to any of tho
1fc0: 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
1fd0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
1fe0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
1ff0: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
2000: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
2010: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d    if( pDb->pBt==
2020: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
2030: 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62 2d  Db->pAux && pDb-
2040: 3e 78 46 72 65 65 41 75 78 20 29 20 70 44 62 2d  >xFreeAux ) pDb-
2050: 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e 70  >xFreeAux(pDb->p
2060: 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  Aux);.      pDb-
2070: 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d  >pAux = 0;.    }
2080: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 32  .  }.  for(i=j=2
2090: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
20a0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
20b0: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
20c0: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
20d0: 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pBt==0 ){.    
20e0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 44 62    sqliteFree(pDb
20f0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
2100: 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  pDb->zName = 0;.
2110: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2120: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c      }.    if( j<
2130: 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61  i ){.      db->a
2140: 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b  Db[j] = db->aDb[
2150: 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b  i];.    }.    j+
2160: 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  +;.  }.  memset(
2170: 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20  &db->aDb[j], 0, 
2180: 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65  (db->nDb-j)*size
2190: 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b  of(db->aDb[j]));
21a0: 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a  .  db->nDb = j;.
21b0: 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32    if( db->nDb<=2
21c0: 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d   && db->aDb!=db-
21d0: 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20  >aDbStatic ){.  
21e0: 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62    memcpy(db->aDb
21f0: 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c  Static, db->aDb,
2200: 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44   2*sizeof(db->aD
2210: 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69  b[0]));.    sqli
2220: 74 65 46 72 65 65 28 64 62 2d 3e 61 44 62 29 3b  teFree(db->aDb);
2230: 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64  .    db->aDb = d
2240: 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20  b->aDbStatic;.  
2250: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
2260: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2270: 64 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c  d whenever a rol
2280: 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 20 49  lback occurs.  I
2290: 66 20 74 68 65 72 65 20 77 65 72 65 0a 2a 2a 20  f there were.** 
22a0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64  schema changes d
22b0: 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61  uring the transa
22c0: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20 68  ction, then we h
22d0: 61 76 65 20 74 6f 20 72 65 73 65 74 20 74 68 65  ave to reset the
22e0: 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  .** internal has
22f0: 68 20 74 61 62 6c 65 73 20 61 6e 64 20 72 65 6c  h tables and rel
2300: 6f 61 64 20 74 68 65 6d 20 66 72 6f 6d 20 64 69  oad them from di
2310: 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  sk..*/.void sqli
2320: 74 65 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e  teRollbackIntern
2330: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
2340: 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d   *db){.  if( db-
2350: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
2360: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b  InternChanges ){
2370: 0a 20 20 20 20 73 71 6c 69 74 65 52 65 73 65 74  .    sqliteReset
2380: 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64  InternalSchema(d
2390: 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  b, 0);.  }.}../*
23a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
23b0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
23c0: 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e  a commit occurs.
23d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43  .*/.void sqliteC
23e0: 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
23f0: 6e 67 65 73 28 73 71 6c 69 74 65 20 2a 64 62 29  nges(sqlite *db)
2400: 7b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73  {.  db->aDb[0].s
2410: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 64  chema_cookie = d
2420: 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 3b 0a  b->next_cookie;.
2430: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
2440: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
2450: 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  nges;.}../*.** R
2460: 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79  emove the memory
2470: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
2480: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2490: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61   the given.** Ta
24a0: 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73  ble.  No changes
24b0: 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73   are made to dis
24c0: 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  k by this routin
24d0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
24e0: 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74  utine just delet
24f0: 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75  es the data stru
2500: 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20  cture.  It does 
2510: 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68  not unlink.** th
2520: 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72  e table data str
2530: 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
2540: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 4e 6f 72  hash table.  Nor
2550: 20 64 6f 65 73 20 69 74 20 72 65 6d 6f 76 65 0a   does it remove.
2560: 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  ** foreign keys 
2570: 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 2e  from the sqlite.
2580: 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65  aFKey hash table
2590: 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64  .  But it does d
25a0: 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79  estroy.** memory
25b0: 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74   structures of t
25c0: 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66  he indices and f
25d0: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f  oreign keys asso
25e0: 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20  ciated with .** 
25f0: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
2600: 20 49 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   Indices associa
2610: 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
2620: 6c 65 20 61 72 65 20 75 6e 6c 69 6e 6b 65 64 20  le are unlinked 
2630: 66 72 6f 6d 20 74 68 65 20 22 64 62 22 0a 2a 2a  from the "db".**
2640: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
2650: 69 66 20 64 62 21 3d 4e 55 4c 4c 2e 20 20 49 66  if db!=NULL.  If
2660: 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63   db==NULL, indic
2670: 65 73 20 61 74 74 61 63 68 65 64 20 74 6f 0a 2a  es attached to.*
2680: 2a 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  * the table are 
2690: 64 65 6c 65 74 65 64 2c 20 62 75 74 20 69 74 20  deleted, but it 
26a0: 69 73 20 61 73 73 75 6d 65 64 20 74 68 65 79 20  is assumed they 
26b0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
26c0: 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a  n.** unlinked..*
26d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c  /.void sqliteDel
26e0: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 20  eteTable(sqlite 
26f0: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
2700: 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  le){.  int i;.  
2710: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a  Index *pIndex, *
2720: 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70  pNext;.  FKey *p
2730: 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79  FKey, *pNextFKey
2740: 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  ;..  if( pTable=
2750: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
2760: 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e  /* Delete all in
2770: 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
2780: 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65   with this table
2790: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64  .  */.  for(pInd
27a0: 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e  ex = pTable->pIn
27b0: 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e  dex; pIndex; pIn
27c0: 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  dex=pNext){.    
27d0: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
27e0: 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72  pNext;.    asser
27f0: 74 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d  t( pIndex->iDb==
2800: 70 54 61 62 6c 65 2d 3e 69 44 62 20 7c 7c 20 28  pTable->iDb || (
2810: 70 54 61 62 6c 65 2d 3e 69 44 62 3d 3d 30 20 26  pTable->iDb==0 &
2820: 26 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 31  & pIndex->iDb==1
2830: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44  ) );.    sqliteD
2840: 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70  eleteIndex(db, p
2850: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Index);.  }..  /
2860: 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 66 6f 72  * Delete all for
2870: 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69  eign keys associ
2880: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74  ated with this t
2890: 61 62 6c 65 2e 20 20 54 68 65 20 6b 65 79 73 0a  able.  The keys.
28a0: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65    ** should have
28b0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 75 6e   already been un
28c0: 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20  linked from the 
28d0: 64 62 2d 3e 61 46 4b 65 79 20 68 61 73 68 20 74  db->aFKey hash t
28e0: 61 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72  able .  */.  for
28f0: 28 70 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70  (pFKey=pTable->p
2900: 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b  FKey; pFKey; pFK
2910: 65 79 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20  ey=pNextFKey){. 
2920: 20 20 20 70 4e 65 78 74 46 4b 65 79 20 3d 20 70     pNextFKey = p
2930: 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b  FKey->pNextFrom;
2940: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
2950: 62 6c 65 2d 3e 69 44 62 3c 64 62 2d 3e 6e 44 62  ble->iDb<db->nDb
2960: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2970: 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26  sqliteHashFind(&
2980: 64 62 2d 3e 61 44 62 5b 70 54 61 62 6c 65 2d 3e  db->aDb[pTable->
2990: 69 44 62 5d 2e 61 46 4b 65 79 2c 0a 20 20 20 20  iDb].aFKey,.    
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54         pFKey->zT
29c0: 6f 2c 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d  o, strlen(pFKey-
29d0: 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79 20  >zTo)+1)!=pFKey 
29e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
29f0: 65 28 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 0a 20  e(pFKey);.  }.. 
2a00: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54   /* Delete the T
2a10: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  able structure i
2a20: 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 66 6f  tself..  */.  fo
2a30: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d  r(i=0; i<pTable-
2a40: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
2a50: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
2a60: 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  le->aCol[i].zNam
2a70: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
2a80: 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  ee(pTable->aCol[
2a90: 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73  i].zDflt);.    s
2aa0: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
2ab0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29  ->aCol[i].zType)
2ac0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
2ad0: 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ee(pTable->zName
2ae0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
2af0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20  pTable->aCol);. 
2b00: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c   sqliteSelectDel
2b10: 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c  ete(pTable->pSel
2b20: 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ect);.  sqliteFr
2b30: 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f  ee(pTable);.}../
2b40: 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20  *.** Unlink the 
2b50: 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d  given table from
2b60: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73   the hash tables
2b70: 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20   and the delete 
2b80: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72  the.** table str
2b90: 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20  ucture with all 
2ba0: 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20  its indices and 
2bb0: 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f  foreign keys..*/
2bc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
2bd0: 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  iteUnlinkAndDele
2be0: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 20 2a  teTable(sqlite *
2bf0: 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20  db, Table *p){. 
2c00: 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
2c10: 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46 32 3b  FKey *pF1, *pF2;
2c20: 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d 3e 69 44  .  int i = p->iD
2c30: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  b;.  assert( db!
2c40: 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73  =0 );.  pOld = s
2c50: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
2c60: 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 74 62 6c 48  &db->aDb[i].tblH
2c70: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73  ash, p->zName, s
2c80: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
2c90: 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  1, 0);.  assert(
2ca0: 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64   pOld==0 || pOld
2cb0: 3d 3d 70 20 29 3b 0a 20 20 66 6f 72 28 70 46 31  ==p );.  for(pF1
2cc0: 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31 3b 20  =p->pFKey; pF1; 
2cd0: 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74 46 72  pF1=pF1->pNextFr
2ce0: 6f 6d 29 7b 0a 20 20 20 20 69 6e 74 20 6e 54 6f  om){.    int nTo
2cf0: 20 3d 20 73 74 72 6c 65 6e 28 70 46 31 2d 3e 7a   = strlen(pF1->z
2d00: 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 70 46 32  To) + 1;.    pF2
2d10: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e   = sqliteHashFin
2d20: 64 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 61 46  d(&db->aDb[i].aF
2d30: 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e  Key, pF1->zTo, n
2d40: 54 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 46 32  To);.    if( pF2
2d50: 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20 20 73  ==pF1 ){.      s
2d60: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
2d70: 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 61 46 4b 65  &db->aDb[i].aFKe
2d80: 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f  y, pF1->zTo, nTo
2d90: 2c 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 29 3b  , pF1->pNextTo);
2da0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2db0: 20 20 77 68 69 6c 65 28 20 70 46 32 20 26 26 20    while( pF2 && 
2dc0: 70 46 32 2d 3e 70 4e 65 78 74 54 6f 21 3d 70 46  pF2->pNextTo!=pF
2dd0: 31 20 29 7b 20 70 46 32 3d 70 46 32 2d 3e 70 4e  1 ){ pF2=pF2->pN
2de0: 65 78 74 54 6f 3b 20 7d 0a 20 20 20 20 20 20 69  extTo; }.      i
2df0: 66 28 20 70 46 32 20 29 7b 0a 20 20 20 20 20 20  f( pF2 ){.      
2e00: 20 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d    pF2->pNextTo =
2e10: 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20   pF1->pNextTo;. 
2e20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2e30: 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54  .  sqliteDeleteT
2e40: 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  able(db, p);.}..
2e50: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
2e60: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 75 73  the name of a us
2e70: 65 72 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  er table or inde
2e80: 78 20 66 72 6f 6d 20 61 20 74 6f 6b 65 6e 2e 0a  x from a token..
2e90: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
2ea0: 6f 6c 64 20 74 68 65 20 6e 61 6d 65 20 69 73 20  old the name is 
2eb0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
2ec0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
2ed0: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 66 72 65 65   must.** be free
2ee0: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
2ef0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68   function..*/.ch
2f00: 61 72 20 2a 73 71 6c 69 74 65 54 61 62 6c 65 4e  ar *sqliteTableN
2f10: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b  ameFromToken(Tok
2f20: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68  en *pName){.  ch
2f30: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ar *zName = sqli
2f40: 74 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d  teStrNDup(pName-
2f50: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20  >z, pName->n);. 
2f60: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a   sqliteDequote(z
2f70: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
2f80: 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zName;.}../*.** 
2f90: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
2fa0: 20 6f 70 65 6e 20 74 68 65 20 61 70 70 72 6f 70   open the approp
2fb0: 72 69 61 74 65 20 6d 61 73 74 65 72 20 74 61 62  riate master tab
2fc0: 6c 65 2e 20 20 54 68 65 20 74 61 62 6c 65 0a 2a  le.  The table.*
2fd0: 2a 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65  * opened will be
2fe0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 66   SQLITE_MASTER f
2ff0: 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 74 61  or persistent ta
3000: 62 6c 65 73 20 61 6e 64 20 0a 2a 2a 20 53 51 4c  bles and .** SQL
3010: 49 54 45 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20  ITE_TEMP_MASTER 
3020: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61  for temporary ta
3030: 62 6c 65 73 2e 20 20 54 68 65 20 74 61 62 6c 65  bles.  The table
3040: 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e   is opened.** on
3050: 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f   cursor 0..*/.vo
3060: 69 64 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73  id sqliteOpenMas
3070: 74 65 72 54 61 62 6c 65 28 56 64 62 65 20 2a 76  terTable(Vdbe *v
3080: 2c 20 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20  , int isTemp){. 
3090: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
30a0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
30b0: 69 73 54 65 6d 70 2c 20 30 29 3b 0a 20 20 73 71  isTemp, 0);.  sq
30c0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
30d0: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30   OP_OpenWrite, 0
30e0: 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  , 2);.}../*.** B
30f0: 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e  egin constructin
3100: 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65  g a new table re
3110: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20  presentation in 
3120: 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73  memory.  This is
3130: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66  .** the first of
3140: 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20   several action 
3150: 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65  routines that ge
3160: 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70  t called in resp
3170: 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45  onse.** to a CRE
3180: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
3190: 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75  ent.  In particu
31a0: 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  lar, this routin
31b0: 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61  e is called.** a
31c0: 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65  fter seeing toke
31d0: 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20  ns "CREATE" and 
31e0: 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20  "TABLE" and the 
31f0: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65  table name.  The
3200: 0a 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b 65 6e  .** pStart token
3210: 20 69 73 20 74 68 65 20 43 52 45 41 54 45 20 61   is the CREATE a
3220: 6e 64 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  nd pName is the 
3230: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65  table name.  The
3240: 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20   isTemp.** flag 
3250: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74  is true if the t
3260: 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73  able should be s
3270: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78  tored in the aux
3280: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a  iliary database.
3290: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
32a0: 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  of in the main d
32b0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
32c0: 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  his is normally 
32d0: 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e  the case.** when
32e0: 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22   the "TEMP" or "
32f0: 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f  TEMPORARY" keywo
3300: 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74  rd occurs in bet
3310: 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61  ween.** CREATE a
3320: 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20  nd TABLE..**.** 
3330: 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65  The new table re
3340: 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69  cord is initiali
3350: 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70  zed and put in p
3360: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
3370: 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20  ..** As more of 
3380: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
3390: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
33a0: 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c  rsed, additional
33b0: 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69   action.** routi
33c0: 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  nes will be call
33d0: 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69  ed to add more i
33e0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
33f0: 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74  is record..** At
3400: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
3410: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
3420: 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69  tement, the sqli
3430: 74 65 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75  teEndTable() rou
3440: 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
3450: 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  d to complete th
3460: 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f  e construction o
3470: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
3480: 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20  record..*/.void 
3490: 73 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c 65  sqliteStartTable
34a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
34b0: 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63  e,   /* Parser c
34c0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
34d0: 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20  n *pStart,   /* 
34e0: 54 68 65 20 22 43 52 45 41 54 45 22 20 74 6f 6b  The "CREATE" tok
34f0: 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  en */.  Token *p
3500: 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  Name,    /* Name
3510: 20 6f 66 20 74 61 62 6c 65 20 6f 72 20 76 69 65   of table or vie
3520: 77 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20  w to create */. 
3530: 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20   int isTemp,    
3540: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
3550: 73 20 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c  s is a TEMP tabl
3560: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65  e */.  int isVie
3570: 77 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  w       /* True 
3580: 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49 45  if this is a VIE
3590: 57 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  W */.){.  Table 
35a0: 2a 70 54 61 62 6c 65 3b 0a 20 20 49 6e 64 65 78  *pTable;.  Index
35b0: 20 2a 70 49 64 78 3b 0a 20 20 63 68 61 72 20 2a   *pIdx;.  char *
35c0: 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 20  zName;.  sqlite 
35d0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
35e0: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
35f0: 6e 74 20 69 44 62 3b 0a 0a 20 20 70 50 61 72 73  nt iDb;..  pPars
3600: 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 20 3d  e->sFirstToken =
3610: 20 2a 70 53 74 61 72 74 3b 0a 20 20 7a 4e 61 6d   *pStart;.  zNam
3620: 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e  e = sqliteTableN
3630: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61  ameFromToken(pNa
3640: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
3650: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
3660: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  if( db->init.iDb
3670: 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31  ==1 ) isTemp = 1
3680: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
3690: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
36a0: 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28 69  ION.  assert( (i
36b0: 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54 65  sTemp & 1)==isTe
36c0: 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e  mp );.  {.    in
36d0: 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72  t code;.    char
36e0: 20 2a 7a 44 62 20 3d 20 69 73 54 65 6d 70 20 3f   *zDb = isTemp ?
36f0: 20 22 74 65 6d 70 22 20 3a 20 22 6d 61 69 6e 22   "temp" : "main"
3700: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
3710: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
3720: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
3730: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73   SCHEMA_TABLE(is
3740: 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29  Temp), 0, zDb) )
3750: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
3760: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ee(zName);.     
3770: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
3780: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
3790: 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 65 6d  .      if( isTem
37a0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
37b0: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
37c0: 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  E_TEMP_VIEW;.   
37d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37e0: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
37f0: 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20  CREATE_VIEW;.   
3800: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
3810: 20 20 20 20 20 20 69 66 28 20 69 73 54 65 6d 70        if( isTemp
3820: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
3830: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
3840: 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
3850: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3860: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
3870: 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20  CREATE_TABLE;.  
3880: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3890: 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68  if( sqliteAuthCh
38a0: 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
38b0: 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  , zName, 0, zDb)
38c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
38d0: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
38e0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
38f0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 0a 0a 20  .  }.#endif. .. 
3900: 20 2f 2a 20 42 65 66 6f 72 65 20 74 72 79 69 6e   /* Before tryin
3910: 67 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 65  g to create a te
3920: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6d  mporary table, m
3930: 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 72  ake sure the Btr
3940: 65 65 20 66 6f 72 0a 20 20 2a 2a 20 68 6f 6c 64  ee for.  ** hold
3950: 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
3960: 62 6c 65 73 20 69 73 20 6f 70 65 6e 2e 0a 20 20  bles is open..  
3970: 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20  */.  if( isTemp 
3980: 26 26 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  && db->aDb[1].pB
3990: 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d  t==0 && !pParse-
39a0: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
39b0: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 42  int rc = sqliteB
39c0: 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20  treeFactory(db, 
39d0: 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c  0, 0, MAX_PAGES,
39e0: 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74   &db->aDb[1].pBt
39f0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
3a00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
3a10: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
3a20: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
3a30: 73 67 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f  sg, "unable to o
3a40: 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
3a50: 64 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20  database ".     
3a60: 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f     "file for sto
3a70: 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74  ring temporary t
3a80: 61 62 6c 65 73 22 2c 20 28 63 68 61 72 2a 29 30  ables", (char*)0
3a90: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
3aa0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72  >nErr++;.      r
3ab0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
3ac0: 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
3ad0: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20   SQLITE_InTrans 
3ae0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
3af0: 6c 69 74 65 42 74 72 65 65 42 65 67 69 6e 54 72  liteBtreeBeginTr
3b00: 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ans(db->aDb[1].p
3b10: 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Bt);.      if( r
3b20: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
3b30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
3b40: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
3b50: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e 61 62  ->zErrMsg, "unab
3b60: 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72 69 74  le to get a writ
3b70: 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20  e lock on ".    
3b80: 20 20 20 20 20 20 22 74 68 65 20 74 65 6d 70 6f        "the tempo
3b90: 72 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  rary database fi
3ba0: 6c 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  le", 0);.       
3bb0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
3bc0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
3bd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3be0: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
3bf0: 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  re the new table
3c00: 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63   name does not c
3c10: 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65  ollide with an e
3c20: 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  xisting.  ** ind
3c30: 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65  ex or table name
3c40: 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f  .  Issue an erro
3c50: 72 20 6d 65 73 73 61 67 65 20 69 66 20 69 74 20  r message if it 
3c60: 64 6f 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  does..  **.  ** 
3c70: 49 66 20 77 65 20 61 72 65 20 72 65 2d 72 65 61  If we are re-rea
3c80: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
3c90: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
3ca0: 61 75 73 65 20 6f 66 20 61 20 73 63 68 65 6d 61  ause of a schema
3cb0: 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20 61 6e 64  .  ** change and
3cc0: 20 61 20 6e 65 77 20 70 65 72 6d 61 6e 65 6e 74   a new permanent
3cd0: 20 74 61 62 6c 65 20 69 73 20 66 6f 75 6e 64 20   table is found 
3ce0: 77 68 6f 73 65 20 6e 61 6d 65 20 63 6f 6c 6c 69  whose name colli
3cf0: 64 65 73 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e  des with.  ** an
3d00: 20 65 78 69 73 74 69 6e 67 20 74 65 6d 70 6f 72   existing tempor
3d10: 61 72 79 20 74 61 62 6c 65 2c 20 74 68 61 74 20  ary table, that 
3d20: 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e  is not an error.
3d30: 0a 20 20 2a 2f 0a 20 20 70 54 61 62 6c 65 20 3d  .  */.  pTable =
3d40: 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65   sqliteFindTable
3d50: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  (db, zName, 0);.
3d60: 20 20 69 44 62 20 3d 20 69 73 54 65 6d 70 20 3f    iDb = isTemp ?
3d70: 20 31 20 3a 20 64 62 2d 3e 69 6e 69 74 2e 69 44   1 : db->init.iD
3d80: 62 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 21  b;.  if( pTable!
3d90: 3d 30 20 26 26 20 28 70 54 61 62 6c 65 2d 3e 69  =0 && (pTable->i
3da0: 44 62 3d 3d 69 44 62 20 7c 7c 20 21 64 62 2d 3e  Db==iDb || !db->
3db0: 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20  init.busy) ){.  
3dc0: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
3dd0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
3de0: 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 30  Msg, "table ", 0
3df0: 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  , pName->z, pNam
3e00: 65 2d 3e 6e 2c 0a 20 20 20 20 20 20 20 20 22 20  e->n,.        " 
3e10: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
3e20: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
3e30: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
3e40: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
3e50: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
3e60: 20 7d 0a 20 20 69 66 28 20 28 70 49 64 78 20 3d   }.  if( (pIdx =
3e70: 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78   sqliteFindIndex
3e80: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21  (db, zName, 0))!
3e90: 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
3ea0: 28 70 49 64 78 2d 3e 69 44 62 3d 3d 30 20 7c 7c  (pIdx->iDb==0 ||
3eb0: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29   !db->init.busy)
3ec0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
3ed0: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
3ee0: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 68 65 72 65  >zErrMsg, "there
3ef0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69   is already an i
3f00: 6e 64 65 78 20 6e 61 6d 65 64 20 22 2c 20 0a 20  ndex named ", . 
3f10: 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 28 63 68        zName, (ch
3f20: 61 72 2a 29 30 29 3b 0a 20 20 20 20 73 71 6c 69  ar*)0);.    sqli
3f30: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
3f40: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
3f50: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
3f60: 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71   }.  pTable = sq
3f70: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
3f80: 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69  of(Table) );.  i
3f90: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  f( pTable==0 ){.
3fa0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
3fb0: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
3fc0: 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d  n;.  }.  pTable-
3fd0: 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
3fe0: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
3ff0: 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43   0;.  pTable->aC
4000: 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ol = 0;.  pTable
4010: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
4020: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
4030: 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 44   0;.  pTable->iD
4040: 62 20 3d 20 69 44 62 3b 0a 20 20 69 66 28 20 70  b = iDb;.  if( p
4050: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
4060: 20 29 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54   ) sqliteDeleteT
4070: 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d  able(db, pParse-
4080: 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 70  >pNewTable);.  p
4090: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
40a0: 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a   = pTable;..  /*
40b0: 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e   Begin generatin
40c0: 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  g the code that 
40d0: 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20  will insert the 
40e0: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74  table record int
40f0: 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54  o.  ** the SQLIT
4100: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20  E_MASTER table. 
4110: 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75   Note in particu
4120: 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74  lar that we must
4130: 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61   go ahead.  ** a
4140: 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  nd allocate the 
4150: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
4160: 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72  r the table entr
4170: 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61  y now.  Before a
4180: 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20  ny.  ** PRIMARY 
4190: 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65  KEY or UNIQUE ke
41a0: 79 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65  ywords are parse
41b0: 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72  d.  Those keywor
41c0: 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20  ds will cause.  
41d0: 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65  ** indices to be
41e0: 20 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65   created and the
41f0: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75   table record mu
4200: 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74  st come before t
4210: 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  he .  ** indices
4220: 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65  .  Hence, the re
4230: 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20  cord number for 
4240: 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62  the table must b
4250: 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a  e allocated.  **
4260: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
4270: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
4280: 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 47 65  && (v = sqliteGe
4290: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
42a0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 42  0 ){.    sqliteB
42b0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
42c0: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 73  on(pParse, 0, is
42d0: 54 65 6d 70 29 3b 0a 20 20 20 20 69 66 28 20 21  Temp);.    if( !
42e0: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
42f0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4300: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64  v, OP_Integer, d
4310: 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20  b->file_format, 
4320: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
4330: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4340: 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 31 29  SetCookie, 0, 1)
4350: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
4360: 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  teOpenMasterTabl
4370: 65 28 76 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20  e(v, isTemp);.  
4380: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4390: 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f  p(v, OP_NewRecno
43a0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
43b0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
43c0: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
43d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
43e0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
43f0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
4400: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4410: 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20  P_PutIntKey, 0, 
4420: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
4430: 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d   Add a new colum
4440: 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  n to the table c
4450: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
4460: 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a  onstructed..**.*
4470: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
4480: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
4490: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f  once for each co
44a0: 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  lumn declaration
44b0: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
44c0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
44d0: 20 20 73 71 6c 69 74 65 53 74 61 72 74 54 61 62    sqliteStartTab
44e0: 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64  le() gets called
44f0: 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74  .** first to get
4500: 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20   things going.  
4510: 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  Then this routin
4520: 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
4530: 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a  each.** column..
4540: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64  */.void sqliteAd
4550: 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70  dColumn(Parse *p
4560: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
4570: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
4580: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
4590: 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 43 6f 6c 75  r *z = 0;.  Colu
45a0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20  mn *pCol;.  if( 
45b0: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
45c0: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
45d0: 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 53 65 74  urn;.  sqliteSet
45e0: 4e 53 74 72 69 6e 67 28 26 7a 2c 20 70 4e 61 6d  NString(&z, pNam
45f0: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20  e->z, pName->n, 
4600: 30 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  0);.  if( z==0 )
4610: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
4620: 65 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66  eDequote(z);.  f
4630: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
4640: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
4650: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
4660: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  , p->aCol[i].zNa
4670: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
4680: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
4690: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
46a0: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
46b0: 75 6d 6e 20 6e 61 6d 65 3a 20 22 2c 20 7a 2c 20  umn name: ", z, 
46c0: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
46d0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
46e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
46f0: 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(z);.      retu
4700: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
4710: 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30  if( (p->nCol & 0
4720: 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f  x7)==0 ){.    Co
4730: 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20  lumn *aNew;.    
4740: 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61  aNew = sqliteRea
4750: 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28  lloc( p->aCol, (
4760: 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f  p->nCol+8)*sizeo
4770: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
4780: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
4790: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 2d  ) return;.    p-
47a0: 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20  >aCol = aNew;.  
47b0: 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61  }.  pCol = &p->a
47c0: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20  Col[p->nCol];.  
47d0: 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20  memset(pCol, 0, 
47e0: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
47f0: 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61  ]));.  pCol->zNa
4800: 6d 65 20 3d 20 7a 3b 0a 20 20 70 43 6f 6c 2d 3e  me = z;.  pCol->
4810: 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49  sortOrder = SQLI
4820: 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 70 2d 3e  TE_SO_NUM;.  p->
4830: 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nCol++;.}../*.**
4840: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4850: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
4860: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
4870: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
4880: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
4890: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
48a0: 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20  .  A "NOT NULL" 
48b0: 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a  constraint has.*
48c0: 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61  * been seen on a
48d0: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72   column.  This r
48e0: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
48f0: 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a  notNull flag on.
4900: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75  ** the column cu
4910: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
4920: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
4930: 6f 69 64 20 73 71 6c 69 74 65 41 64 64 4e 6f 74  oid sqliteAddNot
4940: 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72  Null(Parse *pPar
4950: 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
4960: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
4970: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20  int i;.  if( (p 
4980: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
4990: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
49a0: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
49b0: 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20  1;.  if( i>=0 ) 
49c0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75  p->aCol[i].notNu
49d0: 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a  ll = onError;.}.
49e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
49f0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
4a00: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
4a10: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
4a20: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
4a30: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
4a40: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69  tement.  The pFi
4a50: 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  rst token is the
4a60: 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20   first.** token 
4a70: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  in the sequence 
4a80: 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64  of tokens that d
4a90: 65 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65  escribe the type
4aa0: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   of the.** colum
4ab0: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
4ac0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
4ad0: 20 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c    pLast is the l
4ae0: 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20  ast token.** in 
4af0: 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55  the sequence.  U
4b00: 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  se this informat
4b10: 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ion to construct
4b20: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61   a string.** tha
4b30: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
4b40: 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  ypename of the c
4b50: 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20  olumn and store 
4b60: 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69  that string.** i
4b70: 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69  n zType..*/ .voi
4b80: 64 20 73 71 6c 69 74 65 41 64 64 43 6f 6c 75 6d  d sqliteAddColum
4b90: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
4ba0: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 46 69 72  rse, Token *pFir
4bb0: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74  st, Token *pLast
4bc0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
4bd0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
4be0: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a   n;.  char *z, *
4bf0: 2a 70 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  *pz;.  Column *p
4c00: 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  Col;.  if( (p = 
4c10: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4c20: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
4c30: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
4c40: 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74  .  if( i<0 ) ret
4c50: 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70  urn;.  pCol = &p
4c60: 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 70 7a 20  ->aCol[i];.  pz 
4c70: 3d 20 26 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a  = &pCol->zType;.
4c80: 20 20 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b    n = pLast->n +
4c90: 20 41 64 64 72 28 70 4c 61 73 74 2d 3e 7a 29 20   Addr(pLast->z) 
4ca0: 2d 20 41 64 64 72 28 70 46 69 72 73 74 2d 3e 7a  - Addr(pFirst->z
4cb0: 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 74 4e 53  );.  sqliteSetNS
4cc0: 74 72 69 6e 67 28 70 7a 2c 20 70 46 69 72 73 74  tring(pz, pFirst
4cd0: 2d 3e 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 7a 20  ->z, n, 0);.  z 
4ce0: 3d 20 2a 70 7a 3b 0a 20 20 69 66 28 20 7a 3d 3d  = *pz;.  if( z==
4cf0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
4d00: 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69  r(i=j=0; z[i]; i
4d10: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d  ++){.    int c =
4d20: 20 7a 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 69   z[i];.    if( i
4d30: 73 73 70 61 63 65 28 63 29 20 29 20 63 6f 6e 74  sspace(c) ) cont
4d40: 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d  inue;.    z[j++]
4d50: 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d   = c;.  }.  z[j]
4d60: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 72   = 0;.  if( pPar
4d70: 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72  se->db->file_for
4d80: 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 70 43  mat>=4 ){.    pC
4d90: 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  ol->sortOrder = 
4da0: 73 71 6c 69 74 65 43 6f 6c 6c 61 74 65 54 79 70  sqliteCollateTyp
4db0: 65 28 7a 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65  e(z, n);.  }else
4dc0: 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 6f 72 74  {.    pCol->sort
4dd0: 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53  Order = SQLITE_S
4de0: 4f 5f 4e 55 4d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  O_NUM;.  }.}../*
4df0: 0a 2a 2a 20 54 68 65 20 67 69 76 65 6e 20 74 6f  .** The given to
4e00: 6b 65 6e 20 69 73 20 74 68 65 20 64 65 66 61 75  ken is the defau
4e10: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
4e20: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64   last column add
4e30: 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62  ed to.** the tab
4e40: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
4e50: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
4e60: 20 20 49 66 20 22 6d 69 6e 75 73 46 6c 61 67 22    If "minusFlag"
4e70: 20 69 73 20 74 72 75 65 2c 20 69 74 0a 2a 2a 20   is true, it.** 
4e80: 6d 65 61 6e 73 20 74 68 65 20 76 61 6c 75 65 20  means the value 
4e90: 74 6f 6b 65 6e 20 77 61 73 20 70 72 65 63 65 64  token was preced
4ea0: 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69  ed by a minus si
4eb0: 67 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  gn..**.** This r
4ec0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
4ed0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
4ee0: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
4ef0: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
4f00: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
4f10: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
4f20: 69 64 20 73 71 6c 69 74 65 41 64 64 44 65 66 61  id sqliteAddDefa
4f30: 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a  ultValue(Parse *
4f40: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
4f50: 56 61 6c 2c 20 69 6e 74 20 6d 69 6e 75 73 46 6c  Val, int minusFl
4f60: 61 67 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  ag){.  Table *p;
4f70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
4f80: 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20 28 70 20   **pz;.  if( (p 
4f90: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
4fa0: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
4fb0: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
4fc0: 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72  1;.  if( i<0 ) r
4fd0: 65 74 75 72 6e 3b 0a 20 20 70 7a 20 3d 20 26 70  eturn;.  pz = &p
4fe0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 3b  ->aCol[i].zDflt;
4ff0: 0a 20 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67  .  if( minusFlag
5000: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
5010: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 22 2d 22  tNString(pz, "-"
5020: 2c 20 31 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56  , 1, pVal->z, pV
5030: 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c  al->n, 0);.  }el
5040: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65  se{.    sqliteSe
5050: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 56 61  tNString(pz, pVa
5060: 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30  l->z, pVal->n, 0
5070: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 44  );.  }.  sqliteD
5080: 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a  equote(*pz);.}..
5090: 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20  /*.** Designate 
50a0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
50b0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20  for the table.  
50c0: 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
50d0: 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  of names .** of 
50e0: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72  columns that for
50f0: 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  m the primary ke
5100: 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20  y.  If pList is 
5110: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a  NULL, then the.*
5120: 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  * most recently 
5130: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20  added column of 
5140: 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65  the table is the
5150: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a   primary key..**
5160: 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20  .** A table can 
5170: 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65  have at most one
5180: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
5190: 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
51a0: 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69  ady has.** a pri
51b0: 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68  mary key (and th
51c0: 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
51d0: 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68   primary key) th
51e0: 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20  en create an.** 
51f0: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
5200: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
5210: 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63  is on a single c
5220: 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61  olumn whose data
5230: 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c  type is INTEGER,
5240: 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  .** then we will
5250: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74   try to use that
5260: 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72   column as the r
5270: 6f 77 20 69 64 2e 20 20 28 45 78 63 65 70 74 69  ow id.  (Excepti
5280: 6f 6e 3a 0a 2a 2a 20 46 6f 72 20 62 61 63 6b 77  on:.** For backw
5290: 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
52a0: 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 64 61  ty with older da
52b0: 74 61 62 61 73 65 73 2c 20 64 6f 20 6e 6f 74 20  tabases, do not 
52c0: 64 6f 20 74 68 69 73 0a 2a 2a 20 69 66 20 74 68  do this.** if th
52d0: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 76 65  e file format ve
52e0: 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 73 20  rsion number is 
52f0: 6c 65 73 73 20 74 68 61 6e 20 31 2e 29 20 20 53  less than 1.)  S
5300: 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b  et the Table.iPK
5310: 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ey.** field of t
5320: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
5330: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  onstruction to b
5340: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  e the index of t
5350: 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52  he.** INTEGER PR
5360: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
5370: 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69  .  Table.iPKey i
5380: 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74  s set to -1 if t
5390: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e  here is.** no IN
53a0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
53b0: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  Y..**.** If the 
53c0: 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e  key is not an IN
53d0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
53e0: 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  Y, then create a
53f0: 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78   unique.** index
5400: 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e   for the key.  N
5410: 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  o index is creat
5420: 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50  ed for INTEGER P
5430: 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a  RIMARY KEYs..*/.
5440: 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 50 72  void sqliteAddPr
5450: 69 6d 61 72 79 4b 65 79 28 50 61 72 73 65 20 2a  imaryKey(Parse *
5460: 70 50 61 72 73 65 2c 20 49 64 4c 69 73 74 20 2a  pParse, IdList *
5470: 70 4c 69 73 74 2c 20 69 6e 74 20 6f 6e 45 72 72  pList, int onErr
5480: 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  or){.  Table *pT
5490: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
54a0: 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  wTable;.  char *
54b0: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zType = 0;.  int
54c0: 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20   iCol = -1, i;. 
54d0: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67   if( pTab==0 ) g
54e0: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
54f0: 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62  exit;.  if( pTab
5500: 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a  ->hasPrimKey ){.
5510: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
5520: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
5530: 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 5c 22 22  rMsg, "table \""
5540: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a  , pTab->zName, .
5550: 20 20 20 20 20 20 20 20 22 5c 22 20 68 61 73 20          "\" has 
5560: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72  more than one pr
5570: 69 6d 61 72 79 20 6b 65 79 22 2c 20 28 63 68 61  imary key", (cha
5580: 72 2a 29 30 29 3b 0a 20 20 20 20 70 50 61 72 73  r*)0);.    pPars
5590: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67  e->nErr++;.    g
55a0: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
55b0: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62  exit;.  }.  pTab
55c0: 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31  ->hasPrimKey = 1
55d0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
55e0: 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
55f0: 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20  Tab->nCol - 1;. 
5600: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43     pTab->aCol[iC
5610: 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20  ol].isPrimKey = 
5620: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
5630: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
5640: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
5650: 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
5660: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
5670: 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iCol++){.       
5680: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
5690: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
56a0: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
56b0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  [iCol].zName)==0
56c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
56d0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  }.      if( iCol
56e0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 20 70 54  <pTab->nCol ) pT
56f0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69  ab->aCol[iCol].i
5700: 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20  sPrimKey = 1;.  
5710: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73    }.    if( pLis
5720: 74 2d 3e 6e 49 64 3e 31 20 29 20 69 43 6f 6c 20  t->nId>1 ) iCol 
5730: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  = -1;.  }.  if( 
5740: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
5750: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
5760: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
5770: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
5780: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
5790: 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72  se->db->file_for
57a0: 6d 61 74 3e 3d 31 20 26 26 20 0a 20 20 20 20 20  mat>=1 && .     
57b0: 20 20 20 20 20 20 7a 54 79 70 65 20 26 26 20 73        zType && s
57c0: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 54 79  qliteStrICmp(zTy
57d0: 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d  pe, "INTEGER")==
57e0: 30 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69  0 ){.    pTab->i
57f0: 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  PKey = iCol;.   
5800: 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d   pTab->keyConf =
5810: 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 7d 65 6c 73   onError;.  }els
5820: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 43 72 65  e{.    sqliteCre
5830: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
5840: 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e   0, 0, pList, on
5850: 45 72 72 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20  Error, 0, 0);.  
5860: 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d    pList = 0;.  }
5870: 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  ..primary_key_ex
5880: 69 74 3a 0a 20 20 73 71 6c 69 74 65 49 64 4c 69  it:.  sqliteIdLi
5890: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
58a0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
58b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
58c0: 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61  ppropriate colla
58d0: 74 69 6e 67 20 74 79 70 65 20 67 69 76 65 6e 20  ting type given 
58e0: 61 20 74 79 70 65 20 6e 61 6d 65 2e 0a 2a 2a 0a  a type name..**.
58f0: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ** The collation
5900: 20 74 79 70 65 20 69 73 20 74 65 78 74 20 28 53   type is text (S
5910: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 29 20 69  QLITE_SO_TEXT) i
5920: 66 20 74 68 65 20 74 79 70 65 0a 2a 2a 20 6e 61  f the type.** na
5930: 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  me contains the 
5940: 63 68 61 72 61 63 74 65 72 20 73 74 72 65 61 6d  character stream
5950: 20 22 74 65 78 74 22 20 6f 72 20 22 62 6c 6f 62   "text" or "blob
5960: 22 20 6f 72 0a 2a 2a 20 22 63 6c 6f 62 22 2e 20  " or.** "clob". 
5970: 20 41 6e 79 20 6f 74 68 65 72 20 74 79 70 65 20   Any other type 
5980: 6e 61 6d 65 20 69 73 20 63 6f 6c 6c 61 74 65 64  name is collated
5990: 20 61 73 20 6e 75 6d 65 72 69 63 0a 2a 2a 20 28   as numeric.** (
59a0: 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 29 2e 0a  SQLITE_SO_NUM)..
59b0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 43 6f 6c  */.int sqliteCol
59c0: 6c 61 74 65 54 79 70 65 28 63 6f 6e 73 74 20 63  lateType(const c
59d0: 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20  har *zType, int 
59e0: 6e 54 79 70 65 29 7b 0a 20 20 69 6e 74 20 69 3b  nType){.  int i;
59f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54  .  for(i=0; i<nT
5a00: 79 70 65 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  ype-1; i++){.   
5a10: 20 73 77 69 74 63 68 28 20 7a 54 79 70 65 5b 69   switch( zType[i
5a20: 5d 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  ] ){.      case 
5a30: 27 62 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20  'b':.      case 
5a40: 27 42 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  'B': {.        i
5a50: 66 28 20 69 3c 6e 54 79 70 65 2d 33 20 26 26 20  f( i<nType-3 && 
5a60: 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 26  sqliteStrNICmp(&
5a70: 7a 54 79 70 65 5b 69 5d 2c 22 62 6c 6f 62 22 2c  zType[i],"blob",
5a80: 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  4)==0 ){.       
5a90: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5aa0: 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 20 20  _SO_TEXT;.      
5ab0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
5ac0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5ad0: 20 63 61 73 65 20 27 63 27 3a 0a 20 20 20 20 20   case 'c':.     
5ae0: 20 63 61 73 65 20 27 43 27 3a 20 7b 0a 20 20 20   case 'C': {.   
5af0: 20 20 20 20 20 69 66 28 20 69 3c 6e 54 79 70 65       if( i<nType
5b00: 2d 33 20 26 26 20 28 73 71 6c 69 74 65 53 74 72  -3 && (sqliteStr
5b10: 4e 49 43 6d 70 28 26 7a 54 79 70 65 5b 69 5d 2c  NICmp(&zType[i],
5b20: 22 63 68 61 72 22 2c 34 29 3d 3d 30 20 7c 7c 0a  "char",4)==0 ||.
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b40: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
5b50: 65 53 74 72 4e 49 43 6d 70 28 26 7a 54 79 70 65  eStrNICmp(&zType
5b60: 5b 69 5d 2c 22 63 6c 6f 62 22 2c 34 29 3d 3d 30  [i],"clob",4)==0
5b70: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
5b80: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
5b90: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20  LITE_SO_TEXT;.  
5ba0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5bb0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5bc0: 20 20 20 20 20 63 61 73 65 20 27 78 27 3a 0a 20       case 'x':. 
5bd0: 20 20 20 20 20 63 61 73 65 20 27 58 27 3a 20 7b       case 'X': {
5be0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d  .        if( i>=
5bf0: 32 20 26 26 20 73 71 6c 69 74 65 53 74 72 4e 49  2 && sqliteStrNI
5c00: 43 6d 70 28 26 7a 54 79 70 65 5b 69 2d 32 5d 2c  Cmp(&zType[i-2],
5c10: 22 74 65 78 74 22 2c 34 29 3d 3d 30 20 29 7b 0a  "text",4)==0 ){.
5c20: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5c30: 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b   SQLITE_SO_TEXT;
5c40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5c50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5c60: 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  }.      default:
5c70: 20 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   {.        break
5c80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5c90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
5ca0: 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 7d 0a 0a 2f  ITE_SO_NUM;.}../
5cb0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5cc0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
5cd0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
5ce0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
5cf0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
5d00: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
5d10: 6d 65 6e 74 2e 20 20 41 20 22 43 4f 4c 4c 41 54  ment.  A "COLLAT
5d20: 45 22 20 63 6c 61 75 73 65 20 68 61 73 0a 2a 2a  E" clause has.**
5d30: 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20   been seen on a 
5d40: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f  column.  This ro
5d50: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 43  utine sets the C
5d60: 6f 6c 75 6d 6e 2e 73 6f 72 74 4f 72 64 65 72 20  olumn.sortOrder 
5d70: 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  on.** the column
5d80: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
5d90: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
5da0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64  /.void sqliteAdd
5db0: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
5dc0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 63  e *pParse, int c
5dd0: 6f 6c 6c 54 79 70 65 29 7b 0a 20 20 54 61 62 6c  ollType){.  Tabl
5de0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
5df0: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
5e00: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
5e10: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
5e20: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
5e30: 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b   i>=0 ) p->aCol[
5e40: 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 63  i].sortOrder = c
5e50: 6f 6c 6c 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ollType;.}../*.*
5e60: 2a 20 43 6f 6d 65 20 75 70 20 77 69 74 68 20 61  * Come up with a
5e70: 20 6e 65 77 20 72 61 6e 64 6f 6d 20 76 61 6c 75   new random valu
5e80: 65 20 66 6f 72 20 74 68 65 20 73 63 68 65 6d 61  e for the schema
5e90: 20 63 6f 6f 6b 69 65 2e 20 20 4d 61 6b 65 20 73   cookie.  Make s
5ea0: 75 72 65 0a 2a 2a 20 74 68 65 20 6e 65 77 20 76  ure.** the new v
5eb0: 61 6c 75 65 20 69 73 20 64 69 66 66 65 72 65 6e  alue is differen
5ec0: 74 20 66 72 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a  t from the old..
5ed0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  **.** The schema
5ee0: 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20   cookie is used 
5ef0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
5f00: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  n the schema for
5f10: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
5f20: 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72   changes.  After
5f30: 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61   each schema cha
5f40: 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20  nge, the cookie 
5f50: 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73  value.** changes
5f60: 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73  .  When a proces
5f70: 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68  s first reads th
5f80: 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f  e schema it reco
5f90: 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69  rds the.** cooki
5fa0: 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20  e.  Thereafter, 
5fb0: 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73  whenever it goes
5fc0: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
5fd0: 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63  atabase,.** it c
5fe0: 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65  hecks the cookie
5ff0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
6000: 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74  e schema has not
6010: 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63   changed.** sinc
6020: 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65  e it was last re
6030: 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70  ad..**.** This p
6040: 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c  lan is not compl
6050: 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f  etely bullet-pro
6060: 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69  of.  It is possi
6070: 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ble for.** the s
6080: 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20  chema to change 
6090: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61  multiple times a
60a0: 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69  nd for the cooki
60b0: 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62  e to be.** set b
60c0: 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c  ack to prior val
60d0: 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20  ue.  But schema 
60e0: 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72  changes are infr
60f0: 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68  equent.** and th
6100: 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
6110: 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d   hitting the sam
6120: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69  e cookie value i
6130: 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e  s only.** 1 chan
6140: 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20  ce in 2^32.  So 
6150: 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67  we're safe enoug
6160: 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  h..*/.void sqlit
6170: 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71  eChangeCookie(sq
6180: 6c 69 74 65 20 2a 64 62 2c 20 56 64 62 65 20 2a  lite *db, Vdbe *
6190: 76 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 65  v){.  if( db->ne
61a0: 78 74 5f 63 6f 6f 6b 69 65 3d 3d 64 62 2d 3e 61  xt_cookie==db->a
61b0: 44 62 5b 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f  Db[0].schema_coo
61c0: 6b 69 65 20 29 7b 0a 20 20 20 20 75 6e 73 69 67  kie ){.    unsig
61d0: 6e 65 64 20 63 68 61 72 20 72 3b 0a 20 20 20 20  ned char r;.    
61e0: 73 71 6c 69 74 65 52 61 6e 64 6f 6d 6e 65 73 73  sqliteRandomness
61f0: 28 31 2c 20 26 72 29 3b 0a 20 20 20 20 64 62 2d  (1, &r);.    db-
6200: 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 20 3d 20 64  >next_cookie = d
6210: 62 2d 3e 61 44 62 5b 30 5d 2e 73 63 68 65 6d 61  b->aDb[0].schema
6220: 5f 63 6f 6f 6b 69 65 20 2b 20 72 20 2b 20 31 3b  _cookie + r + 1;
6230: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
6240: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
6250: 68 61 6e 67 65 73 3b 0a 20 20 20 20 73 71 6c 69  hanges;.    sqli
6260: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6270: 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 6e  P_Integer, db->n
6280: 65 78 74 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a  ext_cookie, 0);.
6290: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
62a0: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  dOp(v, OP_SetCoo
62b0: 6b 69 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  kie, 0, 0);.  }.
62c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65  }../*.** Measure
62d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
62e0: 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65 64  haracters needed
62f0: 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67   to output the g
6300: 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69  iven.** identifi
6310: 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  er.  The number 
6320: 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65  returned include
6330: 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65  s any quotes use
6340: 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f  d.** but does no
6350: 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75  t include the nu
6360: 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a  ll terminator..*
6370: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65  /.static int ide
6380: 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63  ntLength(const c
6390: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e  har *z){.  int n
63a0: 3b 0a 20 20 69 6e 74 20 6e 65 65 64 51 75 6f 74  ;.  int needQuot
63b0: 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6e 3d 30  e = 0;.  for(n=0
63c0: 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b  ; *z; n++, z++){
63d0: 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 27  .    if( *z=='\'
63e0: 27 20 29 7b 20 6e 2b 2b 3b 20 6e 65 65 64 51 75  ' ){ n++; needQu
63f0: 6f 74 65 3d 31 3b 20 7d 0a 20 20 7d 0a 20 20 72  ote=1; }.  }.  r
6400: 65 74 75 72 6e 20 6e 20 2b 20 6e 65 65 64 51 75  eturn n + needQu
6410: 6f 74 65 2a 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ote*2;.}../*.** 
6420: 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69 66  Write an identif
6430: 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ier onto the end
6440: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73 74   of the given st
6450: 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75  ring.  Add.** qu
6460: 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20 61  ote characters a
6470: 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  s needed..*/.sta
6480: 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75  tic void identPu
6490: 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a  t(char *z, int *
64a0: 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 49 64 65  pIdx, char *zIde
64b0: 6e 74 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  nt){.  int i, j,
64c0: 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20   needQuote;.  i 
64d0: 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a  = *pIdx;.  for(j
64e0: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
64f0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73  ++){.    if( !is
6500: 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29  alnum(zIdent[j])
6510: 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27   && zIdent[j]!='
6520: 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  _' ) break;.  }.
6530: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a    needQuote =  z
6540: 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69  Ident[j]!=0 || i
6550: 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d  sdigit(zIdent[0]
6560: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
6570: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 4b 65 79      || sqliteKey
6580: 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c  wordCode(zIdent,
6590: 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66   j)!=TK_ID;.  if
65a0: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
65b0: 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 66  i++] = '\'';.  f
65c0: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
65d0: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69  ]; j++){.    z[i
65e0: 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b  ++] = zIdent[j];
65f0: 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b  .    if( zIdent[
6600: 6a 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b 69 2b 2b  j]=='\'' ) z[i++
6610: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a 20 20  ] = '\'';.  }.  
6620: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
6630: 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20  z[i++] = '\'';. 
6640: 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49   z[i] = 0;.  *pI
6650: 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx = i;.}../*.**
6660: 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41   Generate a CREA
6670: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
6680: 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  nt appropriate f
6690: 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
66a0: 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74  table.  Memory t
66b0: 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20  o hold the text 
66c0: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
66d0: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
66e0: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
66f0: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
6700: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
6710: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
6720: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
6730: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 54  reateTableStmt(T
6740: 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  able *p){.  int 
6750: 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20  i, k, n;.  char 
6760: 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a  *zStmt;.  char *
6770: 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a  zSep, *zSep2, *z
6780: 45 6e 64 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  End;.  n = 0;.  
6790: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
67a0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20  ol; i++){.    n 
67b0: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
67c0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
67d0: 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65  ;.  }.  n += ide
67e0: 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d  ntLength(p->zNam
67f0: 65 29 3b 0a 20 20 69 66 28 20 6e 3c 34 30 20 29  e);.  if( n<40 )
6800: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b  {.    zSep = "";
6810: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22  .    zSep2 = ","
6820: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22  ;.    zEnd = ")"
6830: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
6840: 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20  Sep = "\n  ";.  
6850: 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20    zSep2 = ",\n  
6860: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c  ";.    zEnd = "\
6870: 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  n)";.  }.  n += 
6880: 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a  35 + 6*p->nCol;.
6890: 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
68a0: 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b 0a  MallocRaw( n );.
68b0: 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29    if( zStmt==0 )
68c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 74 72   return 0;.  str
68d0: 63 70 79 28 7a 53 74 6d 74 2c 20 70 2d 3e 69 44  cpy(zStmt, p->iD
68e0: 62 3d 3d 31 20 3f 20 22 43 52 45 41 54 45 20 54  b==1 ? "CREATE T
68f0: 45 4d 50 20 54 41 42 4c 45 20 22 20 3a 20 22 43  EMP TABLE " : "C
6900: 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a  REATE TABLE ");.
6910: 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74    k = strlen(zSt
6920: 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28  mt);.  identPut(
6930: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e  zStmt, &k, p->zN
6940: 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b  ame);.  zStmt[k+
6950: 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28  +] = '(';.  for(
6960: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
6970: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63 70 79  i++){.    strcpy
6980: 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70  (&zStmt[k], zSep
6990: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c  );.    k += strl
69a0: 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20  en(&zStmt[k]);. 
69b0: 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b     zSep = zSep2;
69c0: 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53  .    identPut(zS
69d0: 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 61 43 6f 6c  tmt, &k, p->aCol
69e0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
69f0: 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b    strcpy(&zStmt[
6a00: 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74  k], zEnd);.  ret
6a10: 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a  urn zStmt;.}../*
6a20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6a30: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
6a40: 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22  port the final "
6a50: 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  )" that terminat
6a60: 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54  es.** a CREATE T
6a70: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
6a80: 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
6a90: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f  structure that o
6aa0: 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74  ther action rout
6ab0: 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62  ines have been b
6ac0: 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64  uilding.** is ad
6ad0: 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ded to the inter
6ae0: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c  nal hash tables,
6af0: 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   assuming no err
6b00: 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75  ors have.** occu
6b10: 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  rred..**.** An e
6b20: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62  ntry for the tab
6b30: 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68  le is made in th
6b40: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f  e master table o
6b50: 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a  n disk, unless.*
6b60: 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  * this is a temp
6b70: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64  orary table or d
6b80: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e  b->init.busy==1.
6b90: 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e    When db->init.
6ba0: 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65  busy==1.** it me
6bb0: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
6bc0: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
6bd0: 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75  ster table becau
6be0: 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f  se we just.** co
6bf0: 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64  nnected to the d
6c00: 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75  atabase or becau
6c10: 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  se the sqlite_ma
6c20: 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a  ster table has.*
6c30: 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67  * recently chang
6c40: 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79  es, so the entry
6c50: 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
6c60: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
6c70: 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f  n.** the sqlite_
6c80: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57  master table.  W
6c90: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
6ca0: 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e   create it again
6cb0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
6cc0: 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20  Select argument 
6cd0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
6ce0: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
6cf0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63  routine.** was c
6d00: 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
6d10: 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  a table generate
6d20: 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52  d from a .** "CR
6d30: 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41  EATE TABLE ... A
6d40: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74  S SELECT ..." st
6d50: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f  atement.  The co
6d60: 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a  lumn names of.**
6d70: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77   the new table w
6d80: 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65  ill match the re
6d90: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
6da0: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
6db0: 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 50  sqliteEndTable(P
6dc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
6dd0: 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65 6c 65 63  ken *pEnd, Selec
6de0: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
6df0: 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74  able *p;.  sqlit
6e00: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
6e10: 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64  db;..  if( (pEnd
6e20: 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d  ==0 && pSelect==
6e30: 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  0) || pParse->nE
6e40: 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c  rr || sqlite_mal
6e50: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
6e60: 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  urn;.  p = pPars
6e70: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
6e80: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
6e90: 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  n;..  /* If the 
6ea0: 74 61 62 6c 65 20 69 73 20 67 65 6e 65 72 61 74  table is generat
6eb0: 65 64 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54  ed from a SELECT
6ec0: 2c 20 74 68 65 6e 20 63 6f 6e 73 74 72 75 63 74  , then construct
6ed0: 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 20 6f   the.  ** list o
6ee0: 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68  f columns and th
6ef0: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 74 61  e text of the ta
6f00: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
6f10: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 54  pSelect ){.    T
6f20: 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 20 3d 20  able *pSelTab = 
6f30: 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f  sqliteResultSetO
6f40: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
6f50: 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  0, pSelect);.   
6f60: 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20   if( pSelTab==0 
6f70: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 61 73  ) return;.    as
6f80: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30  sert( p->aCol==0
6f90: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 20   );.    p->nCol 
6fa0: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
6fb0: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70  .    p->aCol = p
6fc0: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
6fd0: 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
6fe0: 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  = 0;.    pSelTab
6ff0: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
7000: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
7010: 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20  e(0, pSelTab);. 
7020: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
7030: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
7040: 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61   1 it means we a
7050: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53  re reading the S
7060: 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20  QL off the.  ** 
7070: 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20  "sqlite_master" 
7080: 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f  or "sqlite_temp_
7090: 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e  master" table on
70a0: 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20   the disk..  ** 
70b0: 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  So do not write 
70c0: 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61 69  to the disk agai
70d0: 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20  n.  Extract the 
70e0: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
70f0: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61  .  ** for the ta
7100: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d  ble from the db-
7110: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69  >init.newTnum fi
7120: 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20  eld.  (The page 
7130: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75  number.  ** shou
7140: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74  ld have been put
7150: 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71   there by the sq
7160: 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69  liteOpenCb routi
7170: 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ne.).  */.  if( 
7180: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
7190: 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64  .    p->tnum = d
71a0: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
71b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  .  }..  /* If no
71c0: 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20  t initializing, 
71d0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72 65  then create a re
71e0: 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77  cord for the new
71f0: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74   table.  ** in t
7200: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
7210: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61   table of the da
7220: 74 61 62 61 73 65 2e 20 20 54 68 65 20 72 65 63  tabase.  The rec
7230: 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  ord number.  ** 
7240: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
7250: 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64 20 61  e entry should a
7260: 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74 68 65  lready be on the
7270: 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a   stack..  **.  *
7280: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 54  * If this is a T
7290: 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20  EMPORARY table, 
72a0: 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79 20  write the entry 
72b0: 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61  into the auxilia
72c0: 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73  ry.  ** file ins
72d0: 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65  tead of into the
72e0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
72f0: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
7300: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
7310: 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
7320: 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20 76   Vdbe *v;..    v
7330: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
7340: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
7350: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
7360: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c  .    if( p->pSel
7370: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect==0 ){.      
7380: 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62  /* A regular tab
7390: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  le */.      sqli
73a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
73b0: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 30  P_CreateTable, 0
73c0: 2c 20 70 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20  , p->iDb);.     
73d0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
73e0: 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP3(v, -1, (char
73f0: 20 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20 50 33 5f   *)&p->tnum, P3_
7400: 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d 65  POINTER);.    }e
7410: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
7420: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 71  view */.      sq
7430: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7440: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
7450: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  0);.    }.    p-
7460: 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 73  >tnum = 0;.    s
7470: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
7480: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
7490: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
74a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
74b0: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  ng, 0, 0);.    i
74c0: 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  f( p->pSelect==0
74d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
74e0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
74f0: 2d 31 2c 20 22 74 61 62 6c 65 22 2c 20 50 33 5f  -1, "table", P3_
7500: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 65 6c  STATIC);.    }el
7510: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
7520: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
7530: 2d 31 2c 20 22 76 69 65 77 22 2c 20 50 33 5f 53  -1, "view", P3_S
7540: 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  TATIC);.    }.  
7550: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7560: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
7570: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
7580: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
7590: 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30   -1, p->zName, 0
75a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
75b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
75c0: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
75d0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
75e0: 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61  P3(v, -1, p->zNa
75f0: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  me, 0);.    sqli
7600: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7610: 50 5f 44 75 70 2c 20 34 2c 20 30 29 3b 0a 20 20  P_Dup, 4, 0);.  
7620: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7630: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
7640: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
7650: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
7660: 63 68 61 72 20 2a 7a 20 3d 20 63 72 65 61 74 65  char *z = create
7670: 54 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20 20  TableStmt(p);.  
7680: 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73 74 72 6c      n = z ? strl
7690: 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 20 20 20  en(z) : 0;.     
76a0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
76b0: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e 29  eP3(v, -1, z, n)
76c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
76d0: 65 65 28 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ee(z);.    }else
76e0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
76f0: 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 20  pEnd!=0 );.     
7700: 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e   n = Addr(pEnd->
7710: 7a 29 20 2d 20 41 64 64 72 28 70 50 61 72 73 65  z) - Addr(pParse
7720: 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 29  ->sFirstToken.z)
7730: 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   + 1;.      sqli
7740: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
7750: 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 73 46  , -1, pParse->sF
7760: 69 72 73 74 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b  irstToken.z, n);
7770: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
7780: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
7790: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20  _MakeRecord, 5, 
77a0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
77b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
77c0: 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a  tIntKey, 0, 0);.
77d0: 20 20 20 20 69 66 28 20 21 70 2d 3e 69 44 62 20      if( !p->iDb 
77e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43  ){.      sqliteC
77f0: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20  hangeCookie(db, 
7800: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  v);.    }.    sq
7810: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7820: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
7830: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  ;.    if( pSelec
7840: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
7850: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
7860: 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e 69 44 62  _Integer, p->iDb
7870: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
7880: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7890: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20  P_OpenWrite, 1, 
78a0: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
78b0: 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20  ->nTab = 2;.    
78c0: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70    sqliteSelect(p
78d0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
78e0: 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30 2c  SRT_Table, 1, 0,
78f0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
7900: 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65    sqliteEndWrite
7910: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
7920: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  );.  }..  /* Add
7930: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68   the table to th
7940: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
7950: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
7960: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  e database..  */
7970: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
7980: 78 70 6c 61 69 6e 3d 3d 30 20 26 26 20 70 50 61  xplain==0 && pPa
7990: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
79a0: 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b      Table *pOld;
79b0: 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  .    FKey *pFKey
79c0: 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
79d0: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
79e0: 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 74  b->aDb[p->iDb].t
79f0: 62 6c 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20  blHash, .       
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a10: 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73       p->zName, s
7a20: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
7a30: 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  1, p);.    if( p
7a40: 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
7a50: 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
7a60: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
7a70: 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
7a80: 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
7a90: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  */.      return;
7aa0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
7ab0: 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70  FKey=p->pFKey; p
7ac0: 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65  FKey; pFKey=pFKe
7ad0: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20  y->pNextFrom){. 
7ae0: 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73       int nTo = s
7af0: 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f  trlen(pFKey->zTo
7b00: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 4b  ) + 1;.      pFK
7b10: 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71  ey->pNextTo = sq
7b20: 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 64 62  liteHashFind(&db
7b30: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61 46  ->aDb[p->iDb].aF
7b40: 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c  Key, pFKey->zTo,
7b50: 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c   nTo);.      sql
7b60: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
7b70: 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61  b->aDb[p->iDb].a
7b80: 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f  FKey, pFKey->zTo
7b90: 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20  , nTo, pFKey);. 
7ba0: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
7bb0: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a  >pNewTable = 0;.
7bc0: 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b      db->nTable++
7bd0: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
7be0: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
7bf0: 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a  Changes;.  }.}..
7c00: 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  /*.** The parser
7c10: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
7c20: 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ine in order to 
7c30: 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45  create a new VIE
7c40: 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  W.*/.void sqlite
7c50: 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61  CreateView(.  Pa
7c60: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7c70: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
7c80: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
7c90: 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20  en *pBegin,     
7ca0: 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
7cb0: 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
7cc0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
7cd0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
7ce0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b        /* The tok
7cf0: 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  en that holds th
7d00: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  e name of the vi
7d10: 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ew */.  Select *
7d20: 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20  pSelect,   /* A 
7d30: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
7d40: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
7d50: 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a  e the new view *
7d60: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 20  /.  int isTemp  
7d70: 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66         /* TRUE f
7d80: 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76  or a TEMPORARY v
7d90: 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  iew */.){.  Tabl
7da0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  e *p;.  int n;. 
7db0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
7dc0: 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20    Token sEnd;.  
7dd0: 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 0a 20  DbFixer sFix;.. 
7de0: 20 73 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c   sqliteStartTabl
7df0: 65 28 70 50 61 72 73 65 2c 20 70 42 65 67 69 6e  e(pParse, pBegin
7e00: 2c 20 70 4e 61 6d 65 2c 20 69 73 54 65 6d 70 2c  , pName, isTemp,
7e10: 20 31 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73   1);.  p = pPars
7e20: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
7e30: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72  if( p==0 || pPar
7e40: 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
7e50: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65  sqliteSelectDele
7e60: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  te(pSelect);.   
7e70: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
7e80: 66 28 20 73 71 6c 69 74 65 46 69 78 49 6e 69 74  f( sqliteFixInit
7e90: 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
7ea0: 70 2d 3e 69 44 62 2c 20 22 76 69 65 77 22 2c 20  p->iDb, "view", 
7eb0: 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20 73 71  pName).    && sq
7ec0: 6c 69 74 65 46 69 78 53 65 6c 65 63 74 28 26 73  liteFixSelect(&s
7ed0: 46 69 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20  Fix, pSelect).  
7ee0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c  ){.    sqliteSel
7ef0: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
7f00: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
7f10: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61    }..  /* Make a
7f20: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74   copy of the ent
7f30: 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ire SELECT state
7f40: 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
7f50: 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a  s the view..  **
7f60: 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65   This will force
7f70: 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f   all the Expr.to
7f80: 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20  ken.z values to 
7f90: 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  be dynamically. 
7fa0: 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61   ** allocated ra
7fb0: 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20  ther than point 
7fc0: 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  to the input str
7fd0: 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e  ing - which mean
7fe0: 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79  s that.  ** they
7ff0: 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66   will persist af
8000: 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ter the current 
8010: 73 71 6c 69 74 65 5f 65 78 65 63 28 29 20 63 61  sqlite_exec() ca
8020: 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f  ll returns..  */
8030: 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20  .  p->pSelect = 
8040: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 75 70 28  sqliteSelectDup(
8050: 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
8060: 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  teSelectDelete(p
8070: 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 21  Select);.  if( !
8080: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74  pParse->db->init
8090: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c  .busy ){.    sql
80a0: 69 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  iteViewGetColumn
80b0: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29  Names(pParse, p)
80c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
80d0: 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
80e0: 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  e CREATE VIEW st
80f0: 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73  atement.  Make s
8100: 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a  End point to.  *
8110: 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a  * the end..  */.
8120: 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d    sEnd = pParse-
8130: 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69  >sLastToken;.  i
8140: 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20  f( sEnd.z[0]!=0 
8150: 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b  && sEnd.z[0]!=';
8160: 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20  ' ){.    sEnd.z 
8170: 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20  += sEnd.n;.  }. 
8180: 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e   sEnd.n = 0;.  n
8190: 20 3d 20 28 28 69 6e 74 29 73 45 6e 64 2e 7a 29   = ((int)sEnd.z)
81a0: 20 2d 20 28 69 6e 74 29 70 42 65 67 69 6e 2d 3e   - (int)pBegin->
81b0: 7a 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d  z;.  z = pBegin-
81c0: 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30  >z;.  while( n>0
81d0: 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27   && (z[n-1]==';'
81e0: 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d   || isspace(z[n-
81f0: 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  1])) ){ n--; }. 
8200: 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31   sEnd.z = &z[n-1
8210: 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b  ];.  sEnd.n = 1;
8220: 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74  ..  /* Use sqlit
8230: 65 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61  eEndTable() to a
8240: 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74  dd the view to t
8250: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
8260: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
8270: 74 65 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73  teEndTable(pPars
8280: 65 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20  e, &sEnd, 0);.  
8290: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
82a0: 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   The Table struc
82b0: 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72  ture pTable is r
82c0: 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46  eally a VIEW.  F
82d0: 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73  ill in the names
82e0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   of.** the colum
82f0: 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69  ns of the view i
8300: 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72  n the pTable str
8310: 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20  ucture.  Return 
8320: 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
8330: 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20   errors.  If an 
8340: 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65  error is seen le
8350: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
8360: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
8370: 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
8380: 73 71 6c 69 74 65 56 69 65 77 47 65 74 43 6f 6c  sqliteViewGetCol
8390: 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a  umnNames(Parse *
83a0: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
83b0: 54 61 62 6c 65 29 7b 0a 20 20 45 78 70 72 4c 69  Table){.  ExprLi
83c0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 53 65  st *pEList;.  Se
83d0: 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 54 61  lect *pSel;.  Ta
83e0: 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20  ble *pSelTab;.  
83f0: 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20  int nErr = 0;.. 
8400: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
8410: 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74  );..  /* A posit
8420: 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74  ive nCol means t
8430: 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73  he columns names
8440: 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61   for this view a
8450: 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  re.  ** already 
8460: 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  known..  */.  if
8470: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30  ( pTable->nCol>0
8480: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
8490: 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43  /* A negative nC
84a0: 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  ol is a special 
84b0: 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74  marker meaning t
84c0: 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65  hat we are curre
84d0: 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67  ntly.  ** trying
84e0: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
84f0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49  column names.  I
8500: 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20  f we enter this 
8510: 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a  routine with.  *
8520: 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * a negative nCo
8530: 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20  l, it means two 
8540: 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f  or more views fo
8550: 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20  rm a loop, like 
8560: 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
8570: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
8580: 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20  one AS SELECT * 
8590: 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20  FROM two;.  **  
85a0: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74     CREATE VIEW t
85b0: 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  wo AS SELECT * F
85c0: 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20  ROM one;.  **.  
85d0: 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69  ** Actually, thi
85e0: 73 20 65 72 72 6f 72 20 69 73 20 63 61 75 67 68  s error is caugh
85f0: 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64  t previously and
8600: 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
8610: 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75  g test.  ** shou
8620: 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20  ld always fail. 
8630: 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61   But we will lea
8640: 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a  ve it in place j
8650: 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a  ust to be safe..
8660: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
8670: 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  e->nCol<0 ){.   
8680: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
8690: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
86a0: 67 2c 20 22 76 69 65 77 20 22 2c 20 70 54 61 62  g, "view ", pTab
86b0: 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  le->zName,.     
86c0: 20 20 20 20 22 20 69 73 20 63 69 72 63 75 6c 61      " is circula
86d0: 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 28 63  rly defined", (c
86e0: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 70 50 61  har*)0);.    pPa
86f0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
8700: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
8710: 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
8720: 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
8730: 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d  s we need to com
8740: 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e  pute the table n
8750: 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ames..  */.  ass
8760: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65  ert( pTable->pSe
8770: 6c 65 63 74 20 29 3b 20 2f 2a 20 49 66 20 6e 43  lect ); /* If nC
8780: 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 70 54 61 62  ol==0, then pTab
8790: 6c 65 20 6d 75 73 74 20 62 65 20 61 20 56 49 45  le must be a VIE
87a0: 57 20 2a 2f 0a 20 20 70 53 65 6c 20 3d 20 70 54  W */.  pSel = pT
87b0: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a  able->pSelect;..
87c0: 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    /* Note that t
87d0: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
87e0: 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  eResultSetOfSele
87f0: 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64  ct() will expand
8800: 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c   any.  ** "*" el
8810: 65 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20 6c  ements in this l
8820: 69 73 74 2e 20 20 42 75 74 20 77 65 20 77 69 6c  ist.  But we wil
8830: 6c 20 6e 65 65 64 20 74 6f 20 72 65 73 74 6f 72  l need to restor
8840: 65 20 74 68 65 20 6c 69 73 74 0a 20 20 2a 2a 20  e the list.  ** 
8850: 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
8860: 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69  inal configurati
8870: 6f 6e 20 61 66 74 65 72 77 61 72 64 73 2c 20 73  on afterwards, s
8880: 6f 20 77 65 20 73 61 76 65 20 61 20 63 6f 70 79  o we save a copy
8890: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 6f 72 69   of.  ** the ori
88a0: 67 69 6e 61 6c 20 69 6e 20 70 45 4c 69 73 74 2e  ginal in pEList.
88b0: 0a 20 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  .  */.  pEList =
88c0: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20   pSel->pEList;. 
88d0: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20   pSel->pEList = 
88e0: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75  sqliteExprListDu
88f0: 70 28 70 45 4c 69 73 74 29 3b 0a 20 20 69 66 28  p(pEList);.  if(
8900: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3d 3d 30   pSel->pEList==0
8910: 20 29 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70 45   ){.    pSel->pE
8920: 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20  List = pEList;. 
8930: 20 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a     return 1;  /*
8940: 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a   Malloc failed *
8950: 2f 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e  /.  }.  pTable->
8960: 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 70 53 65  nCol = -1;.  pSe
8970: 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 52 65 73  lTab = sqliteRes
8980: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
8990: 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b  Parse, 0, pSel);
89a0: 0a 20 20 69 66 28 20 70 53 65 6c 54 61 62 20 29  .  if( pSelTab )
89b0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  {.    assert( pT
89c0: 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  able->aCol==0 );
89d0: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  .    pTable->nCo
89e0: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
89f0: 6c 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 61  l;.    pTable->a
8a00: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
8a10: 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  Col;.    pSelTab
8a20: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
8a30: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
8a40: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c  0;.    sqliteDel
8a50: 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c  eteTable(0, pSel
8a60: 54 61 62 29 3b 0a 20 20 20 20 44 62 53 65 74 50  Tab);.    DbSetP
8a70: 72 6f 70 65 72 74 79 28 70 50 61 72 73 65 2d 3e  roperty(pParse->
8a80: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62 2c  db, pTable->iDb,
8a90: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
8aa0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8ab0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
8ac0: 3b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20  ;.    nErr++;.  
8ad0: 7d 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74  }.  sqliteSelect
8ae0: 55 6e 62 69 6e 64 28 70 53 65 6c 29 3b 0a 20 20  Unbind(pSel);.  
8af0: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65  sqliteExprListDe
8b00: 6c 65 74 65 28 70 53 65 6c 2d 3e 70 45 4c 69 73  lete(pSel->pELis
8b10: 74 29 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69  t);.  pSel->pELi
8b20: 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 72  st = pEList;.  r
8b30: 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a  eturn nErr;  .}.
8b40: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
8b50: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72   column names fr
8b60: 6f 6d 20 74 68 65 20 56 49 45 57 20 70 54 61 62  om the VIEW pTab
8b70: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  le..**.** This r
8b80: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8b90: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 6f 74   whenever any ot
8ba0: 68 65 72 20 74 61 62 6c 65 20 6f 72 20 76 69 65  her table or vie
8bb0: 77 20 69 73 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  w is modified..*
8bc0: 2a 20 54 68 65 20 76 69 65 77 20 70 61 73 73 65  * The view passe
8bd0: 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74  d into this rout
8be0: 69 6e 65 20 6d 69 67 68 74 20 64 65 70 65 6e 64  ine might depend
8bf0: 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64   directly or ind
8c00: 69 72 65 63 74 6c 79 0a 2a 2a 20 6f 6e 20 74 68  irectly.** on th
8c10: 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 64 65  e modified or de
8c20: 6c 65 74 65 64 20 74 61 62 6c 65 20 73 6f 20 77  leted table so w
8c30: 65 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 72 20  e need to clear 
8c40: 74 68 65 20 6f 6c 64 20 63 6f 6c 75 6d 6e 0a 2a  the old column.*
8c50: 2a 20 6e 61 6d 65 73 20 73 6f 20 74 68 61 74 20  * names so that 
8c60: 74 68 65 79 20 77 69 6c 6c 20 62 65 20 72 65 63  they will be rec
8c70: 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  omputed..*/.stat
8c80: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69  ic void sqliteVi
8c90: 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ewResetColumnNam
8ca0: 65 73 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  es(Table *pTable
8cb0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
8cc0: 28 20 70 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70  ( pTable==0 || p
8cd0: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3d 3d  Table->pSelect==
8ce0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
8cf0: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d  ( pTable->nCol==
8d00: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
8d10: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d  r(i=0; i<pTable-
8d20: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
8d30: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
8d40: 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  le->aCol[i].zNam
8d50: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
8d60: 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  ee(pTable->aCol[
8d70: 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73  i].zDflt);.    s
8d80: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
8d90: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29  ->aCol[i].zType)
8da0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
8db0: 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29  ee(pTable->aCol)
8dc0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ;.  pTable->aCol
8dd0: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
8de0: 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nCol = 0;.}../*.
8df0: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c  ** Clear the col
8e00: 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65  umn names from e
8e10: 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61 74  very VIEW in dat
8e20: 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74  abase idx..*/.st
8e30: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
8e40: 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c  ViewResetAll(sql
8e50: 69 74 65 20 2a 64 62 2c 20 69 6e 74 20 69 64 78  ite *db, int idx
8e60: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69  ){.  HashElem *i
8e70: 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50 72  ;.  if( !DbHasPr
8e80: 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20  operty(db, idx, 
8e90: 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
8ea0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
8eb0: 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
8ec0: 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d  st(&db->aDb[idx]
8ed0: 2e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d  .tblHash); i; i=
8ee0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
8ef0: 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
8f00: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
8f10: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28  Data(i);.    if(
8f20: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
8f30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 69  {.      sqliteVi
8f40: 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ewResetColumnNam
8f50: 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  es(pTab);.    }.
8f60: 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f    }.  DbClearPro
8f70: 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
8f80: 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b  B_UnresetViews);
8f90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
8fa0: 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75 70  a token, look up
8fb0: 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68   a table with th
8fc0: 61 74 20 6e 61 6d 65 2e 20 20 49 66 20 6e 6f 74  at name.  If not
8fd0: 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65 0a 2a 2a   found, leave.**
8fe0: 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 74 68   an error for th
8ff0: 65 20 70 61 72 73 65 72 20 74 6f 20 66 69 6e 64  e parser to find
9000: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
9010: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
9020: 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e  teTableFromToken
9030: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
9040: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20  Token *pTok){.  
9050: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 54  char *zName;.  T
9060: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 7a 4e  able *pTab;.  zN
9070: 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  ame = sqliteTabl
9080: 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  eNameFromToken(p
9090: 54 6f 6b 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  Tok);.  if( zNam
90a0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
90b0: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
90c0: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
90d0: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b  ->db, zName, 0);
90e0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e  .  sqliteFree(zN
90f0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ame);.  if( pTab
9100: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
9110: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
9120: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e  rse->zErrMsg, "n
9130: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c  o such table: ",
9140: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 70 54 6f   0, .        pTo
9150: 6b 2d 3e 7a 2c 20 70 54 6f 6b 2d 3e 6e 2c 20 30  k->z, pTok->n, 0
9160: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
9170: 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  Err++;.  }.  ret
9180: 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
9190: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
91a0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20  is called to do 
91b0: 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52  the work of a DR
91c0: 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  OP TABLE stateme
91d0: 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20  nt..** pName is 
91e0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
91f0: 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70  table to be drop
9200: 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ped..*/.void sql
9210: 69 74 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72  iteDropTable(Par
9220: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
9230: 6e 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73  n *pName, int is
9240: 56 69 65 77 29 7b 0a 20 20 54 61 62 6c 65 20 2a  View){.  Table *
9250: 70 54 61 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a  pTable;.  Vdbe *
9260: 76 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20  v;.  int base;. 
9270: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
9280: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
9290: 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  iDb;..  if( pPar
92a0: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
92b0: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
92c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 61   ) return;.  pTa
92d0: 62 6c 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  ble = sqliteTabl
92e0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
92f0: 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  e, pName);.  if(
9300: 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74   pTable==0 ) ret
9310: 75 72 6e 3b 0a 20 20 69 44 62 20 3d 20 70 54 61  urn;.  iDb = pTa
9320: 62 6c 65 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65  ble->iDb;.  asse
9330: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
9340: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 23 69 66  b<db->nDb );.#if
9350: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9360: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
9370: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b   {.    int code;
9380: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
9390: 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
93a0: 41 42 4c 45 28 70 54 61 62 6c 65 2d 3e 69 44 62  ABLE(pTable->iDb
93b0: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
93c0: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
93d0: 5b 70 54 61 62 6c 65 2d 3e 69 44 62 5d 2e 7a 4e  [pTable->iDb].zN
93e0: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ame;.    if( sql
93f0: 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61  iteAuthCheck(pPa
9400: 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
9410: 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
9420: 29 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  )){.      return
9430: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9440: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
9450: 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20  if( iDb==1 ){.  
9460: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
9470: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49  ITE_DROP_TEMP_VI
9480: 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EW;.      }else{
9490: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
94a0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57  SQLITE_DROP_VIEW
94b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
94c0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69  lse{.      if( i
94d0: 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
94e0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
94f0: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ROP_TEMP_TABLE;.
9500: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9510: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
9520: 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20  TE_DROP_TABLE;. 
9530: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9540: 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43   if( sqliteAuthC
9550: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
9560: 65 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  e, pTable->zName
9570: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
9580: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
9590: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 41  .    if( sqliteA
95a0: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
95b0: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
95c0: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30  pTable->zName, 0
95d0: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
95e0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
95f0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
9600: 54 61 62 6c 65 2d 3e 72 65 61 64 4f 6e 6c 79 20  Table->readOnly 
9610: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
9620: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
9630: 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20  zErrMsg, "table 
9640: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
9650: 2c 20 0a 20 20 20 20 20 20 20 22 20 6d 61 79 20  , .       " may 
9660: 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
9670: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
9680: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
9690: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
96a0: 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20    if( isView && 
96b0: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3d  pTable->pSelect=
96c0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
96d0: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
96e0: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 73 65  e->zErrMsg, "use
96f0: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64   DROP TABLE to d
9700: 65 6c 65 74 65 20 74 61 62 6c 65 20 22 2c 0a 20  elete table ",. 
9710: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61       pTable->zNa
9720: 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  me, (char*)0);. 
9730: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
9740: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
9750: 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77   }.  if( !isView
9760: 20 26 26 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c   && pTable->pSel
9770: 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
9780: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
9790: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 73  se->zErrMsg, "us
97a0: 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64  e DROP VIEW to d
97b0: 65 6c 65 74 65 20 76 69 65 77 20 22 2c 0a 20 20  elete view ",.  
97c0: 20 20 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d      pTable->zNam
97d0: 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
97e0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
97f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
9800: 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
9810: 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
9820: 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
9830: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a  he master table.
9840: 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20    ** on disk..  
9850: 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  */.  v = sqliteG
9860: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
9870: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
9880: 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 72 6f  tatic VdbeOp dro
9890: 70 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20  pTable[] = {.   
98a0: 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20     { OP_Rewind, 
98b0: 20 20 20 20 30 2c 20 41 44 44 52 28 38 29 2c 20      0, ADDR(8), 
98c0: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
98d0: 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30  String,     0, 0
98e0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  ,        0}, /* 
98f0: 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  1 */.      { OP_
9900: 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20 31  MemStore,   1, 1
9910: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
9920: 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c     { OP_MemLoad,
9930: 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20      1, 0,       
9940: 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20   0}, /* 3 */.   
9950: 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20     { OP_Column, 
9960: 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20      0, 2,       
9970: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
9980: 4e 65 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41  Ne,         0, A
9990: 44 44 52 28 37 29 2c 20 20 30 7d 2c 0a 20 20 20  DDR(7),  0},.   
99a0: 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20     { OP_Delete, 
99b0: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
99c0: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
99d0: 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41  Next,       0, A
99e0: 44 44 52 28 33 29 2c 20 20 30 7d 2c 20 2f 2a 20  DDR(3),  0}, /* 
99f0: 37 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20  7 */.    };.    
9a00: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
9a10: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
9a20: 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 42 65  er;.    sqliteBe
9a30: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
9a40: 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54 61  n(pParse, 0, pTa
9a50: 62 6c 65 2d 3e 69 44 62 29 3b 0a 0a 20 20 20 20  ble->iDb);..    
9a60: 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67  /* Drop all trig
9a70: 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  gers associated 
9a80: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62  with the table b
9a90: 65 69 6e 67 20 64 72 6f 70 70 65 64 20 2a 2f 0a  eing dropped */.
9aa0: 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
9ab0: 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72 3b  Table->pTrigger;
9ac0: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54 72 69  .    while( pTri
9ad0: 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73  gger ){.      as
9ae0: 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e  sert( pTrigger->
9af0: 69 44 62 3d 3d 70 54 61 62 6c 65 2d 3e 69 44 62  iDb==pTable->iDb
9b00: 20 7c 7c 20 70 54 72 69 67 67 65 72 2d 3e 69 44   || pTrigger->iD
9b10: 62 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  b==1 );.      sq
9b20: 6c 69 74 65 44 72 6f 70 54 72 69 67 67 65 72 50  liteDropTriggerP
9b30: 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67  tr(pParse, pTrig
9b40: 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  ger, 1);.      i
9b50: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
9b60: 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  in ){.        pT
9b70: 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65  rigger = pTrigge
9b80: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
9b90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
9ba0: 54 72 69 67 67 65 72 20 3d 20 70 54 61 62 6c 65  Trigger = pTable
9bb0: 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20  ->pTrigger;.    
9bc0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
9bd0: 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54  * Drop all SQLIT
9be0: 45 5f 4d 41 53 54 45 52 20 65 6e 74 72 69 65 73  E_MASTER entries
9bf0: 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
9c00: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  he table */.    
9c10: 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65 72  sqliteOpenMaster
9c20: 54 61 62 6c 65 28 76 2c 20 70 54 61 62 6c 65 2d  Table(v, pTable-
9c30: 3e 69 44 62 29 3b 0a 20 20 20 20 62 61 73 65 20  >iDb);.    base 
9c40: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
9c50: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
9c60: 7a 65 28 64 72 6f 70 54 61 62 6c 65 29 2c 20 64  ze(dropTable), d
9c70: 72 6f 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 73  ropTable);.    s
9c80: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
9c90: 33 28 76 2c 20 62 61 73 65 2b 31 2c 20 70 54 61  3(v, base+1, pTa
9ca0: 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  ble->zName, 0);.
9cb0: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  .    /* Drop all
9cc0: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 4d 41 53   SQLITE_TEMP_MAS
9cd0: 54 45 52 20 65 6e 74 72 69 65 73 20 74 68 61 74  TER entries that
9ce0: 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 74 61   refer to the ta
9cf0: 62 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ble */.    if( p
9d00: 54 61 62 6c 65 2d 3e 69 44 62 21 3d 31 20 29 7b  Table->iDb!=1 ){
9d10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 70 65  .      sqliteOpe
9d20: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20  nMasterTable(v, 
9d30: 31 29 3b 0a 20 20 20 20 20 20 62 61 73 65 20 3d  1);.      base =
9d40: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
9d50: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
9d60: 65 28 64 72 6f 70 54 61 62 6c 65 29 2c 20 64 72  e(dropTable), dr
9d70: 6f 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  opTable);.      
9d80: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
9d90: 50 33 28 76 2c 20 62 61 73 65 2b 31 2c 20 70 54  P3(v, base+1, pT
9da0: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  able->zName, 0);
9db0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
9dc0: 70 54 61 62 6c 65 2d 3e 69 44 62 3d 3d 30 20 29  pTable->iDb==0 )
9dd0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43 68  {.      sqliteCh
9de0: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
9df0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
9e00: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
9e10: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
9e20: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
9e30: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9e40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9e50: 44 65 73 74 72 6f 79 2c 20 70 54 61 62 6c 65 2d  Destroy, pTable-
9e60: 3e 74 6e 75 6d 2c 20 70 54 61 62 6c 65 2d 3e 69  >tnum, pTable->i
9e70: 44 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  Db);.      for(p
9e80: 49 64 78 3d 70 54 61 62 6c 65 2d 3e 70 49 6e 64  Idx=pTable->pInd
9e90: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
9ea0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
9eb0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
9ec0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72  ddOp(v, OP_Destr
9ed0: 6f 79 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  oy, pIdx->tnum, 
9ee0: 70 49 64 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20  pIdx->iDb);.    
9ef0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
9f00: 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
9f10: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
9f20: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
9f30: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 65  the in-memory de
9f40: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
9f50: 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a   table..  **.  *
9f60: 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 69 66 20  * Exception: if 
9f70: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
9f80: 74 20 62 65 67 61 6e 20 77 69 74 68 20 74 68 65  t began with the
9f90: 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64   EXPLAIN keyword
9fa0: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6e 6f 20 63  ,.  ** then no c
9fb0: 68 61 6e 67 65 73 20 73 68 6f 75 6c 64 20 62 65  hanges should be
9fc0: 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   made..  */.  if
9fd0: 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  ( !pParse->expla
9fe0: 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  in ){.    sqlite
9ff0: 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54  UnlinkAndDeleteT
a000: 61 62 6c 65 28 64 62 2c 20 70 54 61 62 6c 65 29  able(db, pTable)
a010: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
a020: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
a030: 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 20 20 73  Changes;.  }.  s
a040: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
a050: 6c 28 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f  l(db, iDb);.}../
a060: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a070: 65 20 63 6f 6e 73 74 72 75 63 74 73 20 61 20 50  e constructs a P
a080: 33 20 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c  3 string suitabl
a090: 65 20 66 6f 72 20 61 6e 20 4f 50 5f 4d 61 6b 65  e for an OP_Make
a0a0: 49 64 78 4b 65 79 0a 2a 2a 20 6f 70 63 6f 64 65  IdxKey.** opcode
a0b0: 20 61 6e 64 20 61 64 64 73 20 74 68 61 74 20 50   and adds that P
a0c0: 33 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65 20  3 string to the 
a0d0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e  most recently in
a0e0: 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 69  serted instructi
a0f0: 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 76 69 72  on.** in the vir
a100: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54  tual machine.  T
a110: 68 65 20 50 33 20 73 74 72 69 6e 67 20 63 6f 6e  he P3 string con
a120: 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c  sists of a singl
a130: 65 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 66  e character.** f
a140: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69  or each column i
a150: 6e 20 74 68 65 20 69 6e 64 65 78 20 70 49 64 78  n the index pIdx
a160: 20 6f 66 20 74 61 62 6c 65 20 70 54 61 62 2e 20   of table pTab. 
a170: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 75   If the column u
a180: 73 65 73 0a 2a 2a 20 61 20 6e 75 6d 65 72 69 63  ses.** a numeric
a190: 20 73 6f 72 74 20 6f 72 64 65 72 2c 20 74 68 65   sort order, the
a1a0: 6e 20 74 68 65 20 50 33 20 73 74 72 69 6e 67 20  n the P3 string 
a1b0: 63 68 61 72 61 63 74 65 72 20 63 6f 72 72 65 73  character corres
a1c0: 70 6f 6e 64 69 6e 67 20 74 6f 0a 2a 2a 20 74 68  ponding to.** th
a1d0: 61 74 20 63 6f 6c 75 6d 6e 20 69 73 20 27 6e 27  at column is 'n'
a1e0: 2e 20 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  .  If the column
a1f0: 20 75 73 65 73 20 61 20 74 65 78 74 20 73 6f 72   uses a text sor
a200: 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68  t order, then th
a210: 65 0a 2a 2a 20 50 33 20 73 74 72 69 6e 67 20 69  e.** P3 string i
a220: 73 20 27 74 27 2e 20 20 53 65 65 20 74 68 65 20  s 't'.  See the 
a230: 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 20 6f 70  OP_MakeIdxKey op
a240: 63 6f 64 65 20 64 6f 63 75 6d 65 6e 74 61 74 69  code documentati
a250: 6f 6e 20 66 6f 72 0a 2a 2a 20 61 64 64 69 74 69  on for.** additi
a260: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
a270: 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20  .  See also the 
a280: 73 71 6c 69 74 65 41 64 64 4b 65 79 54 79 70 65  sqliteAddKeyType
a290: 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 76  () routine..*/.v
a2a0: 6f 69 64 20 73 71 6c 69 74 65 41 64 64 49 64 78  oid sqliteAddIdx
a2b0: 4b 65 79 54 79 70 65 28 56 64 62 65 20 2a 76 2c  KeyType(Vdbe *v,
a2c0: 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20   Index *pIdx){. 
a2d0: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20   char *zType;.  
a2e0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69  Table *pTab;.  i
a2f0: 6e 74 20 69 2c 20 6e 3b 0a 20 20 61 73 73 65 72  nt i, n;.  asser
a300: 74 28 20 70 49 64 78 21 3d 30 20 26 26 20 70 49  t( pIdx!=0 && pI
a310: 64 78 2d 3e 70 54 61 62 6c 65 21 3d 30 20 29 3b  dx->pTable!=0 );
a320: 0a 20 20 70 54 61 62 20 3d 20 70 49 64 78 2d 3e  .  pTab = pIdx->
a330: 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 70 49  pTable;.  n = pI
a340: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7a  dx->nColumn;.  z
a350: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Type = sqliteMal
a360: 6c 6f 63 52 61 77 28 20 6e 2b 31 20 29 3b 0a 20  locRaw( n+1 );. 
a370: 20 69 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20   if( zType==0 ) 
a380: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
a390: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
a3a0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64    int iCol = pId
a3b0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  x->aiColumn[i];.
a3c0: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
a3d0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
a3e0: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 69 66  ->nCol );.    if
a3f0: 28 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  ( (pTab->aCol[iC
a400: 6f 6c 5d 2e 73 6f 72 74 4f 72 64 65 72 20 26 20  ol].sortOrder & 
a410: 53 51 4c 49 54 45 5f 53 4f 5f 54 59 50 45 4d 41  SQLITE_SO_TYPEMA
a420: 53 4b 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54  SK)==SQLITE_SO_T
a430: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  EXT ){.      zTy
a440: 70 65 5b 69 5d 20 3d 20 27 74 27 3b 0a 20 20 20  pe[i] = 't';.   
a450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 54   }else{.      zT
a460: 79 70 65 5b 69 5d 20 3d 20 27 6e 27 3b 0a 20 20  ype[i] = 'n';.  
a470: 20 20 7d 0a 20 20 7d 0a 20 20 7a 54 79 70 65 5b    }.  }.  zType[
a480: 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  n] = 0;.  sqlite
a490: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
a4a0: 2d 31 2c 20 7a 54 79 70 65 2c 20 6e 29 3b 0a 20  -1, zType, n);. 
a4b0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 79 70   sqliteFree(zTyp
a4c0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  e);.}../*.** Thi
a4d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
a4e0: 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  led to create a 
a4f0: 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  new foreign key 
a500: 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  on the table.** 
a510: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
a520: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70  construction.  p
a530: 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e  FromCol determin
a540: 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73  es which columns
a550: 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65  .** in the curre
a560: 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74  nt table point t
a570: 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  o the foreign ke
a580: 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d  y.  If pFromCol=
a590: 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65  =0 then.** conne
a5a0: 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68  ct the key to th
a5b0: 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e  e last column in
a5c0: 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20  serted.  pTo is 
a5d0: 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74  the name of.** t
a5e0: 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65  he table referre
a5f0: 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73  d to.  pToCol is
a600: 20 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65   a list of table
a610: 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a  s in the other.*
a620: 2a 20 70 54 6f 20 74 61 62 6c 65 20 74 68 61 74  * pTo table that
a630: 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
a640: 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61   points to.  fla
a650: 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  gs contains all.
a660: 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** information a
a670: 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63  bout the conflic
a680: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
a690: 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65  orithms specifie
a6a0: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44  d.** in the ON D
a6b0: 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45  ELETE, ON UPDATE
a6c0: 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63   and ON INSERT c
a6d0: 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  lauses..**.** An
a6e0: 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20   FKey structure 
a6f0: 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61  is created and a
a700: 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
a710: 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75  e currently.** u
a720: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
a730: 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d  n in the pParse-
a740: 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64  >pNewTable field
a750: 2e 20 20 54 68 65 20 6e 65 77 20 46 4b 65 79 0a  .  The new FKey.
a760: 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e 6b 65 64  ** is not linked
a770: 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b 65 79 20   into db->aFKey 
a780: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 2d 20  at this point - 
a790: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 68 61  that does not ha
a7a0: 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73 71  ppen.** until sq
a7b0: 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 29 2e 0a  liteEndTable()..
a7c0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67  **.** The foreig
a7d0: 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72  n key is set for
a7e0: 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65   IMMEDIATE proce
a7f0: 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71  ssing.  A subseq
a800: 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20  uent call.** to 
a810: 73 71 6c 69 74 65 44 65 66 65 72 46 6f 72 65 69  sqliteDeferForei
a820: 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68  gnKey() might ch
a830: 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46  ange this to DEF
a840: 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ERRED..*/.void s
a850: 71 6c 69 74 65 43 72 65 61 74 65 46 6f 72 65 69  qliteCreateForei
a860: 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a  gnKey(.  Parse *
a870: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
a880: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
a890: 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 46   */.  IdList *pF
a8a0: 72 6f 6d 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f  romCol,    /* Co
a8b0: 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61  lumns in this ta
a8c0: 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ble that point t
a8d0: 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  o other table */
a8e0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20  .  Token *pTo,  
a8f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
a900: 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  of the other tab
a910: 6c 65 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a  le */.  IdList *
a920: 70 54 6f 43 6f 6c 2c 20 20 20 20 20 20 2f 2a 20  pToCol,      /* 
a930: 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  Columns in the o
a940: 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
a950: 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
a960: 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74       /* Conflict
a970: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
a980: 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20  rithms. */.){.  
a990: 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73  Table *p = pPars
a9a0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
a9b0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  int nByte;.  int
a9c0: 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a   i;.  int nCol;.
a9d0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 46 4b 65    char *z;.  FKe
a9e0: 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 20  y *pFKey = 0;.. 
a9f0: 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20   assert( pTo!=0 
aa00: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  );.  if( p==0 ||
aa10: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
aa20: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69  goto fk_end;.  i
aa30: 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
aa40: 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  {.    int iCol =
aa50: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20   p->nCol-1;.    
aa60: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74  if( iCol<0 ) got
aa70: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66  o fk_end;.    if
aa80: 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
aa90: 6f 6c 2d 3e 6e 49 64 21 3d 31 20 29 7b 0a 20 20  ol->nId!=1 ){.  
aaa0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
aab0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
aac0: 72 72 4d 73 67 2c 20 22 66 6f 72 65 69 67 6e 20  rrMsg, "foreign 
aad0: 6b 65 79 20 6f 6e 20 22 2c 20 2d 31 2c 0a 20 20  key on ", -1,.  
aae0: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69         p->aCol[i
aaf0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 2d 31 2c 20  Col].zName, -1, 
ab00: 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75  .         " shou
ab10: 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  ld reference onl
ab20: 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  y one column of 
ab30: 74 61 62 6c 65 20 22 2c 20 2d 31 2c 0a 20 20 20  table ", -1,.   
ab40: 20 20 20 20 20 20 70 54 6f 2d 3e 7a 2c 20 70 54        pTo->z, pT
ab50: 6f 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  o->n, 0);.      
ab60: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
ab70: 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
ab80: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f  d;.    }.    nCo
ab90: 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l = 1;.  }else i
aba0: 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
abb0: 43 6f 6c 2d 3e 6e 49 64 21 3d 70 46 72 6f 6d 43  Col->nId!=pFromC
abc0: 6f 6c 2d 3e 6e 49 64 20 29 7b 0a 20 20 20 20 73  ol->nId ){.    s
abd0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
abe0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
abf0: 20 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65   .        "numbe
ac00: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
ac10: 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73  foreign key does
ac20: 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e   not match the n
ac30: 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20  umber of ".     
ac40: 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74     "columns in t
ac50: 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
ac60: 62 6c 65 22 2c 20 28 63 68 61 72 2a 29 30 29 3b  ble", (char*)0);
ac70: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
ac80: 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  r++;.    goto fk
ac90: 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  _end;.  }else{. 
aca0: 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43     nCol = pFromC
acb0: 6f 6c 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 20 20 6e  ol->nId;.  }.  n
acc0: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
acd0: 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a  FKey) + nCol*siz
ace0: 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  eof(pFKey->aCol[
acf0: 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31  0]) + pTo->n + 1
ad00: 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  ;.  if( pToCol )
ad10: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
ad20: 3c 70 54 6f 43 6f 6c 2d 3e 6e 49 64 3b 20 69 2b  <pToCol->nId; i+
ad30: 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20  +){.      nByte 
ad40: 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c  += strlen(pToCol
ad50: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20  ->a[i].zName) + 
ad60: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
ad70: 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c  FKey = sqliteMal
ad80: 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  loc( nByte );.  
ad90: 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 20 67  if( pFKey==0 ) g
ada0: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 70 46  oto fk_end;.  pF
adb0: 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a  Key->pFrom = p;.
adc0: 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72    pFKey->pNextFr
add0: 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20  om = p->pFKey;. 
ade0: 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b   z = (char*)&pFK
adf0: 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e  ey[1];.  pFKey->
ae00: 61 43 6f 6c 20 3d 20 28 73 74 72 75 63 74 20 73  aCol = (struct s
ae10: 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b  ColMap*)z;.  z +
ae20: 3d 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  = sizeof(struct 
ae30: 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20  sColMap)*nCol;. 
ae40: 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b   pFKey->zTo = z;
ae50: 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f  .  memcpy(z, pTo
ae60: 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20  ->z, pTo->n);.  
ae70: 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  z[pTo->n] = 0;. 
ae80: 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a   z += pTo->n+1;.
ae90: 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f    pFKey->pNextTo
aea0: 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e   = 0;.  pFKey->n
aeb0: 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66  Col = nCol;.  if
aec0: 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b  ( pFromCol==0 ){
aed0: 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  .    pFKey->aCol
aee0: 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e  [0].iFrom = p->n
aef0: 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Col-1;.  }else{.
af00: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
af10: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
af20: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
af30: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c  r(j=0; j<p->nCol
af40: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
af50: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
af60: 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  p(p->aCol[j].zNa
af70: 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  me, pFromCol->a[
af80: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
af90: 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
afa0: 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d  >aCol[i].iFrom =
afb0: 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   j;.          br
afc0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
afd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
afe0: 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20   j>=p->nCol ){. 
aff0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
b000: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
b010: 7a 45 72 72 4d 73 67 2c 20 22 75 6e 6b 6e 6f 77  zErrMsg, "unknow
b020: 6e 20 63 6f 6c 75 6d 6e 20 5c 22 22 2c 20 0a 20  n column \"", . 
b030: 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f           pFromCo
b040: 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 22  l->a[i].zName, "
b050: 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  \" in foreign ke
b060: 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 28  y definition", (
b070: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
b080: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
b090: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
b0a0: 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  k_end;.      }. 
b0b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
b0c0: 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
b0d0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
b0e0: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  +){.      int n 
b0f0: 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d  = strlen(pToCol-
b100: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
b110: 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
b120: 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20  i].zCol = z;.   
b130: 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f     memcpy(z, pTo
b140: 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  Col->a[i].zName,
b150: 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20   n);.      z[n] 
b160: 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  = 0;.      z += 
b170: 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n+1;.    }.  }. 
b180: 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
b190: 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d  ed = 0;.  pFKey-
b1a0: 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c  >deleteConf = fl
b1b0: 61 67 73 20 26 20 30 78 66 66 3b 0a 20 20 70 46  ags & 0xff;.  pF
b1c0: 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20  Key->updateConf 
b1d0: 3d 20 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20  = (flags >> 8 ) 
b1e0: 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d  & 0xff;.  pFKey-
b1f0: 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28 66  >insertConf = (f
b200: 6c 61 67 73 20 3e 3e 20 31 36 20 29 20 26 20 30  lags >> 16 ) & 0
b210: 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  xff;..  /* Link 
b220: 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
b230: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20  to the table as 
b240: 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20  the last step.. 
b250: 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d   */.  p->pFKey =
b260: 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20   pFKey;.  pFKey 
b270: 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20  = 0;..fk_end:.  
b280: 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79  sqliteFree(pFKey
b290: 29 3b 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73  );.  sqliteIdLis
b2a0: 74 44 65 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c  tDelete(pFromCol
b2b0: 29 3b 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73  );.  sqliteIdLis
b2c0: 74 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b  tDelete(pToCol);
b2d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
b2e0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
b2f0: 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c   when an INITIAL
b300: 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20  LY IMMEDIATE or 
b310: 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
b320: 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  ED.** clause is 
b330: 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  seen as part of 
b340: 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  a foreign key de
b350: 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69  finition.  The i
b360: 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72  sDeferred.** par
b370: 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20  ameter is 1 for 
b380: 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
b390: 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49  ED and 0 for INI
b3a0: 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
b3b0: 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f  ..** The behavio
b3c0: 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  r of the most re
b3d0: 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66  cently created f
b3e0: 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64  oreign key is ad
b3f0: 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64  justed.** accord
b400: 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ingly..*/.void s
b410: 71 6c 69 74 65 44 65 66 65 72 46 6f 72 65 69 67  qliteDeferForeig
b420: 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72  nKey(Parse *pPar
b430: 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72  se, int isDeferr
b440: 65 64 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ed){.  Table *pT
b450: 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  ab;.  FKey *pFKe
b460: 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d  y;.  if( (pTab =
b470: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
b480: 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79  le)==0 || (pFKey
b490: 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d   = pTab->pFKey)=
b4a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
b4b0: 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
b4c0: 20 3d 20 69 73 44 65 66 65 72 72 65 64 3b 0a 7d   = isDeferred;.}
b4d0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
b4e0: 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61   new index for a
b4f0: 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 49  n SQL table.  pI
b500: 6e 64 65 78 20 69 73 20 74 68 65 20 6e 61 6d 65  ndex is the name
b510: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
b520: 2a 20 61 6e 64 20 70 54 61 62 6c 65 20 69 73 20  * and pTable is 
b530: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
b540: 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
b550: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f   be indexed.  Bo
b560: 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e  th will .** be N
b570: 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72  ULL for a primar
b580: 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65  y key or an inde
b590: 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  x that is create
b5a0: 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a  d to satisfy a.*
b5b0: 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
b5c0: 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20  int.  If pTable 
b5d0: 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e  and pIndex are N
b5e0: 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d  ULL, use pParse-
b5f0: 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73  >pNewTable.** as
b600: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
b610: 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73   indexed.  pPars
b620: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20  e->pNewTable is 
b630: 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a  a table that is.
b640: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
b650: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
b660: 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  y a CREATE TABLE
b670: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
b680: 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73  * pList is a lis
b690: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
b6a0: 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69  be indexed.  pLi
b6b0: 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  st will be NULL 
b6c0: 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20  if this.** is a 
b6d0: 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75  primary key or u
b6e0: 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74  nique-constraint
b6f0: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
b700: 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ent column added
b710: 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65  .** to the table
b720: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
b730: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
b740: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43  .*/.void sqliteC
b750: 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61  reateIndex(.  Pa
b760: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
b770: 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * All informatio
b780: 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72  n about this par
b790: 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
b7a0: 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  Name,    /* Name
b7b0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
b7c0: 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
b7d0: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 6c 65   SrcList *pTable
b7e0: 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  , /* Name of the
b7f0: 20 74 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e   table to index.
b800: 20 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e    Use pParse->pN
b810: 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a  ewTable if 0 */.
b820: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c    IdList *pList,
b830: 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20     /* A list of 
b840: 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
b850: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
b860: 6e 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f  nError,     /* O
b870: 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f  E_Abort, OE_Igno
b880: 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20  re, OE_Replace, 
b890: 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20  or OE_None */.  
b8a0: 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
b8b0: 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
b8c0: 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
b8d0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
b8e0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
b8f0: 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20 20  oken *pEnd      
b900: 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74 20  /* The ")" that 
b910: 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41 54  closes the CREAT
b920: 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
b930: 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  t */.){.  Table 
b940: 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61  *pTab;     /* Ta
b950: 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
b960: 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
b970: 6e 64 65 78 3b 20 20 20 2f 2a 20 54 68 65 20 69  ndex;   /* The i
b980: 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74  ndex to be creat
b990: 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ed */.  char *zN
b9a0: 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ame = 0;.  int i
b9b0: 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c  , j;.  Token nul
b9c0: 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b 65 20  lId;    /* Fake 
b9d0: 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70  token for an emp
b9e0: 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20  ty ID list */.  
b9f0: 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20  DbFixer sFix;   
ba00: 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e   /* For assignin
ba10: 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73  g database names
ba20: 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20   to pTable */.  
ba30: 69 6e 74 20 69 73 54 65 6d 70 3b 20 20 20 20 20  int isTemp;     
ba40: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 74   /* True for a t
ba50: 65 6d 70 6f 72 61 72 79 20 69 6e 64 65 78 20 2a  emporary index *
ba60: 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  /.  sqlite *db =
ba70: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
ba80: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
ba90: 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   || sqlite_mallo
baa0: 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  c_failed ) goto 
bab0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
bac0: 78 3b 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  x;.  if( db->ini
bad0: 74 2e 62 75 73 79 20 0a 20 20 20 20 20 26 26 20  t.busy .     && 
bae0: 73 71 6c 69 74 65 46 69 78 49 6e 69 74 28 26 73  sqliteFixInit(&s
baf0: 46 69 78 2c 20 70 50 61 72 73 65 2c 20 64 62 2d  Fix, pParse, db-
bb00: 3e 69 6e 69 74 2e 69 44 62 2c 20 22 69 6e 64 65  >init.iDb, "inde
bb10: 78 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20 20  x", pName).     
bb20: 26 26 20 73 71 6c 69 74 65 46 69 78 53 72 63 4c  && sqliteFixSrcL
bb30: 69 73 74 28 26 73 46 69 78 2c 20 70 54 61 62 6c  ist(&sFix, pTabl
bb40: 65 29 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f  e).  ){.    goto
bb50: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
bb60: 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ex;.  }..  /*.  
bb70: 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c  ** Find the tabl
bb80: 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
bb90: 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e  indexed.  Return
bba0: 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f   early if not fo
bbb0: 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  und..  */.  if( 
bbc0: 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20  pTable!=0 ){.   
bbd0: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 21 3d   assert( pName!=
bbe0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
bbf0: 20 70 54 61 62 6c 65 2d 3e 6e 53 72 63 3d 3d 31   pTable->nSrc==1
bc00: 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20   );.    pTab =  
bc10: 73 71 6c 69 74 65 53 72 63 4c 69 73 74 4c 6f 6f  sqliteSrcListLoo
bc20: 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 61 62  kup(pParse, pTab
bc30: 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  le);.  }else{.  
bc40: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d    assert( pName=
bc50: 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d  =0 );.    pTab =
bc60: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
bc70: 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ble;.  }.  if( p
bc80: 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  Tab==0 || pParse
bc90: 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78  ->nErr ) goto ex
bca0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
bcb0: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61  .  if( pTab->rea
bcc0: 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c  dOnly ){.    sql
bcd0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
bce0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
bcf0: 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a  table ", pTab->z
bd00: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 22 20 6d 61  Name,.      " ma
bd10: 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
bd20: 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ", (char*)0);.  
bd30: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
bd40: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
bd50: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
bd60: 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69 44  }.  if( pTab->iD
bd70: 62 3e 3d 32 20 26 26 20 64 62 2d 3e 69 6e 69 74  b>=2 && db->init
bd80: 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20  .busy==0 ){.    
bd90: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
bda0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
bdb0: 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62  , "table ", pTab
bdc0: 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ->zName, .      
bdd0: 22 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 69  " may not have i
bde0: 6e 64 69 63 65 73 20 61 64 64 65 64 22 2c 20 28  ndices added", (
bdf0: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 70 50  char*)0);.    pP
be00: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
be10: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
be20: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
be30: 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
be40: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  t ){.    sqliteS
be50: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
be60: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 76 69 65 77  ->zErrMsg, "view
be70: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
be80: 65 78 65 64 22 2c 20 28 63 68 61 72 2a 29 30 29  exed", (char*)0)
be90: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
bea0: 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rr++;.    goto e
beb0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
bec0: 3b 0a 20 20 7d 0a 20 20 69 73 54 65 6d 70 20 3d  ;.  }.  isTemp =
bed0: 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31 3b 0a 0a   pTab->iDb==1;..
bee0: 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
bef0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
bf00: 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65  ndex.  Make sure
bf10: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c   there is not al
bf20: 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20  ready another.  
bf30: 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
bf40: 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
bf50: 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  name.  .  **.  *
bf60: 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66  * Exception:  If
bf70: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
bf80: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72  the names of per
bf90: 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66  manent indices f
bfa0: 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  rom the.  ** sql
bfb0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
bfc0: 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f   (because some o
bfd0: 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61  ther process cha
bfe0: 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29  nged the schema)
bff0: 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66   and.  ** one of
c000: 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73   the index names
c010: 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74   collides with t
c020: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d  he name of a tem
c030: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a  porary table or.
c040: 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e    ** index, then
c050: 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
c060: 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69  e to process thi
c070: 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20  s index..  **.  
c080: 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69  ** If pName==0 i
c090: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
c0a0: 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67  are.  ** dealing
c0b0: 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20   with a primary 
c0c0: 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  key or UNIQUE co
c0d0: 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61  nstraint.  We ha
c0e0: 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72  ve to invent our
c0f0: 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a  .  ** own name..
c100: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65    */.  if( pName
c110: 20 26 26 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75   && !db->init.bu
c120: 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  sy ){.    Index 
c130: 2a 70 49 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20  *pISameName;    
c140: 2f 2a 20 41 6e 6f 74 68 65 72 20 69 6e 64 65 78  /* Another index
c150: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
c160: 61 6d 65 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ame */.    Table
c170: 20 2a 70 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20   *pTSameName;   
c180: 20 2f 2a 20 41 20 74 61 62 6c 65 20 77 69 74 68   /* A table with
c190: 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
c1a0: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7a  e index */.    z
c1b0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
c1c0: 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70  NDup(pName->z, p
c1d0: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66  Name->n);.    if
c1e0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74  ( zName==0 ) got
c1f0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
c200: 64 65 78 3b 0a 20 20 20 20 69 66 28 20 28 70 49  dex;.    if( (pI
c210: 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74  SameName = sqlit
c220: 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  eFindIndex(db, z
c230: 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a  Name, 0))!=0 ){.
c240: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
c250: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
c260: 45 72 72 4d 73 67 2c 20 22 69 6e 64 65 78 20 22  ErrMsg, "index "
c270: 2c 20 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  , zName, .      
c280: 20 20 20 22 20 61 6c 72 65 61 64 79 20 65 78 69     " already exi
c290: 73 74 73 22 2c 20 28 63 68 61 72 2a 29 30 29 3b  sts", (char*)0);
c2a0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
c2b0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 67 6f 74  Err++;.      got
c2c0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
c2d0: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
c2e0: 66 28 20 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d  f( (pTSameName =
c2f0: 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65   sqliteFindTable
c300: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21  (db, zName, 0))!
c310: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
c320: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
c330: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74  rse->zErrMsg, "t
c340: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
c350: 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 2c  a table named ",
c360: 0a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c  .         zName,
c370: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
c380: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
c390: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
c3a0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
c3b0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
c3c0: 28 20 70 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( pName==0 ){.  
c3d0: 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
c3e0: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
c3f0: 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20  Index *pLoop;.  
c400: 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62    for(pLoop=pTab
c410: 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70  ->pIndex, n=1; p
c420: 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
c430: 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d  p->pNext, n++){}
c440: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
c450: 66 2c 22 25 64 29 22 2c 6e 29 3b 0a 20 20 20 20  f,"%d)",n);.    
c460: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73  zName = 0;.    s
c470: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
c480: 7a 4e 61 6d 65 2c 20 22 28 22 2c 20 70 54 61 62  zName, "(", pTab
c490: 2d 3e 7a 4e 61 6d 65 2c 20 22 20 61 75 74 6f 69  ->zName, " autoi
c4a0: 6e 64 65 78 20 22 2c 20 7a 42 75 66 2c 20 28 63  ndex ", zBuf, (c
c4b0: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 69 66 28  har*)0);.    if(
c4c0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f   zName==0 ) goto
c4d0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
c4e0: 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ex;.  }else{.   
c4f0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53   zName = sqliteS
c500: 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c  trNDup(pName->z,
c510: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 7d 0a   pName->n);.  }.
c520: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
c530: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f  authorization to
c540: 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78   create an index
c550: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
c560: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
c570: 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
c580: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
c590: 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d   = db->aDb[pTab-
c5a0: 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20  >iDb].zName;..  
c5b0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
c5c0: 69 44 62 3d 3d 64 62 2d 3e 69 6e 69 74 2e 69 44  iDb==db->init.iD
c5d0: 62 20 7c 7c 20 69 73 54 65 6d 70 20 29 3b 0a 20  b || isTemp );. 
c5e0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74     if( sqliteAut
c5f0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
c600: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
c610: 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d  HEMA_TABLE(isTem
c620: 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  p), 0, zDb) ){. 
c630: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
c640: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
c650: 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54   }.    i = SQLIT
c660: 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a  E_CREATE_INDEX;.
c670: 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29      if( isTemp )
c680: 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
c690: 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  TE_TEMP_INDEX;. 
c6a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74     if( sqliteAut
c6b0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69  hCheck(pParse, i
c6c0: 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  , zName, pTab->z
c6d0: 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
c6e0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
c6f0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
c700: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
c710: 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20  /* If pList==0, 
c720: 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f  it means this ro
c730: 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
c740: 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61   to make a prima
c750: 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20  ry.  ** key out 
c760: 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  of the last colu
c770: 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  mn added to the 
c780: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
c790: 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53  truction..  ** S
c7a0: 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20  o create a fake 
c7b0: 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65  list to simulate
c7c0: 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   this..  */.  if
c7d0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
c7e0: 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61    nullId.z = pTa
c7f0: 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
c800: 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol-1].zName;.   
c810: 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c   nullId.n = strl
c820: 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20  en(nullId.z);.  
c830: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
c840: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  IdListAppend(0, 
c850: 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66  &nullId);.    if
c860: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
c870: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
c880: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a  dex;.  }..  /* .
c890: 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    ** Allocate th
c8a0: 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
c8b0: 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65  e. .  */.  pInde
c8c0: 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  x = sqliteMalloc
c8d0: 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20  ( sizeof(Index) 
c8e0: 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20  + strlen(zName) 
c8f0: 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20  + 1 +.          
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
c910: 7a 65 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d  zeof(int)*pList-
c920: 3e 6e 49 64 20 29 3b 0a 20 20 69 66 28 20 70 49  >nId );.  if( pI
c930: 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65  ndex==0 ) goto e
c940: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
c950: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  ;.  pIndex->aiCo
c960: 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49  lumn = (int*)&pI
c970: 6e 64 65 78 5b 31 5d 3b 0a 20 20 70 49 6e 64 65  ndex[1];.  pInde
c980: 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  x->zName = (char
c990: 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  *)&pIndex->aiCol
c9a0: 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b  umn[pList->nId];
c9b0: 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64 65 78  .  strcpy(pIndex
c9c0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  ->zName, zName);
c9d0: 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  .  pIndex->pTabl
c9e0: 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64  e = pTab;.  pInd
c9f0: 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c  ex->nColumn = pL
ca00: 69 73 74 2d 3e 6e 49 64 3b 0a 20 20 70 49 6e 64  ist->nId;.  pInd
ca10: 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e  ex->onError = on
ca20: 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d  Error;.  pIndex-
ca30: 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61  >autoIndex = pNa
ca40: 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d  me==0;.  pIndex-
ca50: 3e 69 44 62 20 3d 20 69 73 54 65 6d 70 20 3f 20  >iDb = isTemp ? 
ca60: 31 20 3a 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  1 : db->init.iDb
ca70: 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65  ;..  /* Scan the
ca80: 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
ca90: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62  lumns of the tab
caa0: 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
cab0: 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74   and.  ** load t
cac0: 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65  he column indice
cad0: 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78  s into the Index
cae0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 70   structure.  Rep
caf0: 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a  ort an error.  *
cb00: 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  * if any column 
cb10: 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  is not found..  
cb20: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
cb30: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
cb40: 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
cb50: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
cb60: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
cb70: 69 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73 74  iteStrICmp(pList
cb80: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[i].zName, pT
cb90: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
cba0: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
cbb0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d     }.    if( j>=
cbc0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
cbd0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
cbe0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
cbf0: 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20  rMsg, "table ", 
cc00: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20  pTab->zName, .  
cc10: 20 20 20 20 20 20 22 20 68 61 73 20 6e 6f 20 63        " has no c
cc20: 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 22 2c 20 70  olumn named ", p
cc30: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
cc40: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
cc50: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
cc60: 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  +;.      sqliteF
cc70: 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20  ree(pIndex);.   
cc80: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
cc90: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
cca0: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  .    pIndex->aiC
ccb0: 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20  olumn[i] = j;.  
ccc0: 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  }..  /* Link the
ccd0: 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63   new Index struc
cce0: 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c  ture to its tabl
ccf0: 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68  e and to the oth
cd00: 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  er.  ** in-memor
cd10: 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  y database struc
cd20: 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69  tures. .  */.  i
cd30: 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  f( !pParse->expl
cd40: 61 69 6e 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ain ){.    Index
cd50: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c   *p;.    p = sql
cd60: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
cd70: 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69  b->aDb[pIndex->i
cd80: 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 0a 20 20  Db].idxHash, .  
cd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cda0: 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
cdb0: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e  Name, strlen(pIn
cdc0: 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70  dex->zName)+1, p
cdd0: 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
cde0: 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
cdf0: 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20  t( p==pIndex ); 
ce00: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
ce10: 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
ce20: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
ce30: 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 67  pIndex);.      g
ce40: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
ce50: 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
ce60: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
ce70: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
ce80: 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68  es;.  }..  /* Wh
ce90: 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64  en adding an ind
cea0: 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ex to the list o
ceb0: 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20  f indices for a 
cec0: 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a  table, make.  **
ced0: 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65   sure all indice
cee0: 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70  s labeled OE_Rep
cef0: 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20  lace come after 
cf00: 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65  all those labele
cf10: 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65  d.  ** OE_Ignore
cf20: 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
cf30: 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72  sary for the cor
cf40: 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  rect operation o
cf50: 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e  f UPDATE.  ** an
cf60: 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20  d INSERT..  */. 
cf70: 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45   if( onError!=OE
cf80: 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62  _Replace || pTab
cf90: 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20  ->pIndex==0.    
cfa0: 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64     || pTab->pInd
cfb0: 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
cfc0: 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 70 49  Replace){.    pI
cfd0: 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54  ndex->pNext = pT
cfe0: 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
cff0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70  pTab->pIndex = p
d000: 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Index;.  }else{.
d010: 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65      Index *pOthe
d020: 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  r = pTab->pIndex
d030: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74  ;.    while( pOt
d040: 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f  her->pNext && pO
d050: 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45  ther->pNext->onE
d060: 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
d070: 20 29 7b 0a 20 20 20 20 20 20 70 4f 74 68 65 72   ){.      pOther
d080: 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
d090: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
d0a0: 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68  ex->pNext = pOth
d0b0: 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 70  er->pNext;.    p
d0c0: 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Other->pNext = p
d0d0: 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Index;.  }..  /*
d0e0: 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74   If the db->init
d0f0: 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d 65  .busy is 1 it me
d100: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
d110: 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74  ng the SQL off t
d120: 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f  he.  ** "sqlite_
d130: 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e  master" table on
d140: 20 74 68 65 20 64 69 73 6b 2e 20 20 53 6f 20 64   the disk.  So d
d150: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
d160: 68 65 20 64 69 73 6b 0a 20 20 2a 2a 20 61 67 61  he disk.  ** aga
d170: 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
d180: 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 66 72   table number fr
d190: 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  om the db->init.
d1a0: 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 0a 20  newTnum field.. 
d1b0: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
d1c0: 69 74 2e 62 75 73 79 20 26 26 20 70 54 61 62 6c  it.busy && pTabl
d1d0: 65 21 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 64  e!=0 ){.    pInd
d1e0: 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69  ex->tnum = db->i
d1f0: 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d  nit.newTnum;.  }
d200: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
d210: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30  ->init.busy is 0
d220: 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65   then create the
d230: 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20   index on disk. 
d240: 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c   This.  ** invol
d250: 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20  ves writing the 
d260: 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d  index into the m
d270: 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
d280: 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20  filling in the. 
d290: 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74   ** index with t
d2a0: 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
d2b0: 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a   contents..  **.
d2c0: 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69    ** The db->ini
d2d0: 74 2e 62 75 73 79 20 69 73 20 30 20 77 68 65 6e  t.busy is 0 when
d2e0: 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20   the user first 
d2f0: 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20  enters a CREATE 
d300: 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d  INDEX .  ** comm
d310: 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62  and.  db->init.b
d320: 75 73 79 20 69 73 20 31 20 77 68 65 6e 20 61 20  usy is 1 when a 
d330: 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
d340: 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45  ed and .  ** CRE
d350: 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
d360: 65 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f 75  ents are read ou
d370: 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  t of the master 
d380: 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20  table.  In.  ** 
d390: 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20  the latter case 
d3a0: 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
d3b0: 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b  y exists on disk
d3c0: 2c 20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20  , which is why. 
d3d0: 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
d3e0: 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 69 74  t to recreate it
d3f0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
d400: 54 61 62 6c 65 3d 3d 30 20 69 74 20 6d 65 61 6e  Table==0 it mean
d410: 73 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  s this index is 
d420: 67 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70  generated as a p
d430: 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20  rimary key.  ** 
d440: 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
d450: 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45  aint of a CREATE
d460: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
d470: 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62  .  Since the tab
d480: 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74  le.  ** has just
d490: 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69   been created, i
d4a0: 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61  t contains no da
d4b0: 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ta and the index
d4c0: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
d4d0: 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65    ** step can be
d4e0: 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
d4f0: 20 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 69 6e   else if( db->in
d500: 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20  it.busy==0 ){.  
d510: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62    int n;.    Vdb
d520: 65 20 2a 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62  e *v;.    int lb
d530: 6c 31 2c 20 6c 62 6c 32 3b 0a 20 20 20 20 69 6e  l1, lbl2;.    in
d540: 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  t i;.    int add
d550: 72 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  r;..    v = sqli
d560: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
d570: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
d580: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
d590: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
d5a0: 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20  ( pTable!=0 ){. 
d5b0: 20 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e       sqliteBegin
d5c0: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
d5d0: 50 61 72 73 65 2c 20 30 2c 20 69 73 54 65 6d 70  Parse, 0, isTemp
d5e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f  );.      sqliteO
d5f0: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76  penMasterTable(v
d600: 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 7d  , isTemp);.    }
d610: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
d620: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65  ddOp(v, OP_NewRe
d630: 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  cno, 0, 0);.    
d640: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
d650: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
d660: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
d670: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
d680: 31 2c 20 22 69 6e 64 65 78 22 2c 20 50 33 5f 53  1, "index", P3_S
d690: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
d6a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d6b0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
d6c0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
d6d0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
d6e0: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74  Index->zName, st
d6f0: 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e 61  rlen(pIndex->zNa
d700: 6d 65 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  me));.    sqlite
d710: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d720: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
d730: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
d740: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61  ngeP3(v, -1, pTa
d750: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
d760: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56    addr = sqliteV
d770: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
d780: 72 65 61 74 65 49 6e 64 65 78 2c 20 30 2c 20 69  reateIndex, 0, i
d790: 73 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69  sTemp);.    sqli
d7a0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
d7b0: 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 26  , addr, (char*)&
d7c0: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 50 33  pIndex->tnum, P3
d7d0: 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 70  _POINTER);.    p
d7e0: 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 30 3b  Index->tnum = 0;
d7f0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20  .    if( pTable 
d800: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
d810: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
d820: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
d830: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d840: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
d850: 69 73 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20  isTemp, 0);.    
d860: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
d870: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  p(v, OP_OpenWrit
d880: 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  e, 1, 0);.    }.
d890: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
d8a0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
d8b0: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
d8c0: 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 26      if( pStart &
d8d0: 26 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  & pEnd ){.      
d8e0: 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a  n = Addr(pEnd->z
d8f0: 29 20 2d 20 41 64 64 72 28 70 53 74 61 72 74 2d  ) - Addr(pStart-
d900: 3e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73  >z) + 1;.      s
d910: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
d920: 33 28 76 2c 20 61 64 64 72 2c 20 70 53 74 61 72  3(v, addr, pStar
d930: 74 2d 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  t->z, n);.    }.
d940: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d950: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
d960: 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a 20 20 20  cord, 5, 0);.   
d970: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d980: 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79  (v, OP_PutIntKey
d990: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
d9a0: 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20   pTable ){.     
d9b0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d9c0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
d9d0: 70 54 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a 20  pTab->iDb, 0);. 
d9e0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
d9f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  ddOp(v, OP_OpenR
da00: 65 61 64 2c 20 32 2c 20 70 54 61 62 2d 3e 74 6e  ead, 2, pTab->tn
da10: 75 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  um);.      sqlit
da20: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
da30: 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65   -1, pTab->zName
da40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 6c 62 6c 32  , 0);.      lbl2
da50: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
da60: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
da70: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
da80: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 32  (v, OP_Rewind, 2
da90: 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 6c  , lbl2);.      l
daa0: 62 6c 31 20 3d 20 73 71 6c 69 74 65 56 64 62 65  bl1 = sqliteVdbe
dab0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63 6e  AddOp(v, OP_Recn
dac0: 6f 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  o, 2, 0);.      
dad0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65  for(i=0; i<pInde
dae0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
daf0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  {.        int iC
db00: 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43  ol = pIndex->aiC
db10: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
db20: 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65    if( pTab->iPKe
db30: 79 3d 3d 69 43 6f 6c 20 29 7b 0a 20 20 20 20 20  y==iCol ){.     
db40: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
db50: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
db60: 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  i, 0);.        }
db70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
db80: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
db90: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 32 2c  v, OP_Column, 2,
dba0: 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   iCol);.        
dbb0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
dbc0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
dbd0: 76 2c 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79  v, OP_MakeIdxKey
dbe0: 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  , pIndex->nColum
dbf0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  n, 0);.      if(
dc00: 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74   db->file_format
dc10: 3e 3d 34 20 29 20 73 71 6c 69 74 65 41 64 64 49  >=4 ) sqliteAddI
dc20: 64 78 4b 65 79 54 79 70 65 28 76 2c 20 70 49 6e  dxKeyType(v, pIn
dc30: 64 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dex);.      sqli
dc40: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
dc50: 50 5f 49 64 78 50 75 74 2c 20 31 2c 20 70 49 6e  P_IdxPut, 1, pIn
dc60: 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  dex->onError!=OE
dc70: 5f 4e 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73 71  _None);.      sq
dc80: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
dc90: 28 76 2c 20 2d 31 2c 20 22 69 6e 64 65 78 65 64  (v, -1, "indexed
dca0: 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74   columns are not
dcb0: 20 75 6e 69 71 75 65 22 2c 20 50 33 5f 53 54 41   unique", P3_STA
dcc0: 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TIC);.      sqli
dcd0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
dce0: 50 5f 4e 65 78 74 2c 20 32 2c 20 6c 62 6c 31 29  P_Next, 2, lbl1)
dcf0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
dd00: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
dd10: 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 73  , lbl2);.      s
dd20: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
dd30: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 32 2c 20 30  , OP_Close, 2, 0
dd40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
dd50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
dd60: 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  lose, 1, 0);.   
dd70: 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c   }.    if( pTabl
dd80: 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  e!=0 ){.      if
dd90: 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  ( !isTemp ){.   
dda0: 20 20 20 20 20 73 71 6c 69 74 65 43 68 61 6e 67       sqliteChang
ddb0: 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a  eCookie(db, v);.
ddc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
ddd0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
dde0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
ddf0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 6e  ;.      sqliteEn
de00: 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
de10: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
de20: 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75   }..  /* Clean u
de30: 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  p before exiting
de40: 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f   */.exit_create_
de50: 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 49  index:.  sqliteI
de60: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  dListDelete(pLis
de70: 74 29 3b 0a 20 20 73 71 6c 69 74 65 53 72 63 4c  t);.  sqliteSrcL
de80: 69 73 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65  istDelete(pTable
de90: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
dea0: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
deb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
dec0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f  routine will dro
ded0: 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61  p an existing na
dee0: 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73  med index.  This
def0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c   routine.** impl
df00: 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20  ements the DROP 
df10: 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e  INDEX statement.
df20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44  .*/.void sqliteD
df30: 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a  ropIndex(Parse *
df40: 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
df50: 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78  *pName){.  Index
df60: 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65   *pIndex;.  Vdbe
df70: 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64   *v;.  sqlite *d
df80: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
df90: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
dfa0: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
dfb0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
dfc0: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
dfd0: 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
dfe0: 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  ;.  pIndex = sql
dff0: 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  iteFindIndex(db,
e000: 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61   pName->a[0].zNa
e010: 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  me, pName->a[0].
e020: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  zDatabase);.  if
e030: 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20  ( pIndex==0 ){. 
e040: 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
e050: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
e060: 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70  ch index: %S", p
e070: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 67 6f  Name, 0);.    go
e080: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
e090: 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  ex;.  }.  if( pI
e0a0: 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20  ndex->autoIndex 
e0b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72  ){.    sqliteErr
e0c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
e0d0: 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
e0e0: 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20  with UNIQUE ".  
e0f0: 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20      "or PRIMARY 
e100: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  KEY constraint c
e110: 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  annot be dropped
e120: 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ", 0);.    goto 
e130: 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
e140: 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65  .  }.  if( pInde
e150: 78 2d 3e 69 44 62 3e 31 20 29 7b 0a 20 20 20 20  x->iDb>1 ){.    
e160: 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
e170: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 61  Parse, "cannot a
e180: 6c 74 65 72 20 73 63 68 65 6d 61 20 6f 66 20 61  lter schema of a
e190: 74 74 61 63 68 65 64 20 22 0a 20 20 20 20 20 20  ttached ".      
e1a0: 20 22 64 61 74 61 62 61 73 65 73 22 2c 20 30 29   "databases", 0)
e1b0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
e1c0: 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
e1d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e1e0: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
e1f0: 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
e200: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
e210: 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c  _INDEX;.    Tabl
e220: 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
e230: 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f  ->pTable;.    co
e240: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
e250: 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e  db->aDb[pIndex->
e260: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
e270: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
e280: 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
e290: 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20  pIndex->iDb);.  
e2a0: 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68    if( sqliteAuth
e2b0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
e2c0: 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
e2d0: 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  b, 0, zDb) ){.  
e2e0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
e2f0: 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
e300: 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
e310: 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c  iDb ) code = SQL
e320: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
e330: 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
e340: 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61  iteAuthCheck(pPa
e350: 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65  rse, code, pInde
e360: 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  x->zName, pTab->
e370: 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
e380: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
e390: 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
e3a0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
e3b0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
e3c0: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  to remove the in
e3d0: 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65  dex and from the
e3e0: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f   master table */
e3f0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
e400: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
e410: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61  if( v ){.    sta
e420: 74 69 63 20 56 64 62 65 4f 70 20 64 72 6f 70 49  tic VdbeOp dropI
e430: 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  ndex[] = {.     
e440: 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20   { OP_Rewind,   
e450: 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30 7d    0, ADDR(9), 0}
e460: 2c 20 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74  , .      { OP_St
e470: 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20  ring,     0, 0, 
e480: 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a        0}, /* 1 *
e490: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d  /.      { OP_Mem
e4a0: 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20 20  Store,   1, 1,  
e4b0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
e4c0: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20   OP_MemLoad,    
e4d0: 31 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  1, 0,       0}, 
e4e0: 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 3 */.      { 
e4f0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30  OP_Column,     0
e500: 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 1,       0},. 
e510: 20 20 20 20 20 7b 20 4f 50 5f 45 71 2c 20 20 20       { OP_Eq,   
e520: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 38 29        0, ADDR(8)
e530: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
e540: 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20  _Next,       0, 
e550: 41 44 44 52 28 33 29 2c 20 30 7d 2c 0a 20 20 20  ADDR(3), 0},.   
e560: 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20     { OP_Goto,   
e570: 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20      0, ADDR(9), 
e580: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44  0},.      { OP_D
e590: 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c  elete,     0, 0,
e5a0: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 38 20         0}, /* 8 
e5b0: 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  */.    };.    in
e5c0: 74 20 62 61 73 65 3b 0a 0a 20 20 20 20 73 71 6c  t base;..    sql
e5d0: 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65  iteBeginWriteOpe
e5e0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
e5f0: 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a  , pIndex->iDb);.
e600: 20 20 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61      sqliteOpenMa
e610: 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70 49 6e  sterTable(v, pIn
e620: 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 62  dex->iDb);.    b
e630: 61 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ase = sqliteVdbe
e640: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
e650: 61 79 53 69 7a 65 28 64 72 6f 70 49 6e 64 65 78  aySize(dropIndex
e660: 29 2c 20 64 72 6f 70 49 6e 64 65 78 29 3b 0a 20  ), dropIndex);. 
e670: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
e680: 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31 2c  ngeP3(v, base+1,
e690: 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
e6a0: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64  0);.    if( pInd
e6b0: 65 78 2d 3e 69 44 62 3d 3d 30 20 29 7b 0a 20 20  ex->iDb==0 ){.  
e6c0: 20 20 20 20 73 71 6c 69 74 65 43 68 61 6e 67 65      sqliteChange
e6d0: 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a 20  Cookie(db, v);. 
e6e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
e6f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
e700: 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lose, 0, 0);.   
e710: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
e720: 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20  (v, OP_Destroy, 
e730: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 70 49  pIndex->tnum, pI
e740: 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20  ndex->iDb);.    
e750: 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70  sqliteEndWriteOp
e760: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
e770: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
e780: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
e790: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
e7a0: 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a  his index..  */.
e7b0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65    if( !pParse->e
e7c0: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73 71  xplain ){.    sq
e7d0: 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  liteUnlinkAndDel
e7e0: 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  eteIndex(db, pIn
e7f0: 64 65 78 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c  dex);.    db->fl
e800: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
e810: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d  ternChanges;.  }
e820: 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  ..exit_drop_inde
e830: 78 3a 0a 20 20 73 71 6c 69 74 65 53 72 63 4c 69  x:.  sqliteSrcLi
e840: 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b  stDelete(pName);
e850: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
e860: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
e870: 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69  o the given IdLi
e880: 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
e890: 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e  w IdList if.** n
e8a0: 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  eed be..**.** A 
e8b0: 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65  new IdList is re
e8c0: 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
e8d0: 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  if malloc() fail
e8e0: 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71  s..*/.IdList *sq
e8f0: 6c 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e 64  liteIdListAppend
e900: 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
e910: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
e920: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
e930: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
e940: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
e950: 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20  of(IdList) );.  
e960: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
e970: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
e980: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30  List->nAlloc = 0
e990: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
e9a0: 74 2d 3e 6e 49 64 3e 3d 70 4c 69 73 74 2d 3e 6e  t->nId>=pList->n
e9b0: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 73 74 72  Alloc ){.    str
e9c0: 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20  uct IdList_item 
e9d0: 2a 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e  *a;.    pList->n
e9e0: 41 6c 6c 6f 63 20 3d 20 70 4c 69 73 74 2d 3e 6e  Alloc = pList->n
e9f0: 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20 20 20  Alloc*2 + 5;.   
ea00: 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c   a = sqliteReall
ea10: 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69  oc(pList->a, pLi
ea20: 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f  st->nAlloc*sizeo
ea30: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29  f(pList->a[0]) )
ea40: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
ea50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49 64  {.      sqliteId
ea60: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
ea70: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
ea80: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  0;.    }.    pLi
ea90: 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20  st->a = a;.  }. 
eaa0: 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e   memset(&pList->
eab0: 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20 30  a[pList->nId], 0
eac0: 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  , sizeof(pList->
ead0: 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 54  a[0]));.  if( pT
eae0: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  oken ){.    char
eaf0: 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e   **pz = &pList->
eb00: 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e  a[pList->nId].zN
eb10: 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 53  ame;.    sqliteS
eb20: 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 54  etNString(pz, pT
eb30: 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d  oken->z, pToken-
eb40: 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  >n, 0);.    if( 
eb50: 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  *pz==0 ){.      
eb60: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65  sqliteIdListDele
eb70: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  te(pList);.     
eb80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
eb90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
eba0: 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a  teDequote(*pz);.
ebb0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73      }.  }.  pLis
ebc0: 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75  t->nId++;.  retu
ebd0: 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
ebe0: 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
ebf0: 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
ec00: 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e  e given SrcList.
ec10: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53    Create a new S
ec20: 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  rcList if.** nee
ec30: 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74  d be.  A new ent
ec40: 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  ry is created in
ec50: 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65   the SrcList eve
ec60: 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e  n if pToken is N
ec70: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  ULL..**.** A new
ec80: 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75   SrcList is retu
ec90: 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
eca0: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
ecb0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62  .**.** If pDatab
ecc0: 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c  ase is not null,
ecd0: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
ece0: 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20  he table has an 
ecf0: 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61  optional.** data
ed00: 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78  base name prefix
ed10: 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22  .  Like this:  "
ed20: 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e  database.table".
ed30: 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a    The pDatabase.
ed40: 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ** points to the
ed50: 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
ed60: 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74  the pTable point
ed70: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
ed80: 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53  e name..** The S
ed90: 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65  rcList.a[].zName
eda0: 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64   field is filled
edb0: 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
edc0: 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74  name which might
edd0: 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54  .** come from pT
ede0: 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61  able (if pDataba
edf0: 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66  se is NULL) or f
ee00: 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20  rom pDatabase.  
ee10: 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  .** SrcList.a[].
ee20: 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c  zDatabase is fil
ee30: 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  led with the dat
ee40: 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20  abase name from 
ee50: 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69  pTable,.** or wi
ee60: 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61  th NULL if no da
ee70: 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66  tabase is specif
ee80: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74  ied..**.** In ot
ee90: 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61  her words, if ca
eea0: 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ll like this:.**
eeb0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
eec0: 74 65 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  teSrcListAppend(
eed0: 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,0);.**.** Th
eee0: 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20  en B is a table 
eef0: 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
ef00: 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e  abase name is un
ef10: 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63  specified.  If c
ef20: 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68  alled.** like th
ef30: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
ef40: 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41    sqliteSrcListA
ef50: 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a  ppend(A,B,C);.**
ef60: 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68  .** Then C is th
ef70: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
ef80: 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61   B is the databa
ef90: 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c  se name..*/.SrcL
efa0: 69 73 74 20 2a 73 71 6c 69 74 65 53 72 63 4c 69  ist *sqliteSrcLi
efb0: 73 74 41 70 70 65 6e 64 28 53 72 63 4c 69 73 74  stAppend(SrcList
efc0: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
efd0: 70 54 61 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70  pTable, Token *p
efe0: 44 61 74 61 62 61 73 65 29 7b 0a 20 20 69 66 28  Database){.  if(
eff0: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
f000: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d   pList = sqliteM
f010: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53 72  alloc( sizeof(Sr
f020: 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  cList) );.    if
f030: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
f040: 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
f050: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20  ->nAlloc = 1;.  
f060: 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e  }.  if( pList->n
f070: 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c  Src>=pList->nAll
f080: 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  oc ){.    SrcLis
f090: 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69  t *pNew;.    pLi
f0a0: 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b  st->nAlloc *= 2;
f0b0: 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
f0c0: 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c  teRealloc(pList,
f0d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f0e0: 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b  sizeof(*pList) +
f0f0: 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d   (pList->nAlloc-
f100: 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  1)*sizeof(pList-
f110: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  >a[0]) );.    if
f120: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
f130: 20 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74     sqliteSrcList
f140: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
f150: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
f160: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d     }.    pList =
f170: 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 6d 65 6d   pNew;.  }.  mem
f180: 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  set(&pList->a[pL
f190: 69 73 74 2d 3e 6e 53 72 63 5d 2c 20 30 2c 20 73  ist->nSrc], 0, s
f1a0: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
f1b0: 5d 29 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61  ]));.  if( pData
f1c0: 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73  base && pDatabas
f1d0: 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70  e->z==0 ){.    p
f1e0: 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
f1f0: 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  }.  if( pDatabas
f200: 65 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a 20  e && pTable ){. 
f210: 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20     Token *pTemp 
f220: 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20  = pDatabase;.   
f230: 20 70 44 61 74 61 62 61 73 65 20 3d 20 70 54 61   pDatabase = pTa
f240: 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20  ble;.    pTable 
f250: 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 69  = pTemp;.  }.  i
f260: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
f270: 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c   char **pz = &pL
f280: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53  ist->a[pList->nS
f290: 72 63 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73  rc].zName;.    s
f2a0: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
f2b0: 70 7a 2c 20 70 54 61 62 6c 65 2d 3e 7a 2c 20 70  pz, pTable->z, p
f2c0: 54 61 62 6c 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20  Table->n, 0);.  
f2d0: 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a    if( *pz==0 ){.
f2e0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 72 63 4c        sqliteSrcL
f2f0: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
f300: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
f310: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f320: 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65     sqliteDequote
f330: 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (*pz);.    }.  }
f340: 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
f350: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70   ){.    char **p
f360: 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  z = &pList->a[pL
f370: 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a 44 61 74 61  ist->nSrc].zData
f380: 62 61 73 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  base;.    sqlite
f390: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70  SetNString(pz, p
f3a0: 44 61 74 61 62 61 73 65 2d 3e 7a 2c 20 70 44 61  Database->z, pDa
f3b0: 74 61 62 61 73 65 2d 3e 6e 2c 20 30 29 3b 0a 20  tabase->n, 0);. 
f3c0: 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b     if( *pz==0 ){
f3d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 72 63  .      sqliteSrc
f3e0: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
f3f0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
f400: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
f410: 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74      sqliteDequot
f420: 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  e(*pz);.    }.  
f430: 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69  }.  pList->a[pLi
f440: 73 74 2d 3e 6e 53 72 63 5d 2e 69 43 75 72 73 6f  st->nSrc].iCurso
f450: 72 20 3d 20 2d 31 3b 0a 20 20 70 4c 69 73 74 2d  r = -1;.  pList-
f460: 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75 72  >nSrc++;.  retur
f470: 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
f480: 2a 20 41 73 73 69 67 6e 20 63 75 72 73 6f 72 73  * Assign cursors
f490: 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   to all tables i
f4a0: 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76  n a SrcList.*/.v
f4b0: 6f 69 64 20 73 71 6c 69 74 65 53 72 63 4c 69 73  oid sqliteSrcLis
f4c0: 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50  tAssignCursors(P
f4d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
f4e0: 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
f4f0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
f500: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  0; i<pList->nSrc
f510: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
f520: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  pList->a[i].iCur
f530: 73 6f 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  sor<0 ){.      p
f540: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
f550: 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
f560: 62 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  b++;.    }.  }.}
f570: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61  ../*.** Add an a
f580: 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61 73 74  lias to the last
f590: 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 20 74   identifier on t
f5a0: 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74 69 66  he given identif
f5b0: 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ier list..*/.voi
f5c0: 64 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41  d sqliteSrcListA
f5d0: 64 64 41 6c 69 61 73 28 53 72 63 4c 69 73 74 20  ddAlias(SrcList 
f5e0: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
f5f0: 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c  Token){.  if( pL
f600: 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 53  ist && pList->nS
f610: 72 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  rc>0 ){.    int 
f620: 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20  i = pList->nSrc 
f630: 2d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 53  - 1;.    sqliteS
f640: 65 74 4e 53 74 72 69 6e 67 28 26 70 4c 69 73 74  etNString(&pList
f650: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20 70  ->a[i].zAlias, p
f660: 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e  Token->z, pToken
f670: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ->n, 0);.    sql
f680: 69 74 65 44 65 71 75 6f 74 65 28 70 4c 69 73 74  iteDequote(pList
f690: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a  ->a[i].zAlias);.
f6a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
f6b0: 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a  ete an IdList..*
f6c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 49 64 4c  /.void sqliteIdL
f6d0: 69 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74  istDelete(IdList
f6e0: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
f6f0: 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
f700: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
f710: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
f720: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
f730: 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
f740: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
f750: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
f760: 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
f770: 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
f780: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
f790: 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  he index in pLis
f7a0: 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66  t of the identif
f7b0: 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20  ier named zId.  
f7c0: 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
f7d0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e  not found..*/.in
f7e0: 74 20 73 71 6c 69 74 65 49 64 4c 69 73 74 49 6e  t sqliteIdListIn
f7f0: 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  dex(IdList *pLis
f800: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
f810: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
f820: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
f830: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f   return -1;.  fo
f840: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
f850: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nId; i++){.    i
f860: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
f870: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
f880: 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  me, zName)==0 ) 
f890: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
f8a0: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
f8b0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
f8c0: 74 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63  tire SrcList inc
f8d0: 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73  luding all its s
f8e0: 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  ubstructure..*/.
f8f0: 76 6f 69 64 20 73 71 6c 69 74 65 53 72 63 4c 69  void sqliteSrcLi
f900: 73 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74  stDelete(SrcList
f910: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
f920: 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
f930: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
f940: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
f950: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
f960: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
f970: 2d 3e 61 5b 69 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[i].zDatabase
f980: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
f990: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  e(pList->a[i].zN
f9a0: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
f9b0: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Free(pList->a[i]
f9c0: 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66  .zAlias);.    if
f9d0: 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54  ( pList->a[i].pT
f9e0: 61 62 20 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69  ab && pList->a[i
f9f0: 5d 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69  ].pTab->isTransi
fa00: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ent ){.      sql
fa10: 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30  iteDeleteTable(0
fa20: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54  , pList->a[i].pT
fa30: 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ab);.    }.    s
fa40: 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74  qliteSelectDelet
fa50: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53  e(pList->a[i].pS
fa60: 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69  elect);.    sqli
fa70: 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 4c 69  teExprDelete(pLi
fa80: 73 74 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20  st->a[i].pOn);. 
fa90: 20 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44     sqliteIdListD
faa0: 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  elete(pList->a[i
fab0: 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20  ].pUsing);.  }. 
fac0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
fad0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  t);.}../*.** Beg
fae0: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
faf0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 42  .*/.void sqliteB
fb00: 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  eginTransaction(
fb10: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
fb20: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 73  nt onError){.  s
fb30: 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69 66  qlite *db;..  if
fb40: 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
fb50: 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
fb60: 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  0 || db->aDb[0].
fb70: 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBt==0 ) return;
fb80: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
fb90: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
fba0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
fbb0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
fbc0: 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  teAuthCheck(pPar
fbd0: 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
fbe0: 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c  ACTION, "BEGIN",
fbf0: 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
fc00: 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73  .  if( db->flags
fc10: 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e   & SQLITE_InTran
fc20: 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45  s ){.    sqliteE
fc30: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
fc40: 22 63 61 6e 6e 6f 74 20 73 74 61 72 74 20 61 20  "cannot start a 
fc50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 74 68  transaction with
fc60: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
fc70: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
fc80: 20 20 7d 0a 20 20 73 71 6c 69 74 65 42 65 67 69    }.  sqliteBegi
fc90: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
fca0: 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20  pParse, 0, 0);. 
fcb0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
fcc0: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20  LITE_InTrans;.  
fcd0: 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e  db->onError = on
fce0: 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Error;.}../*.** 
fcf0: 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63  Commit a transac
fd00: 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
fd10: 69 74 65 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63  iteCommitTransac
fd20: 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
fd30: 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  se){.  sqlite *d
fd40: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
fd50: 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
fd60: 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
fd70: 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
fd80: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
fd90: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
fda0: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
fdb0: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
fdc0: 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68  if( sqliteAuthCh
fdd0: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
fde0: 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
fdf0: 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20  "COMMIT", 0, 0) 
fe00: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
fe10: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
fe20: 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20  ITE_InTrans)==0 
fe30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72  ){.    sqliteErr
fe40: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
fe50: 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 2d 20 6e  annot commit - n
fe60: 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  o transaction is
fe70: 20 61 63 74 69 76 65 22 29 3b 0a 20 20 20 20 72   active");.    r
fe80: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 64 62 2d  eturn;.  }.  db-
fe90: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
fea0: 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 73 71 6c  E_InTrans;.  sql
feb0: 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61  iteEndWriteOpera
fec0: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
fed0: 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45  db->onError = OE
fee0: 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  _Default;.}../*.
fef0: 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72  ** Rollback a tr
ff00: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
ff10: 64 20 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63 6b  d sqliteRollback
ff20: 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
ff30: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
ff40: 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65  lite *db;.  Vdbe
ff50: 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72   *v;..  if( pPar
ff60: 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61  se==0 || (db=pPa
ff70: 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64  rse->db)==0 || d
ff80: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
ff90: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
ffa0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
ffb0: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
ffc0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
ffd0: 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68    if( sqliteAuth
ffe0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
fff0: 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
10000 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c  , "ROLLBACK", 0,
10010 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   0) ) return;.  
10020 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
10030 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29   SQLITE_InTrans)
10040 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
10050 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
10060 2c 20 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62 61  , "cannot rollba
10070 63 6b 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74  ck - no transact
10080 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 29 3b  ion is active");
10090 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 0a 20 20  .    return; .  
100a0 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  }.  v = sqliteGe
100b0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
100c0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
100d0 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
100e0 20 4f 50 5f 52 6f 6c 6c 62 61 63 6b 2c 20 30 2c   OP_Rollback, 0,
100f0 20 30 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66   0);.  }.  db->f
10100 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
10110 49 6e 54 72 61 6e 73 3b 0a 20 20 64 62 2d 3e 6f  InTrans;.  db->o
10120 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61  nError = OE_Defa
10130 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ult;.}../*.** Ge
10140 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
10150 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69 66   that will verif
10160 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
10170 6b 69 65 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 6e  kie for all.** n
10180 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  amed database fi
10190 6c 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  les..*/.void sql
101a0 69 74 65 43 6f 64 65 56 65 72 69 66 79 53 63 68  iteCodeVerifySch
101b0 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
101c0 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73  e, int iDb){.  s
101d0 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
101e0 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
101f0 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
10200 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
10210 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
10220 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
10230 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
10240 69 44 62 5d 2e 70 42 74 21 3d 30 20 29 3b 0a 20  iDb].pBt!=0 );. 
10250 20 69 66 28 20 69 44 62 21 3d 31 20 26 26 20 21   if( iDb!=1 && !
10260 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
10270 2c 20 69 44 62 2c 20 44 42 5f 43 6f 6f 6b 69 65  , iDb, DB_Cookie
10280 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  ) ){.    sqliteV
10290 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56  dbeAddOp(v, OP_V
102a0 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69 44 62  erifyCookie, iDb
102b0 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73  , db->aDb[iDb].s
102c0 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 29 3b 0a 20  chema_cookie);. 
102d0 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79     DbSetProperty
102e0 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 43 6f 6f  (db, iDb, DB_Coo
102f0 6b 69 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  kie);.  }.}../*.
10300 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
10310 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61   code that prepa
10320 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e  res for doing an
10330 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a   operation that.
10340 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
10350 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
10360 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10370 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72   starts a new tr
10380 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20  ansaction if we 
10390 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  are not already 
103a0 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e  within.** a tran
103b0 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20  saction.  If we 
103c0 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68  are already with
103d0 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
103e0 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f  , then a checkpo
103f0 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66  int.** is set if
10400 20 74 68 65 20 73 65 74 43 68 65 63 6b 70 6f 69   the setCheckpoi
10410 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
10420 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f  true.  A checkpo
10430 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  int should.** be
10440 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69   set for operati
10450 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66  ons that might f
10460 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f  ail (due to a co
10470 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f  nstraint) part o
10480 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72  f.** the way thr
10490 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77  ough and which w
104a0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f  ill need to undo
104b0 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74   some writes wit
104c0 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a  hout having to.*
104d0 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77  * rollback the w
104e0 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  hole transaction
104f0 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e  .  For operation
10500 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73  s where all cons
10510 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62  traints.** can b
10520 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65  e checked before
10530 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65   any changes are
10540 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
10550 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76  abase, it is nev
10560 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20  er.** necessary 
10570 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20  to undo a write 
10580 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69  and the checkpoi
10590 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  nt should not be
105a0 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79   set..**.** Only
105b0 20 64 61 74 61 62 61 73 65 20 69 44 62 20 61 6e   database iDb an
105c0 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  d the temp datab
105d0 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69  ase are made wri
105e0 74 61 62 6c 65 20 62 79 20 74 68 69 73 20 63 61  table by this ca
105f0 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30  ll..** If iDb==0
10600 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20  , then the main 
10610 61 6e 64 20 74 65 6d 70 20 64 61 74 61 62 61 73  and temp databas
10620 65 73 20 61 72 65 20 6d 61 64 65 20 77 72 69 74  es are made writ
10630 61 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44  able.   If.** iD
10640 62 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74  b==1 then only t
10650 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
10660 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c   is made writabl
10670 65 2e 20 20 49 66 20 69 44 62 3e 31 20 74 68 65  e.  If iDb>1 the
10680 6e 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  n the.** specifi
10690 65 64 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ed auxiliary dat
106a0 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 74 65  abase and the te
106b0 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20  mp database are 
106c0 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a  made writable..*
106d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 42 65 67  /.void sqliteBeg
106e0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
106f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10700 69 6e 74 20 73 65 74 43 68 65 63 6b 70 6f 69 6e  int setCheckpoin
10710 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56  t, int iDb){.  V
10720 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
10730 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
10740 62 3b 0a 20 20 69 66 28 20 44 62 48 61 73 50 72  b;.  if( DbHasPr
10750 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20  operty(db, iDb, 
10760 44 42 5f 4c 6f 63 6b 65 64 29 20 29 20 72 65 74  DB_Locked) ) ret
10770 75 72 6e 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74  urn;.  v = sqlit
10780 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
10790 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
107a0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 64 62  eturn;.  if( !db
107b0 2d 3e 61 44 62 5b 69 44 62 5d 2e 69 6e 54 72 61  ->aDb[iDb].inTra
107c0 6e 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ns ){.    sqlite
107d0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
107e0 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62  Transaction, iDb
107f0 2c 20 30 29 3b 0a 20 20 20 20 44 62 53 65 74 50  , 0);.    DbSetP
10800 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c  roperty(db, iDb,
10810 20 44 42 5f 4c 6f 63 6b 65 64 29 3b 0a 20 20 20   DB_Locked);.   
10820 20 73 71 6c 69 74 65 43 6f 64 65 56 65 72 69 66   sqliteCodeVerif
10830 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
10840 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 69 44  iDb);.    if( iD
10850 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  b!=1 ){.      sq
10860 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70  liteBeginWriteOp
10870 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
10880 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 2c 20 31  setCheckpoint, 1
10890 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
108a0 20 69 66 28 20 73 65 74 43 68 65 63 6b 70 6f 69   if( setCheckpoi
108b0 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nt ){.    sqlite
108c0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
108d0 43 68 65 63 6b 70 6f 69 6e 74 2c 20 69 44 62 2c  Checkpoint, iDb,
108e0 20 30 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72   0);.    DbSetPr
108f0 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20  operty(db, iDb, 
10900 44 42 5f 4c 6f 63 6b 65 64 29 3b 0a 20 20 7d 0a  DB_Locked);.  }.
10910 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
10920 65 20 63 6f 64 65 20 74 68 61 74 20 63 6f 6e 63  e code that conc
10930 6c 75 64 65 73 20 61 6e 20 6f 70 65 72 61 74 69  ludes an operati
10940 6f 6e 20 74 68 61 74 20 6d 61 79 20 68 61 76 65  on that may have
10950 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 68 65 20   changed.** the 
10960 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 61 20  database.  If a 
10970 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
10980 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65  ction was starte
10990 64 2c 20 74 68 65 6e 20 65 6d 69 74 0a 2a 2a 20  d, then emit.** 
109a0 61 6e 20 4f 50 5f 43 6f 6d 6d 69 74 20 74 68 61  an OP_Commit tha
109b0 74 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65  t will cause the
109c0 20 63 68 61 6e 67 65 73 20 74 6f 20 62 65 20 63   changes to be c
109d0 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
109e0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
109f0 74 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 61 72  t checkpoints ar
10a00 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
10a10 63 6f 6d 6d 69 74 74 65 64 20 61 74 20 74 68 65  committed at the
10a20 20 65 6e 64 20 6f 66 0a 2a 2a 20 61 20 73 74 61   end of.** a sta
10a30 74 65 6d 65 6e 74 2e 20 20 4e 6f 74 65 20 61 6c  tement.  Note al
10a40 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 63 61  so that there ca
10a50 6e 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 63 61  n be multiple ca
10a60 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74  lls to .** sqlit
10a70 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  eBeginWriteOpera
10a80 74 69 6f 6e 28 29 20 62 75 74 20 74 68 65 72 65  tion() but there
10a90 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
10aa0 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 63 61 6c 6c  a single.** call
10ab0 20 74 6f 20 73 71 6c 69 74 65 45 6e 64 57 72 69   to sqliteEndWri
10ac0 74 65 4f 70 65 72 61 74 69 6f 6e 28 29 20 61 74  teOperation() at
10ad0 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
10ae0 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
10af0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10b00 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
10b10 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
10b20 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  {.  Vdbe *v;.  s
10b30 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
10b40 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50  se->db;.  if( pP
10b50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20  arse->trigStack 
10b60 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 69 66 20  ) return; /* if 
10b70 74 68 69 73 20 69 73 20 69 6e 20 61 20 74 72 69  this is in a tri
10b80 67 67 65 72 20 2a 2f 0a 20 20 76 20 3d 20 73 71  gger */.  v = sq
10b90 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
10ba0 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
10bb0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
10bc0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
10bd0 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20  TE_InTrans ){.  
10be0 20 20 2f 2a 20 41 20 42 45 47 49 4e 20 68 61 73    /* A BEGIN has
10bf0 20 65 78 65 63 75 74 65 64 2e 20 20 44 6f 20 6e   executed.  Do n
10c00 6f 74 20 63 6f 6d 6d 69 74 20 75 6e 74 69 6c 20  ot commit until 
10c10 77 65 20 73 65 65 20 61 6e 20 65 78 70 6c 69 63  we see an explic
10c20 69 74 0a 20 20 20 20 2a 2a 20 43 4f 4d 4d 49 54  it.    ** COMMIT
10c30 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20   statement. */. 
10c40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
10c50 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
10c60 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b  P_Commit, 0, 0);
10c70 0a 20 20 7d 0a 7d 0a                             .  }.}.