/ Hex Artifact Content
Login

Artifact f6ef61a2b9524f5d1fd66a500747b6a5c114dd0f:


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 31 20 32 30 30 34 2f 30 32 2f 32 31 20 31  171 2004/02/21 1
0300: 33 3a 33 31 3a 31 30 20 64 72 68 20 45 78 70 20  3:31:10 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 4c 69 73 74  tatic VdbeOpList
9890: 20 64 72 6f 70 54 61 62 6c 65 5b 5d 20 3d 20 7b   dropTable[] = {
98a0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69  .      { OP_Rewi
98b0: 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28  nd,     0, ADDR(
98c0: 38 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b  8),  0},.      {
98d0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20   OP_String,     
98e0: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
98f0: 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 1 */.      {
9900: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20   OP_MemStore,   
9910: 31 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 1,        0},
9920: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c  .      { OP_MemL
9930: 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20  oad,    1, 0,   
9940: 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f       0}, /* 3 */
9950: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
9960: 6d 6e 2c 20 20 20 20 20 30 2c 20 32 2c 20 20 20  mn,     0, 2,   
9970: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
9980: 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20   OP_Ne,         
9990: 30 2c 20 41 44 44 52 28 37 29 2c 20 20 30 7d 2c  0, ADDR(7),  0},
99a0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65  .      { OP_Dele
99b0: 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  te,     0, 0,   
99c0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
99d0: 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20   OP_Next,       
99e0: 30 2c 20 41 44 44 52 28 33 29 2c 20 20 30 7d 2c  0, ADDR(3),  0},
99f0: 20 2f 2a 20 37 20 2a 2f 0a 20 20 20 20 7d 3b 0a   /* 7 */.    };.
9a00: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
9a10: 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54  .    Trigger *pT
9a20: 72 69 67 67 65 72 3b 0a 20 20 20 20 73 71 6c 69  rigger;.    sqli
9a30: 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  teBeginWriteOper
9a40: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
9a50: 20 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 0a   pTable->iDb);..
9a60: 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20      /* Drop all 
9a70: 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61  triggers associa
9a80: 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
9a90: 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
9aa0: 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72   */.    pTrigger
9ab0: 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54 72 69 67   = pTable->pTrig
9ac0: 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ger;.    while( 
9ad0: 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  pTrigger ){.    
9ae0: 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
9af0: 65 72 2d 3e 69 44 62 3d 3d 70 54 61 62 6c 65 2d  er->iDb==pTable-
9b00: 3e 69 44 62 20 7c 7c 20 70 54 72 69 67 67 65 72  >iDb || pTrigger
9b10: 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20  ->iDb==1 );.    
9b20: 20 20 73 71 6c 69 74 65 44 72 6f 70 54 72 69 67    sqliteDropTrig
9b30: 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70  gerPtr(pParse, p
9b40: 54 72 69 67 67 65 72 2c 20 31 29 3b 0a 20 20 20  Trigger, 1);.   
9b50: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65     if( pParse->e
9b60: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20  xplain ){.      
9b70: 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72    pTrigger = pTr
9b80: 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  igger->pNext;.  
9b90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9ba0: 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
9bb0: 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72 3b 0a  able->pTrigger;.
9bc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
9bd0: 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53     /* Drop all S
9be0: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 65 6e 74  QLITE_MASTER ent
9bf0: 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20  ries that refer 
9c00: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  to the table */.
9c10: 20 20 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61      sqliteOpenMa
9c20: 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70 54 61  sterTable(v, pTa
9c30: 62 6c 65 2d 3e 69 44 62 29 3b 0a 20 20 20 20 62  ble->iDb);.    b
9c40: 61 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ase = sqliteVdbe
9c50: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
9c60: 61 79 53 69 7a 65 28 64 72 6f 70 54 61 62 6c 65  aySize(dropTable
9c70: 29 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a 20  ), dropTable);. 
9c80: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
9c90: 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31 2c  ngeP3(v, base+1,
9ca0: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20   pTable->zName, 
9cb0: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70  0);..    /* Drop
9cc0: 20 61 6c 6c 20 53 51 4c 49 54 45 5f 54 45 4d 50   all SQLITE_TEMP
9cd0: 5f 4d 41 53 54 45 52 20 65 6e 74 72 69 65 73 20  _MASTER entries 
9ce0: 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
9cf0: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  e table */.    i
9d00: 66 28 20 70 54 61 62 6c 65 2d 3e 69 44 62 21 3d  f( pTable->iDb!=
9d10: 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
9d20: 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  eOpenMasterTable
9d30: 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 61  (v, 1);.      ba
9d40: 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  se = sqliteVdbeA
9d50: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
9d60: 79 53 69 7a 65 28 64 72 6f 70 54 61 62 6c 65 29  ySize(dropTable)
9d70: 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a 20 20  , dropTable);.  
9d80: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
9d90: 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31  angeP3(v, base+1
9da0: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c  , pTable->zName,
9db0: 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   0);.    }..    
9dc0: 69 66 28 20 70 54 61 62 6c 65 2d 3e 69 44 62 3d  if( pTable->iDb=
9dd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
9de0: 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  teChangeCookie(d
9df0: 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  b, v);.    }.   
9e00: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
9e10: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
9e20: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73   0);.    if( !is
9e30: 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 73 71  View ){.      sq
9e40: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
9e50: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 54 61   OP_Destroy, pTa
9e60: 62 6c 65 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 6c  ble->tnum, pTabl
9e70: 65 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 66  e->iDb);.      f
9e80: 6f 72 28 70 49 64 78 3d 70 54 61 62 6c 65 2d 3e  or(pIdx=pTable->
9e90: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
9ea0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
9eb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
9ec0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
9ed0: 65 73 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e  estroy, pIdx->tn
9ee0: 75 6d 2c 20 70 49 64 78 2d 3e 69 44 62 29 3b 0a  um, pIdx->iDb);.
9ef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9f00: 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65    sqliteEndWrite
9f10: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
9f20: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
9f30: 65 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ete the in-memor
9f40: 79 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  y description of
9f50: 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2a   the table..  **
9f60: 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a  .  ** Exception:
9f70: 20 69 66 20 74 68 65 20 53 51 4c 20 73 74 61 74   if the SQL stat
9f80: 65 6d 65 6e 74 20 62 65 67 61 6e 20 77 69 74 68  ement began with
9f90: 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79   the EXPLAIN key
9fa0: 77 6f 72 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  word,.  ** then 
9fb0: 6e 6f 20 63 68 61 6e 67 65 73 20 73 68 6f 75 6c  no changes shoul
9fc0: 64 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a  d be made..  */.
9fd0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65    if( !pParse->e
9fe0: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73 71  xplain ){.    sq
9ff0: 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  liteUnlinkAndDel
a000: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61  eteTable(db, pTa
a010: 62 6c 65 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c  ble);.    db->fl
a020: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
a030: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d  ternChanges;.  }
a040: 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  .  sqliteViewRes
a050: 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a  etAll(db, iDb);.
a060: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
a070: 75 74 69 6e 65 20 63 6f 6e 73 74 72 75 63 74 73  utine constructs
a080: 20 61 20 50 33 20 73 74 72 69 6e 67 20 73 75 69   a P3 string sui
a090: 74 61 62 6c 65 20 66 6f 72 20 61 6e 20 4f 50 5f  table for an OP_
a0a0: 4d 61 6b 65 49 64 78 4b 65 79 0a 2a 2a 20 6f 70  MakeIdxKey.** op
a0b0: 63 6f 64 65 20 61 6e 64 20 61 64 64 73 20 74 68  code and adds th
a0c0: 61 74 20 50 33 20 73 74 72 69 6e 67 20 74 6f 20  at P3 string to 
a0d0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
a0e0: 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72  y inserted instr
a0f0: 75 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65  uction.** in the
a100: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
a110: 2e 20 20 54 68 65 20 50 33 20 73 74 72 69 6e 67  .  The P3 string
a120: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
a130: 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72 0a  ingle character.
a140: 2a 2a 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ** for each colu
a150: 6d 6e 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  mn in the index 
a160: 70 49 64 78 20 6f 66 20 74 61 62 6c 65 20 70 54  pIdx of table pT
a170: 61 62 2e 20 20 49 66 20 74 68 65 20 63 6f 6c 75  ab.  If the colu
a180: 6d 6e 20 75 73 65 73 0a 2a 2a 20 61 20 6e 75 6d  mn uses.** a num
a190: 65 72 69 63 20 73 6f 72 74 20 6f 72 64 65 72 2c  eric sort order,
a1a0: 20 74 68 65 6e 20 74 68 65 20 50 33 20 73 74 72   then the P3 str
a1b0: 69 6e 67 20 63 68 61 72 61 63 74 65 72 20 63 6f  ing character co
a1c0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0a 2a  rresponding to.*
a1d0: 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 73  * that column is
a1e0: 20 27 6e 27 2e 20 20 49 66 20 74 68 65 20 63 6f   'n'.  If the co
a1f0: 6c 75 6d 6e 20 75 73 65 73 20 61 20 74 65 78 74  lumn uses a text
a200: 20 73 6f 72 74 20 6f 72 64 65 72 2c 20 74 68 65   sort order, the
a210: 6e 20 74 68 65 0a 2a 2a 20 50 33 20 73 74 72 69  n the.** P3 stri
a220: 6e 67 20 69 73 20 27 74 27 2e 20 20 53 65 65 20  ng is 't'.  See 
a230: 74 68 65 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65  the OP_MakeIdxKe
a240: 79 20 6f 70 63 6f 64 65 20 64 6f 63 75 6d 65 6e  y opcode documen
a250: 74 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 64  tation for.** ad
a260: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
a270: 74 69 6f 6e 2e 20 20 53 65 65 20 61 6c 73 6f 20  tion.  See also 
a280: 74 68 65 20 73 71 6c 69 74 65 41 64 64 4b 65 79  the sqliteAddKey
a290: 54 79 70 65 28 29 20 72 6f 75 74 69 6e 65 2e 0a  Type() routine..
a2a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64  */.void sqliteAd
a2b0: 64 49 64 78 4b 65 79 54 79 70 65 28 56 64 62 65  dIdxKeyType(Vdbe
a2c0: 20 2a 76 2c 20 49 6e 64 65 78 20 2a 70 49 64 78   *v, Index *pIdx
a2d0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65  ){.  char *zType
a2e0: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
a2f0: 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61  .  int i, n;.  a
a300: 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 26  ssert( pIdx!=0 &
a310: 26 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 21 3d  & pIdx->pTable!=
a320: 30 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 70 49  0 );.  pTab = pI
a330: 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 6e 20  dx->pTable;.  n 
a340: 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  = pIdx->nColumn;
a350: 0a 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74  .  zType = sqlit
a360: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 2b 31 20  eMallocRaw( n+1 
a370: 29 3b 0a 20 20 69 66 28 20 7a 54 79 70 65 3d 3d  );.  if( zType==
a380: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
a390: 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
a3a0: 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  {.    int iCol =
a3b0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
a3c0: 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
a3d0: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
a3e0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
a3f0: 20 20 69 66 28 20 28 70 54 61 62 2d 3e 61 43 6f    if( (pTab->aCo
a400: 6c 5b 69 43 6f 6c 5d 2e 73 6f 72 74 4f 72 64 65  l[iCol].sortOrde
a410: 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f 54 59  r & SQLITE_SO_TY
a420: 50 45 4d 41 53 4b 29 3d 3d 53 51 4c 49 54 45 5f  PEMASK)==SQLITE_
a430: 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  SO_TEXT ){.     
a440: 20 7a 54 79 70 65 5b 69 5d 20 3d 20 27 74 27 3b   zType[i] = 't';
a450: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a460: 20 20 7a 54 79 70 65 5b 69 5d 20 3d 20 27 6e 27    zType[i] = 'n'
a470: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 54  ;.    }.  }.  zT
a480: 79 70 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 73 71  ype[n] = 0;.  sq
a490: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
a4a0: 28 76 2c 20 2d 31 2c 20 7a 54 79 70 65 2c 20 6e  (v, -1, zType, n
a4b0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
a4c0: 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zType);.}../*.**
a4d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
a4e0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
a4f0: 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20  e a new foreign 
a500: 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  key on the table
a510: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
a520: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
a530: 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65  .  pFromCol dete
a540: 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c  rmines which col
a550: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63  umns.** in the c
a560: 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69  urrent table poi
a570: 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67  nt to the foreig
a580: 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d  n key.  If pFrom
a590: 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63  Col==0 then.** c
a5a0: 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74  onnect the key t
a5b0: 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  o the last colum
a5c0: 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f  n inserted.  pTo
a5d0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a   is the name of.
a5e0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66  ** the table ref
a5f0: 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f  erred to.  pToCo
a600: 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74  l is a list of t
a610: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68  ables in the oth
a620: 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20  er.** pTo table 
a630: 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e  that the foreign
a640: 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20   key points to. 
a650: 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20   flags contains 
a660: 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  all.** informati
a670: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  on about the con
a680: 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
a690: 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63   algorithms spec
a6a0: 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  ified.** in the 
a6b0: 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50  ON DELETE, ON UP
a6c0: 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45  DATE and ON INSE
a6d0: 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  RT clauses..**.*
a6e0: 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74  * An FKey struct
a6f0: 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61  ure is created a
a700: 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
a710: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a  table currently.
a720: 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ** under constru
a730: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61  ction in the pPa
a740: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66  rse->pNewTable f
a750: 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20 46  ield.  The new F
a760: 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69  Key.** is not li
a770: 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46  nked into db->aF
a780: 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e  Key at this poin
a790: 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  t - that does no
a7a0: 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69  t happen.** unti
a7b0: 6c 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65  l sqliteEndTable
a7c0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ()..**.** The fo
a7d0: 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74  reign key is set
a7e0: 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70   for IMMEDIATE p
a7f0: 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75  rocessing.  A su
a800: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a  bsequent call.**
a810: 20 74 6f 20 73 71 6c 69 74 65 44 65 66 65 72 46   to sqliteDeferF
a820: 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68  oreignKey() migh
a830: 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f  t change this to
a840: 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f   DEFERRED..*/.vo
a850: 69 64 20 73 71 6c 69 74 65 43 72 65 61 74 65 46  id sqliteCreateF
a860: 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72  oreignKey(.  Par
a870: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
a880: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
a890: 74 65 78 74 20 2a 2f 0a 20 20 49 64 4c 69 73 74  text */.  IdList
a8a0: 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 20 20 2f   *pFromCol,    /
a8b0: 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69  * Columns in thi
a8c0: 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69  s table that poi
a8d0: 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c  nt to other tabl
a8e0: 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  e */.  Token *pT
a8f0: 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  o,          /* N
a900: 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72  ame of the other
a910: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 64 4c 69   table */.  IdLi
a920: 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 20  st *pToCol,     
a930: 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
a940: 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
a950: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
a960: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
a970: 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
a980: 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29  algorithms. */.)
a990: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70  {.  Table *p = p
a9a0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
a9b0: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
a9c0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43   int i;.  int nC
a9d0: 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  ol;.  char *z;. 
a9e0: 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30   FKey *pFKey = 0
a9f0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  ;..  assert( pTo
aa00: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
aa10: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
aa20: 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  r ) goto fk_end;
aa30: 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
aa40: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  =0 ){.    int iC
aa50: 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  ol = p->nCol-1;.
aa60: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
aa70: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
aa80: 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20    if( pToCol && 
aa90: 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 31 20 29  pToCol->nId!=1 )
aaa0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  {.      sqliteSe
aab0: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
aac0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 66 6f 72 65  ->zErrMsg, "fore
aad0: 69 67 6e 20 6b 65 79 20 6f 6e 20 22 2c 20 2d 31  ign key on ", -1
aae0: 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43  ,.         p->aC
aaf0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20  ol[iCol].zName, 
ab00: 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 22 20  -1, .         " 
ab10: 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65  should reference
ab20: 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e   only one column
ab30: 20 6f 66 20 74 61 62 6c 65 20 22 2c 20 2d 31 2c   of table ", -1,
ab40: 0a 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 7a  .         pTo->z
ab50: 2c 20 70 54 6f 2d 3e 6e 2c 20 30 29 3b 0a 20 20  , pTo->n, 0);.  
ab60: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
ab70: 2b 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  ++;.      goto f
ab80: 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  k_end;.    }.   
ab90: 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c   nCol = 1;.  }el
aba0: 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26  se if( pToCol &&
abb0: 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 70 46   pToCol->nId!=pF
abc0: 72 6f 6d 43 6f 6c 2d 3e 6e 49 64 20 29 7b 0a 20  romCol->nId ){. 
abd0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
abe0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
abf0: 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 22 6e  Msg, .        "n
ac00: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
ac10: 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
ac20: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
ac30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20  he number of ". 
ac40: 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20         "columns 
ac50: 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  in the reference
ac60: 64 20 74 61 62 6c 65 22 2c 20 28 63 68 61 72 2a  d table", (char*
ac70: 29 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  )0);.    pParse-
ac80: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
ac90: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73  o fk_end;.  }els
aca0: 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46  e{.    nCol = pF
acb0: 72 6f 6d 43 6f 6c 2d 3e 6e 49 64 3b 0a 20 20 7d  romCol->nId;.  }
acc0: 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
acd0: 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c  f(*pFKey) + nCol
ace0: 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61  *sizeof(pFKey->a
acf0: 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e  Col[0]) + pTo->n
ad00: 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43   + 1;.  if( pToC
ad10: 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
ad20: 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 49 64  0; i<pToCol->nId
ad30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42  ; i++){.      nB
ad40: 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54  yte += strlen(pT
ad50: 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
ad60: 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) + 1;.    }.  }
ad70: 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74  .  pFKey = sqlit
ad80: 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29  eMalloc( nByte )
ad90: 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30  ;.  if( pFKey==0
ada0: 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
adb0: 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d    pFKey->pFrom =
adc0: 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65   p;.  pFKey->pNe
add0: 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65  xtFrom = p->pFKe
ade0: 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29  y;.  z = (char*)
adf0: 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b  &pFKey[1];.  pFK
ae00: 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75  ey->aCol = (stru
ae10: 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20  ct sColMap*)z;. 
ae20: 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72   z += sizeof(str
ae30: 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f  uct sColMap)*nCo
ae40: 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20  l;.  pFKey->zTo 
ae50: 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c  = z;.  memcpy(z,
ae60: 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29   pTo->z, pTo->n)
ae70: 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20  ;.  z[pTo->n] = 
ae80: 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e  0;.  z += pTo->n
ae90: 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65  +1;.  pFKey->pNe
aea0: 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65  xtTo = 0;.  pFKe
aeb0: 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a  y->nCol = nCol;.
aec0: 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
aed0: 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e  0 ){.    pFKey->
aee0: 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[0].iFrom = 
aef0: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c  p->nCol-1;.  }el
af00: 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  se{.    for(i=0;
af10: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
af20: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
af30: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
af40: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
af50: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
af60: 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d  rICmp(p->aCol[j]
af70: 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c  .zName, pFromCol
af80: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
af90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
afa0: 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72  Key->aCol[i].iFr
afb0: 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  om = j;.        
afc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
afd0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
afe0: 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20   if( j>=p->nCol 
aff0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b000: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
b010: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e  se->zErrMsg, "un
b020: 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 22  known column \""
b030: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  , .          pFr
b040: 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
b050: 65 2c 20 22 5c 22 20 69 6e 20 66 6f 72 65 69 67  e, "\" in foreig
b060: 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
b070: 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ", (char*)0);.  
b080: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
b090: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f  rr++;.        go
b0a0: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20  to fk_end;.     
b0b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
b0c0: 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
b0d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
b0e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
b0f0: 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 6f  t n = strlen(pTo
b100: 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
b110: 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61  ;.      pFKey->a
b120: 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b  Col[i].zCol = z;
b130: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c  .      memcpy(z,
b140: 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e   pToCol->a[i].zN
b150: 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a  ame, n);.      z
b160: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a  [n] = 0;.      z
b170: 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20   += n+1;.    }. 
b180: 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65   }.  pFKey->isDe
b190: 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46  ferred = 0;.  pF
b1a0: 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20  Key->deleteConf 
b1b0: 3d 20 66 6c 61 67 73 20 26 20 30 78 66 66 3b 0a  = flags & 0xff;.
b1c0: 20 20 70 46 4b 65 79 2d 3e 75 70 64 61 74 65 43    pFKey->updateC
b1d0: 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20  onf = (flags >> 
b1e0: 38 20 29 20 26 20 30 78 66 66 3b 0a 20 20 70 46  8 ) & 0xff;.  pF
b1f0: 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66 20  Key->insertConf 
b200: 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31 36 20 29  = (flags >> 16 )
b210: 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c   & 0xff;..  /* L
b220: 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20  ink the foreign 
b230: 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65  key to the table
b240: 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65   as the last ste
b250: 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b  p..  */.  p->pFK
b260: 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46  ey = pFKey;.  pF
b270: 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64  Key = 0;..fk_end
b280: 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  :.  sqliteFree(p
b290: 46 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 49  FKey);.  sqliteI
b2a0: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 46 72 6f  dListDelete(pFro
b2b0: 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 49  mCol);.  sqliteI
b2c0: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 54 6f 43  dListDelete(pToC
b2d0: 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ol);.}../*.** Th
b2e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
b2f0: 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49  lled when an INI
b300: 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
b310: 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45   or INITIALLY DE
b320: 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65  FERRED.** clause
b330: 20 69 73 20 73 65 65 6e 20 61 73 20 70 61 72 74   is seen as part
b340: 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65   of a foreign ke
b350: 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54  y definition.  T
b360: 68 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a  he isDeferred.**
b370: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 31 20   parameter is 1 
b380: 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45  for INITIALLY DE
b390: 46 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72  FERRED and 0 for
b3a0: 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
b3b0: 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68  IATE..** The beh
b3c0: 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73  avior of the mos
b3d0: 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74  t recently creat
b3e0: 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  ed foreign key i
b3f0: 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63  s adjusted.** ac
b400: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f  cordingly..*/.vo
b410: 69 64 20 73 71 6c 69 74 65 44 65 66 65 72 46 6f  id sqliteDeferFo
b420: 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a  reignKey(Parse *
b430: 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65  pParse, int isDe
b440: 66 65 72 72 65 64 29 7b 0a 20 20 54 61 62 6c 65  ferred){.  Table
b450: 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a   *pTab;.  FKey *
b460: 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54  pFKey;.  if( (pT
b470: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
b480: 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70  wTable)==0 || (p
b490: 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b  FKey = pTab->pFK
b4a0: 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ey)==0 ) return;
b4b0: 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65  .  pFKey->isDefe
b4c0: 72 72 65 64 20 3d 20 69 73 44 65 66 65 72 72 65  rred = isDeferre
b4d0: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  d;.}../*.** Crea
b4e0: 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66  te a new index f
b4f0: 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e  or an SQL table.
b500: 20 20 70 49 6e 64 65 78 20 69 73 20 74 68 65 20    pIndex is the 
b510: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
b520: 78 20 0a 2a 2a 20 61 6e 64 20 70 54 61 62 6c 65  x .** and pTable
b530: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
b540: 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
b550: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
b560: 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20    Both will .** 
b570: 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72  be NULL for a pr
b580: 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20  imary key or an 
b590: 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72  index that is cr
b5a0: 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79  eated to satisfy
b5b0: 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e   a.** UNIQUE con
b5c0: 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61  straint.  If pTa
b5d0: 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61  ble and pIndex a
b5e0: 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61  re NULL, use pPa
b5f0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a  rse->pNewTable.*
b600: 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74  * as the table t
b610: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
b620: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
b630: 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74   is a table that
b640: 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79   is.** currently
b650: 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
b660: 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54  ed by a CREATE T
b670: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
b680: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61  **.** pList is a
b690: 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
b6a0: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
b6b0: 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e   pList will be N
b6c0: 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ULL if this.** i
b6d0: 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  s a primary key 
b6e0: 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72  or unique-constr
b6f0: 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74  aint on the most
b700: 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61   recent column a
b710: 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74  dded.** to the t
b720: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
b730: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
b740: 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  n.  .*/.void sql
b750: 69 74 65 43 72 65 61 74 65 49 6e 64 65 78 28 0a  iteCreateIndex(.
b760: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
b770: 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d     /* All inform
b780: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73  ation about this
b790: 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65   parse */.  Toke
b7a0: 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f 2a 20  n *pName,    /* 
b7b0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  Name of the inde
b7c0: 78 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  x.  May be NULL 
b7d0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
b7e0: 61 62 6c 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66  able, /* Name of
b7f0: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 69 6e   the table to in
b800: 64 65 78 2e 20 20 55 73 65 20 70 50 61 72 73 65  dex.  Use pParse
b810: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30  ->pNewTable if 0
b820: 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 4c   */.  IdList *pL
b830: 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74  ist,   /* A list
b840: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
b850: 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
b860: 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
b870: 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f  /* OE_Abort, OE_
b880: 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61  Ignore, OE_Repla
b890: 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a  ce, or OE_None *
b8a0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72  /.  Token *pStar
b8b0: 74 2c 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41  t,   /* The CREA
b8c0: 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
b8d0: 67 69 6e 73 20 61 20 43 52 45 41 54 45 20 54 41  gins a CREATE TA
b8e0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  BLE statement */
b8f0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20  .  Token *pEnd  
b900: 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74      /* The ")" t
b910: 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43  hat closes the C
b920: 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
b930: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61  ement */.){.  Ta
b940: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
b950: 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  * Table to be in
b960: 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  dexed */.  Index
b970: 20 2a 70 49 6e 64 65 78 3b 20 20 20 2f 2a 20 54   *pIndex;   /* T
b980: 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63  he index to be c
b990: 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72  reated */.  char
b9a0: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *zName = 0;.  i
b9b0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e  nt i, j;.  Token
b9c0: 20 6e 75 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46   nullId;    /* F
b9d0: 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e  ake token for an
b9e0: 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a   empty ID list *
b9f0: 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  /.  DbFixer sFix
ba00: 3b 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69  ;    /* For assi
ba10: 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e  gning database n
ba20: 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a  ames to pTable *
ba30: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 3b 20  /.  int isTemp; 
ba40: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
ba50: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 69 6e 64   a temporary ind
ba60: 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a  ex */.  sqlite *
ba70: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
ba80: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
ba90: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  nErr || sqlite_m
baa0: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67  alloc_failed ) g
bab0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
bac0: 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 64 62 2d  index;.  if( db-
bad0: 3e 69 6e 69 74 2e 62 75 73 79 20 0a 20 20 20 20  >init.busy .    
bae0: 20 26 26 20 73 71 6c 69 74 65 46 69 78 49 6e 69   && sqliteFixIni
baf0: 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
bb00: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 2c 20 22   db->init.iDb, "
bb10: 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 0a 20  index", pName). 
bb20: 20 20 20 20 26 26 20 73 71 6c 69 74 65 46 69 78      && sqliteFix
bb30: 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70  SrcList(&sFix, p
bb40: 54 61 62 6c 65 29 0a 20 20 29 7b 0a 20 20 20 20  Table).  ){.    
bb50: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
bb60: 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
bb70: 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
bb80: 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
bb90: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65   be indexed.  Re
bba0: 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f  turn early if no
bbb0: 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
bbc0: 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b  if( pTable!=0 ){
bbd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
bbe0: 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  me!=0 );.    ass
bbf0: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 53 72  ert( pTable->nSr
bc00: 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61 62  c==1 );.    pTab
bc10: 20 3d 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73   =  sqliteSrcLis
bc20: 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  tLookup(pParse, 
bc30: 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65  pTable);.  }else
bc40: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
bc50: 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  ame==0 );.    pT
bc60: 61 62 20 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e  ab =  pParse->pN
bc70: 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  ewTable;.  }.  i
bc80: 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50  f( pTab==0 || pP
bc90: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
bca0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
bcb0: 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  dex;.  if( pTab-
bcc0: 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
bcd0: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
bce0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
bcf0: 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61  g, "table ", pTa
bd00: 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
bd10: 22 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  " may not be ind
bd20: 65 78 65 64 22 2c 20 28 63 68 61 72 2a 29 30 29  exed", (char*)0)
bd30: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
bd40: 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rr++;.    goto e
bd50: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
bd60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62  ;.  }.  if( pTab
bd70: 2d 3e 69 44 62 3e 3d 32 20 26 26 20 64 62 2d 3e  ->iDb>=2 && db->
bd80: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
bd90: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
bda0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
bdb0: 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20  rMsg, "table ", 
bdc0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20  pTab->zName, .  
bdd0: 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20 68 61      " may not ha
bde0: 76 65 20 69 6e 64 69 63 65 73 20 61 64 64 65 64  ve indices added
bdf0: 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ", (char*)0);.  
be00: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
be10: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
be20: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
be30: 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53  }.  if( pTab->pS
be40: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
be50: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
be60: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
be70: 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65  views may not be
be80: 20 69 6e 64 65 78 65 64 22 2c 20 28 63 68 61 72   indexed", (char
be90: 2a 29 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  *)0);.    pParse
bea0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
beb0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
bec0: 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 73 54 65  ndex;.  }.  isTe
bed0: 6d 70 20 3d 20 70 54 61 62 2d 3e 69 44 62 3d 3d  mp = pTab->iDb==
bee0: 31 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69  1;..  /*.  ** Fi
bef0: 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nd the name of t
bf00: 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20  he index.  Make 
bf10: 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
bf20: 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65  t already anothe
bf30: 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  r.  ** index or 
bf40: 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
bf50: 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a  ame name.  .  **
bf60: 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a  .  ** Exception:
bf70: 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64    If we are read
bf80: 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ing the names of
bf90: 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63   permanent indic
bfa0: 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  es from the.  **
bfb0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
bfc0: 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f  able (because so
bfd0: 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
bfe0: 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68   changed the sch
bff0: 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e  ema) and.  ** on
c000: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e  e of the index n
c010: 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69  ames collides wi
c020: 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  th the name of a
c030: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
c040: 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20   or.  ** index, 
c050: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e  then we will con
c060: 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73  tinue to process
c070: 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a   this index..  *
c080: 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d  *.  ** If pName=
c090: 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  =0 it means that
c0a0: 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61   we are.  ** dea
c0b0: 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d  ling with a prim
c0c0: 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55  ary key or UNIQU
c0d0: 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57  E constraint.  W
c0e0: 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74  e have to invent
c0f0: 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61   our.  ** own na
c100: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  me..  */.  if( p
c110: 4e 61 6d 65 20 26 26 20 21 64 62 2d 3e 69 6e 69  Name && !db->ini
c120: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e  t.busy ){.    In
c130: 64 65 78 20 2a 70 49 53 61 6d 65 4e 61 6d 65 3b  dex *pISameName;
c140: 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 69      /* Another i
c150: 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 73 61  ndex with the sa
c160: 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54  me name */.    T
c170: 61 62 6c 65 20 2a 70 54 53 61 6d 65 4e 61 6d 65  able *pTSameName
c180: 3b 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20  ;    /* A table 
c190: 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65 20 61  with same name a
c1a0: 73 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  s the index */. 
c1b0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
c1c0: 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e  eStrNDup(pName->
c1d0: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
c1e0: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
c1f0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
c200: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  e_index;.    if(
c210: 20 28 70 49 53 61 6d 65 4e 61 6d 65 20 3d 20 73   (pISameName = s
c220: 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64  qliteFindIndex(d
c230: 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30  b, zName, 0))!=0
c240: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c250: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
c260: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 69 6e 64  e->zErrMsg, "ind
c270: 65 78 20 22 2c 20 7a 4e 61 6d 65 2c 20 0a 20 20  ex ", zName, .  
c280: 20 20 20 20 20 20 20 22 20 61 6c 72 65 61 64 79         " already
c290: 20 65 78 69 73 74 73 22 2c 20 28 63 68 61 72 2a   exists", (char*
c2a0: 29 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  )0);.      pPars
c2b0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
c2c0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
c2d0: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
c2e0: 20 20 20 69 66 28 20 28 70 54 53 61 6d 65 4e 61     if( (pTSameNa
c2f0: 6d 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54  me = sqliteFindT
c300: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
c310: 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  0))!=0 ){.      
c320: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
c330: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
c340: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
c350: 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65  ady a table name
c360: 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 4e  d ",.         zN
c370: 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
c380: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
c390: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f  rr++;.      goto
c3a0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
c3b0: 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ex;.    }.  }els
c3c0: 65 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30 20 29  e if( pName==0 )
c3d0: 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
c3e0: 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  30];.    int n;.
c3f0: 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70      Index *pLoop
c400: 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ;.    for(pLoop=
c410: 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d  pTab->pIndex, n=
c420: 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  1; pLoop; pLoop=
c430: 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b  pLoop->pNext, n+
c440: 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e 74 66  +){}.    sprintf
c450: 28 7a 42 75 66 2c 22 25 64 29 22 2c 6e 29 3b 0a  (zBuf,"%d)",n);.
c460: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
c470: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
c480: 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 28 22 2c 20  ng(&zName, "(", 
c490: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 20 61  pTab->zName, " a
c4a0: 75 74 6f 69 6e 64 65 78 20 22 2c 20 7a 42 75 66  utoindex ", zBuf
c4b0: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
c4c0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
c4d0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
c4e0: 5f 69 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b  _index;.  }else{
c4f0: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
c500: 69 74 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65  iteStrNDup(pName
c510: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a  ->z, pName->n);.
c520: 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
c530: 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  for authorizatio
c540: 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69  n to create an i
c550: 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  ndex..  */.#ifnd
c560: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
c570: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
c580: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
c590: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70  *zDb = db->aDb[p
c5a0: 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b  Tab->iDb].zName;
c5b0: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ..    assert( pT
c5c0: 61 62 2d 3e 69 44 62 3d 3d 64 62 2d 3e 69 6e 69  ab->iDb==db->ini
c5d0: 74 2e 69 44 62 20 7c 7c 20 69 73 54 65 6d 70 20  t.iDb || isTemp 
c5e0: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
c5f0: 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  eAuthCheck(pPars
c600: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
c610: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
c620: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
c630: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
c640: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
c650: 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53  .    }.    i = S
c660: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44  QLITE_CREATE_IND
c670: 45 58 3b 0a 20 20 20 20 69 66 28 20 69 73 54 65  EX;.    if( isTe
c680: 6d 70 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f  mp ) i = SQLITE_
c690: 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
c6a0: 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
c6b0: 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  eAuthCheck(pPars
c6c0: 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61  e, i, zName, pTa
c6d0: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
c6e0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
c6f0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
c700: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
c710: 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d  ..  /* If pList=
c720: 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69  =0, it means thi
c730: 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
c740: 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70  lled to make a p
c750: 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20  rimary.  ** key 
c760: 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20  out of the last 
c770: 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20  column added to 
c780: 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
c790: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20  construction..  
c7a0: 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66  ** So create a f
c7b0: 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75  ake list to simu
c7c0: 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a  late this..  */.
c7d0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
c7e0: 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d  {.    nullId.z =
c7f0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62   pTab->aCol[pTab
c800: 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b  ->nCol-1].zName;
c810: 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20  .    nullId.n = 
c820: 73 74 72 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29  strlen(nullId.z)
c830: 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  ;.    pList = sq
c840: 6c 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e 64  liteIdListAppend
c850: 28 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20  (0, &nullId);.  
c860: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
c870: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
c880: 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
c890: 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74  /* .  ** Allocat
c8a0: 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  e the index stru
c8b0: 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 70  cture. .  */.  p
c8c0: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 4d 61  Index = sqliteMa
c8d0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 6e 64  lloc( sizeof(Ind
c8e0: 65 78 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e 61  ex) + strlen(zNa
c8f0: 6d 65 29 20 2b 20 31 20 2b 0a 20 20 20 20 20 20  me) + 1 +.      
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c910: 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 70 4c    sizeof(int)*pL
c920: 69 73 74 2d 3e 6e 49 64 20 29 3b 0a 20 20 69 66  ist->nId );.  if
c930: 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 20 67 6f  ( pIndex==0 ) go
c940: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
c950: 6e 64 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ndex;.  pIndex->
c960: 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a  aiColumn = (int*
c970: 29 26 70 49 6e 64 65 78 5b 31 5d 3b 0a 20 20 70  )&pIndex[1];.  p
c980: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28  Index->zName = (
c990: 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 61  char*)&pIndex->a
c9a0: 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e  iColumn[pList->n
c9b0: 49 64 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 49  Id];.  strcpy(pI
c9c0: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  ndex->zName, zNa
c9d0: 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70  me);.  pIndex->p
c9e0: 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20  Table = pTab;.  
c9f0: 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
ca00: 3d 20 70 4c 69 73 74 2d 3e 6e 49 64 3b 0a 20 20  = pList->nId;.  
ca10: 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
ca20: 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e  = onError;.  pIn
ca30: 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d  dex->autoIndex =
ca40: 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e   pName==0;.  pIn
ca50: 64 65 78 2d 3e 69 44 62 20 3d 20 69 73 54 65 6d  dex->iDb = isTem
ca60: 70 20 3f 20 31 20 3a 20 64 62 2d 3e 69 6e 69 74  p ? 1 : db->init
ca70: 2e 69 44 62 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e  .iDb;..  /* Scan
ca80: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
ca90: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
caa0: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
cab0: 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f  exed and.  ** lo
cac0: 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  ad the column in
cad0: 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49  dices into the I
cae0: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
caf0: 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
cb00: 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c  .  ** if any col
cb10: 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  umn is not found
cb20: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
cb30: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
cb40: 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  i++){.    for(j=
cb50: 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
cb60: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
cb70: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70   sqliteStrICmp(p
cb80: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
cb90: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  , pTab->aCol[j].
cba0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  zName)==0 ) brea
cbb0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
cbc0: 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29   j>=pTab->nCol )
cbd0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  {.      sqliteSe
cbe0: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
cbf0: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65  >zErrMsg, "table
cc00: 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   ", pTab->zName,
cc10: 20 0a 20 20 20 20 20 20 20 20 22 20 68 61 73 20   .        " has 
cc20: 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20  no column named 
cc30: 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ", pList->a[i].z
cc40: 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b  Name, (char*)0);
cc50: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
cc60: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  Err++;.      sql
cc70: 69 74 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b  iteFree(pIndex);
cc80: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
cc90: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
cca0: 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
ccb0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a  >aiColumn[i] = j
ccc0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b  ;.  }..  /* Link
ccd0: 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73   the new Index s
cce0: 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20  tructure to its 
ccf0: 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65  table and to the
cd00: 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d   other.  ** in-m
cd10: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73  emory database s
cd20: 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f  tructures. .  */
cd30: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
cd40: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 49  explain ){.    I
cd50: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d  ndex *p;.    p =
cd60: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72   sqliteHashInser
cd70: 74 28 26 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65  t(&db->aDb[pInde
cd80: 78 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c  x->iDb].idxHash,
cd90: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
cda0: 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65             pInde
cdb0: 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  x->zName, strlen
cdc0: 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b  (pIndex->zName)+
cdd0: 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  1, pIndex);.    
cde0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61  if( p ){.      a
cdf0: 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78  ssert( p==pIndex
ce00: 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
ce10: 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
ce20: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  */.      sqliteF
ce30: 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20  ree(pIndex);.   
ce40: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
ce50: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
ce60: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
ce70: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
ce80: 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f  hanges;.  }..  /
ce90: 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e  * When adding an
cea0: 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69   index to the li
ceb0: 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f  st of indices fo
cec0: 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a  r a table, make.
ced0: 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e    ** sure all in
cee0: 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45  dices labeled OE
cef0: 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66  _Replace come af
cf00: 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61  ter all those la
cf10: 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67  beled.  ** OE_Ig
cf20: 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e  nore.  This is n
cf30: 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65  ecessary for the
cf40: 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69   correct operati
cf50: 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a  on of UPDATE.  *
cf60: 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20  * and INSERT..  
cf70: 2a 2f 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72  */.  if( onError
cf80: 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20  !=OE_Replace || 
cf90: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a  pTab->pIndex==0.
cfa0: 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e         || pTab->
cfb0: 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d  pIndex->onError=
cfc0: 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20  =OE_Replace){.  
cfd0: 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
cfe0: 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
cff0: 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78      pTab->pIndex
d000: 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c   = pIndex;.  }el
d010: 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  se{.    Index *p
d020: 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49  Other = pTab->pI
d030: 6e 64 65 78 3b 0a 20 20 20 20 77 68 69 6c 65 28  ndex;.    while(
d040: 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26   pOther->pNext &
d050: 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d  & pOther->pNext-
d060: 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70  >onError!=OE_Rep
d070: 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 70 4f  lace ){.      pO
d080: 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70  ther = pOther->p
d090: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
d0a0: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
d0b0: 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
d0c0: 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74     pOther->pNext
d0d0: 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a   = pIndex;.  }..
d0e0: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
d0f0: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69  init.busy is 1 i
d100: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
d110: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
d120: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
d130: 69 74 65 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  ite_master" tabl
d140: 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 20 20  e on the disk.  
d150: 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  So do not write 
d160: 74 6f 20 74 68 65 20 64 69 73 6b 0a 20 20 2a 2a  to the disk.  **
d170: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
d180: 20 74 68 65 20 74 61 62 6c 65 20 6e 75 6d 62 65   the table numbe
d190: 72 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69  r from the db->i
d1a0: 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c  nit.newTnum fiel
d1b0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  d..  */.  if( db
d1c0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
d1d0: 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20  Table!=0 ){.    
d1e0: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64  pIndex->tnum = d
d1f0: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
d200: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
d210: 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
d220: 69 73 20 30 20 74 68 65 6e 20 63 72 65 61 74 65  is 0 then create
d230: 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69   the index on di
d240: 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69  sk.  This.  ** i
d250: 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20  nvolves writing 
d260: 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74  the index into t
d270: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
d280: 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  and filling in t
d290: 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69  he.  ** index wi
d2a0: 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  th the current t
d2b0: 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20  able contents.. 
d2c0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d   **.  ** The db-
d2d0: 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20  >init.busy is 0 
d2e0: 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 66 69  when the user fi
d2f0: 72 73 74 20 65 6e 74 65 72 73 20 61 20 43 52 45  rst enters a CRE
d300: 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20  ATE INDEX .  ** 
d310: 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e  command.  db->in
d320: 69 74 2e 62 75 73 79 20 69 73 20 31 20 77 68 65  it.busy is 1 whe
d330: 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20  n a database is 
d340: 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a  opened and .  **
d350: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
d360: 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61  atements are rea
d370: 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73  d out of the mas
d380: 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20  ter table.  In. 
d390: 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63   ** the latter c
d3a0: 61 73 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c  ase the index al
d3b0: 72 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20  ready exists on 
d3c0: 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77  disk, which is w
d3d0: 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74  hy.  ** we don't
d3e0: 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74   want to recreat
d3f0: 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  e it..  **.  ** 
d400: 49 66 20 70 54 61 62 6c 65 3d 3d 30 20 69 74 20  If pTable==0 it 
d410: 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78  means this index
d420: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73   is generated as
d430: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20   a primary key. 
d440: 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f   ** or UNIQUE co
d450: 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52  nstraint of a CR
d460: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
d470: 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65  ment.  Since the
d480: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20   table.  ** has 
d490: 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65  just been create
d4a0: 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e  d, it contains n
d4b0: 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69  o data and the i
d4c0: 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74  ndex initializat
d4d0: 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61  ion.  ** step ca
d4e0: 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20  n be skipped..  
d4f0: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62  */.  else if( db
d500: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
d510: 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
d520: 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 69 6e   Vdbe *v;.    in
d530: 74 20 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a 20 20  t lbl1, lbl2;.  
d540: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
d550: 20 61 64 64 72 3b 0a 0a 20 20 20 20 76 20 3d 20   addr;..    v = 
d560: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
d570: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
d580: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
d590: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
d5a0: 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20    if( pTable!=0 
d5b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42  ){.      sqliteB
d5c0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
d5d0: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 73  on(pParse, 0, is
d5e0: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
d5f0: 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  iteOpenMasterTab
d600: 6c 65 28 76 2c 20 69 73 54 65 6d 70 29 3b 0a 20  le(v, isTemp);. 
d610: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
d620: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
d630: 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a  ewRecno, 0, 0);.
d640: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d650: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
d660: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
d670: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
d680: 76 2c 20 2d 31 2c 20 22 69 6e 64 65 78 22 2c 20  v, -1, "index", 
d690: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
d6a0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
d6b0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
d6c0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
d6d0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
d6e0: 31 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  1, pIndex->zName
d6f0: 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d  , strlen(pIndex-
d700: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73 71  >zName));.    sq
d710: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
d720: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
d730: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
d740: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
d750: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
d760: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  ;.    addr = sql
d770: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
d780: 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20  OP_CreateIndex, 
d790: 30 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20 20  0, isTemp);.    
d7a0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
d7b0: 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61  P3(v, addr, (cha
d7c0: 72 2a 29 26 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  r*)&pIndex->tnum
d7d0: 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20  , P3_POINTER);. 
d7e0: 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
d7f0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 54 61  = 0;.    if( pTa
d800: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ble ){.      sql
d810: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
d820: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
d830: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
d840: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
d850: 65 72 2c 20 69 73 54 65 6d 70 2c 20 30 29 3b 0a  er, isTemp, 0);.
d860: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
d870: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
d880: 57 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20  Write, 1, 0);.  
d890: 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 73    }.    addr = s
d8a0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
d8b0: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
d8c0: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61  0);.    if( pSta
d8d0: 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20  rt && pEnd ){.  
d8e0: 20 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e      n = Addr(pEn
d8f0: 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 53 74  d->z) - Addr(pSt
d900: 61 72 74 2d 3e 7a 29 20 2b 20 31 3b 0a 20 20 20  art->z) + 1;.   
d910: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
d920: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70  ngeP3(v, addr, p
d930: 53 74 61 72 74 2d 3e 7a 2c 20 6e 29 3b 0a 20 20  Start->z, n);.  
d940: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64    }.    sqliteVd
d950: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
d960: 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b  keRecord, 5, 0);
d970: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
d980: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e  ddOp(v, OP_PutIn
d990: 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tKey, 0, 0);.   
d9a0: 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20   if( pTable ){. 
d9b0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
d9c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
d9d0: 65 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20 30  er, pTab->iDb, 0
d9e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
d9f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
da00: 70 65 6e 52 65 61 64 2c 20 32 2c 20 70 54 61 62  penRead, 2, pTab
da10: 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 73  ->tnum);.      s
da20: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
da30: 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a  3(v, -1, pTab->z
da40: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Name, 0);.      
da50: 6c 62 6c 32 20 3d 20 73 71 6c 69 74 65 56 64 62  lbl2 = sqliteVdb
da60: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
da70: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
da80: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
da90: 64 2c 20 32 2c 20 6c 62 6c 32 29 3b 0a 20 20 20  d, 2, lbl2);.   
daa0: 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65     lbl1 = sqlite
dab0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
dac0: 52 65 63 6e 6f 2c 20 32 2c 20 30 29 3b 0a 20 20  Recno, 2, 0);.  
dad0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
dae0: 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Index->nColumn; 
daf0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
db00: 74 20 69 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d  t iCol = pIndex-
db10: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
db20: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
db30: 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 29 7b 0a 20  iPKey==iCol ){. 
db40: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56           sqliteV
db50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
db60: 75 70 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20  up, i, 0);.     
db70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
db80: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
db90: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
dba0: 2c 20 32 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  , 2, iCol);.    
dbb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
dbc0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
dbd0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 49 64  dOp(v, OP_MakeId
dbe0: 78 4b 65 79 2c 20 70 49 6e 64 65 78 2d 3e 6e 43  xKey, pIndex->nC
dbf0: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
dc00: 20 69 66 28 20 64 62 2d 3e 66 69 6c 65 5f 66 6f   if( db->file_fo
dc10: 72 6d 61 74 3e 3d 34 20 29 20 73 71 6c 69 74 65  rmat>=4 ) sqlite
dc20: 41 64 64 49 64 78 4b 65 79 54 79 70 65 28 76 2c  AddIdxKeyType(v,
dc30: 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20   pIndex);.      
dc40: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
dc50: 76 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20 31 2c  v, OP_IdxPut, 1,
dc60: 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
dc70: 21 3d 4f 45 5f 4e 6f 6e 65 29 3b 0a 20 20 20 20  !=OE_None);.    
dc80: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
dc90: 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 69 6e 64  geP3(v, -1, "ind
dca0: 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65  exed columns are
dcb0: 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33   not unique", P3
dcc0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
dcd0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
dce0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c  v, OP_Next, 2, l
dcf0: 62 6c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  bl1);.      sqli
dd00: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
dd10: 65 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20  el(v, lbl2);.   
dd20: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
dd30: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
dd40: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 0);.      sql
dd50: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
dd60: 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b  OP_Close, 1, 0);
dd70: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
dd80: 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20  Table!=0 ){.    
dd90: 20 20 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b    if( !isTemp ){
dda0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 43  .        sqliteC
ddb0: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20  hangeCookie(db, 
ddc0: 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  v);.      }.    
ddd0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
dde0: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  p(v, OP_Close, 0
ddf0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
de00: 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  teEndWriteOperat
de10: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ion(pParse);.   
de20: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65   }.  }..  /* Cle
de30: 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69  an up before exi
de40: 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65  ting */.exit_cre
de50: 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c  ate_index:.  sql
de60: 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28  iteIdListDelete(
de70: 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  pList);.  sqlite
de80: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54  SrcListDelete(pT
de90: 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  able);.  sqliteF
dea0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  ree(zName);.  re
deb0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
dec0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
ded0: 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e   drop an existin
dee0: 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20  g named index.  
def0: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
df00: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44  implements the D
df10: 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ROP INDEX statem
df20: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
df30: 69 74 65 44 72 6f 70 49 6e 64 65 78 28 50 61 72  iteDropIndex(Par
df40: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
df50: 69 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49  ist *pName){.  I
df60: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
df70: 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
df80: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
df90: 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  db;..  if( pPars
dfa0: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
dfb0: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
dfc0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
dfd0: 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
dfe0: 3d 31 20 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d  =1 );.  pIndex =
dff0: 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78   sqliteFindIndex
e000: 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  (db, pName->a[0]
e010: 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
e020: 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
e030: 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20    if( pIndex==0 
e040: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72  ){.    sqliteErr
e050: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
e060: 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53  o such index: %S
e070: 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  ", pName, 0);.  
e080: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
e090: 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
e0a0: 28 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e  ( pIndex->autoIn
e0b0: 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dex ){.    sqlit
e0c0: 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
e0d0: 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61  , "index associa
e0e0: 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20  ted with UNIQUE 
e0f0: 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d  ".      "or PRIM
e100: 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
e110: 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f  nt cannot be dro
e120: 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67  pped", 0);.    g
e130: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
e140: 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dex;.  }.  if( p
e150: 49 6e 64 65 78 2d 3e 69 44 62 3e 31 20 29 7b 0a  Index->iDb>1 ){.
e160: 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
e170: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
e180: 6f 74 20 61 6c 74 65 72 20 73 63 68 65 6d 61 20  ot alter schema 
e190: 6f 66 20 61 74 74 61 63 68 65 64 20 22 0a 20 20  of attached ".  
e1a0: 20 20 20 20 20 22 64 61 74 61 62 61 73 65 73 22       "databases"
e1b0: 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  , 0);.    goto e
e1c0: 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
e1d0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
e1e0: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
e1f0: 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
e200: 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  t code = SQLITE_
e210: 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  DROP_INDEX;.    
e220: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
e230: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20  ndex->pTable;.  
e240: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
e250: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e 64  b = db->aDb[pInd
e260: 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  ex->iDb].zName;.
e270: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e280: 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
e290: 42 4c 45 28 70 49 6e 64 65 78 2d 3e 69 44 62 29  BLE(pIndex->iDb)
e2a0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
e2b0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
e2c0: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
e2d0: 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29   zTab, 0, zDb) )
e2e0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
e2f0: 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
e300: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 64    }.    if( pInd
e310: 65 78 2d 3e 69 44 62 20 29 20 63 6f 64 65 20 3d  ex->iDb ) code =
e320: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
e330: 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
e340: 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b   sqliteAuthCheck
e350: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
e360: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54  Index->zName, pT
e370: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  ab->zName, zDb) 
e380: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
e390: 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
e3a0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
e3b0: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
e3c0: 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
e3d0: 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d  e index and from
e3e0: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
e3f0: 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74  e */.  v = sqlit
e400: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
e410: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
e420: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 4c 69   static VdbeOpLi
e430: 73 74 20 64 72 6f 70 49 6e 64 65 78 5b 5d 20 3d  st dropIndex[] =
e440: 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65   {.      { OP_Re
e450: 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44  wind,     0, ADD
e460: 52 28 39 29 2c 20 30 7d 2c 20 0a 20 20 20 20 20  R(9), 0}, .     
e470: 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20   { OP_String,   
e480: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d    0, 0,       0}
e490: 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20  , /* 1 */.      
e4a0: 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20  { OP_MemStore,  
e4b0: 20 31 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c   1, 1,       0},
e4c0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c  .      { OP_MemL
e4d0: 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20  oad,    1, 0,   
e4e0: 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a      0}, /* 3 */.
e4f0: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
e500: 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20  n,     0, 1,    
e510: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
e520: 50 5f 45 71 2c 20 20 20 20 20 20 20 20 20 30 2c  P_Eq,         0,
e530: 20 41 44 44 52 28 38 29 2c 20 30 7d 2c 0a 20 20   ADDR(8), 0},.  
e540: 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20      { OP_Next,  
e550: 20 20 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c       0, ADDR(3),
e560: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
e570: 47 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41  Goto,       0, A
e580: 44 44 52 28 39 29 2c 20 30 7d 2c 0a 20 20 20 20  DDR(9), 0},.    
e590: 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20    { OP_Delete,  
e5a0: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30     0, 0,       0
e5b0: 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 7d  }, /* 8 */.    }
e5c0: 3b 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a  ;.    int base;.
e5d0: 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e  .    sqliteBegin
e5e0: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
e5f0: 50 61 72 73 65 2c 20 30 2c 20 70 49 6e 64 65 78  Parse, 0, pIndex
e600: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  ->iDb);.    sqli
e610: 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  teOpenMasterTabl
e620: 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62  e(v, pIndex->iDb
e630: 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71  );.    base = sq
e640: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
e650: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64  t(v, ArraySize(d
e660: 72 6f 70 49 6e 64 65 78 29 2c 20 64 72 6f 70 49  ropIndex), dropI
e670: 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  ndex);.    sqlit
e680: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
e690: 20 62 61 73 65 2b 31 2c 20 70 49 6e 64 65 78 2d   base+1, pIndex-
e6a0: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
e6b0: 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d  if( pIndex->iDb=
e6c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
e6d0: 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  teChangeCookie(d
e6e0: 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  b, v);.    }.   
e6f0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
e700: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
e710: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
e720: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
e730: 65 73 74 72 6f 79 2c 20 70 49 6e 64 65 78 2d 3e  estroy, pIndex->
e740: 74 6e 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44  tnum, pIndex->iD
e750: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 6e  b);.    sqliteEn
e760: 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
e770: 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20  pParse);.  }..  
e780: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e  /* Delete the in
e790: 2d 6d 65 6d 6f 72 79 20 64 65 73 63 72 69 70 74  -memory descript
e7a0: 69 6f 6e 20 6f 66 20 74 68 69 73 20 69 6e 64 65  ion of this inde
e7b0: 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  x..  */.  if( !p
e7c0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
e7d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69  {.    sqliteUnli
e7e0: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
e7f0: 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
e800: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
e810: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
e820: 67 65 73 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64  ges;.  }..exit_d
e830: 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c  rop_index:.  sql
e840: 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65  iteSrcListDelete
e850: 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pName);.}../*.*
e860: 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65  * Append a new e
e870: 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69  lement to the gi
e880: 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65  ven IdList.  Cre
e890: 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74  ate a new IdList
e8a0: 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a   if.** need be..
e8b0: 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69  **.** A new IdLi
e8c0: 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
e8d0: 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f  or NULL if mallo
e8e0: 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64  c() fails..*/.Id
e8f0: 4c 69 73 74 20 2a 73 71 6c 69 74 65 49 64 4c 69  List *sqliteIdLi
e900: 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20  stAppend(IdList 
e910: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
e920: 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c  Token){.  if( pL
e930: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
e940: 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ist = sqliteMall
e950: 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73  oc( sizeof(IdLis
e960: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
e970: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
e980: 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  0;.    pList->nA
e990: 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lloc = 0;.  }.  
e9a0: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3e 3d  if( pList->nId>=
e9b0: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  pList->nAlloc ){
e9c0: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
e9d0: 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20  st_item *a;.    
e9e0: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
e9f0: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20  pList->nAlloc*2 
ea00: 2b 20 35 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c  + 5;.    a = sql
ea10: 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74  iteRealloc(pList
ea20: 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  ->a, pList->nAll
ea30: 6f 63 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  oc*sizeof(pList-
ea40: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  >a[0]) );.    if
ea50: 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( a==0 ){.      
ea60: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65  sqliteIdListDele
ea70: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  te(pList);.     
ea80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
ea90: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
eaa0: 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  a;.  }.  memset(
eab0: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
eac0: 3e 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >nId], 0, sizeof
ead0: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
eae0: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
eaf0: 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20      char **pz = 
eb00: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
eb10: 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >nId].zName;.   
eb20: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
eb30: 67 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c  g(pz, pToken->z,
eb40: 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a   pToken->n, 0);.
eb50: 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29      if( *pz==0 )
eb60: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49 64  {.      sqliteId
eb70: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
eb80: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
eb90: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
eba0: 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74      sqliteDequot
ebb0: 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  e(*pz);.    }.  
ebc0: 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b  }.  pList->nId++
ebd0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
ebe0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
ebf0: 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  d a new table na
ec00: 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  me to the given 
ec10: 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65  SrcList.  Create
ec20: 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   a new SrcList i
ec30: 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41  f.** need be.  A
ec40: 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72   new entry is cr
ec50: 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63  eated in the Src
ec60: 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f  List even if pTo
ec70: 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  ken is NULL..**.
ec80: 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74  ** A new SrcList
ec90: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
eca0: 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
ecb0: 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49  ) fails..**.** I
ecc0: 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e  f pDatabase is n
ecd0: 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e  ot null, it mean
ece0: 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  s that the table
ecf0: 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   has an optional
ed00: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d  .** database nam
ed10: 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20  e prefix.  Like 
ed20: 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65  this:  "database
ed30: 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44  .table".  The pD
ed40: 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74  atabase.** point
ed50: 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e  s to the table n
ed60: 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62  ame and the pTab
ed70: 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  le points to the
ed80: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a   database name..
ed90: 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61  ** The SrcList.a
eda0: 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69  [].zName field i
edb0: 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
edc0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69  e table name whi
edd0: 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65  ch might.** come
ede0: 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66   from pTable (if
edf0: 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55   pDatabase is NU
ee00: 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74  LL) or from pDat
ee10: 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c  abase.  .** SrcL
ee20: 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73  ist.a[].zDatabas
ee30: 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  e is filled with
ee40: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
ee50: 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a  me from pTable,.
ee60: 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20  ** or with NULL 
ee70: 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69  if no database i
ee80: 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  s specified..**.
ee90: 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
eea0: 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20  s, if call like 
eeb0: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
eec0: 20 20 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73      sqliteSrcLis
eed0: 74 41 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b 0a  tAppend(A,B,0);.
eee0: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20  **.** Then B is 
eef0: 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  a table name and
ef00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
ef10: 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65  me is unspecifie
ef20: 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a  d.  If called.**
ef30: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
ef40: 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
ef50: 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c  SrcListAppend(A,
ef60: 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,C);.**.** Then
ef70: 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20   C is the table 
ef80: 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68  name and B is th
ef90: 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
efa0: 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  .*/.SrcList *sql
efb0: 69 74 65 53 72 63 4c 69 73 74 41 70 70 65 6e 64  iteSrcListAppend
efc0: 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c  (SrcList *pList,
efd0: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
efe0: 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65  Token *pDatabase
eff0: 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ){.  if( pList==
f000: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
f010: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
f020: 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29  izeof(SrcList) )
f030: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
f040: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
f050: 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
f060: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
f070: 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69  pList->nSrc>=pLi
f080: 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  st->nAlloc ){.  
f090: 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
f0a0: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
f0b0: 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65  oc *= 2;.    pNe
f0c0: 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
f0d0: 63 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20 20  c(pList,.       
f0e0: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
f0f0: 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74 2d  pList) + (pList-
f100: 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f  >nAlloc-1)*sizeo
f110: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29  f(pList->a[0]) )
f120: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
f130: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
f140: 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  eSrcListDelete(p
f150: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
f160: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
f170: 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20   pList = pNew;. 
f180: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c 69   }.  memset(&pLi
f190: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
f1a0: 63 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c  c], 0, sizeof(pL
f1b0: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69  ist->a[0]));.  i
f1c0: 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20  f( pDatabase && 
f1d0: 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20  pDatabase->z==0 
f1e0: 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  ){.    pDatabase
f1f0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
f200: 70 44 61 74 61 62 61 73 65 20 26 26 20 70 54 61  pDatabase && pTa
f210: 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e  ble ){.    Token
f220: 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62   *pTemp = pDatab
f230: 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61  ase;.    pDataba
f240: 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20  se = pTable;.   
f250: 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b   pTable = pTemp;
f260: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 6c  .  }.  if( pTabl
f270: 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a  e ){.    char **
f280: 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  pz = &pList->a[p
f290: 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a 4e 61 6d  List->nSrc].zNam
f2a0: 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  e;.    sqliteSet
f2b0: 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 54 61 62  NString(pz, pTab
f2c0: 6c 65 2d 3e 7a 2c 20 70 54 61 62 6c 65 2d 3e 6e  le->z, pTable->n
f2d0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70  , 0);.    if( *p
f2e0: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  z==0 ){.      sq
f2f0: 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74  liteSrcListDelet
f300: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
f310: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
f320: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
f330: 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20  eDequote(*pz);. 
f340: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
f350: 44 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20  Database ){.    
f360: 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69  char **pz = &pLi
f370: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
f380: 63 5d 2e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20  c].zDatabase;.  
f390: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
f3a0: 6e 67 28 70 7a 2c 20 70 44 61 74 61 62 61 73 65  ng(pz, pDatabase
f3b0: 2d 3e 7a 2c 20 70 44 61 74 61 62 61 73 65 2d 3e  ->z, pDatabase->
f3c0: 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a  n, 0);.    if( *
f3d0: 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  pz==0 ){.      s
f3e0: 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65  qliteSrcListDele
f3f0: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  te(pList);.     
f400: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
f410: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
f420: 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a  teDequote(*pz);.
f430: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73      }.  }.  pLis
f440: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
f450: 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  ].iCursor = -1;.
f460: 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b    pList->nSrc++;
f470: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
f480: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
f490: 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20   cursors to all 
f4a0: 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c  tables in a SrcL
f4b0: 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ist.*/.void sqli
f4c0: 74 65 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  teSrcListAssignC
f4d0: 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50  ursors(Parse *pP
f4e0: 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
f4f0: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
f500: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
f510: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
f520: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
f530: 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 30 20 29 7b  [i].iCursor<0 ){
f540: 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  .      pList->a[
f550: 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 70 50 61  i].iCursor = pPa
f560: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
f570: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
f580: 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74 6f 20  Add an alias to 
f590: 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74 69 66  the last identif
f5a0: 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ier on the given
f5b0: 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69 73 74   identifier list
f5c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
f5d0: 53 72 63 4c 69 73 74 41 64 64 41 6c 69 61 73 28  SrcListAddAlias(
f5e0: 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  SrcList *pList, 
f5f0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
f600: 20 20 69 66 28 20 70 4c 69 73 74 20 26 26 20 70    if( pList && p
f610: 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a  List->nSrc>0 ){.
f620: 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73      int i = pLis
f630: 74 2d 3e 6e 53 72 63 20 2d 20 31 3b 0a 20 20 20  t->nSrc - 1;.   
f640: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
f650: 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  g(&pList->a[i].z
f660: 41 6c 69 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a  Alias, pToken->z
f670: 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b  , pToken->n, 0);
f680: 0a 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f  .    sqliteDequo
f690: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  te(pList->a[i].z
f6a0: 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Alias);.  }.}../
f6b0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49  *.** Delete an I
f6c0: 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dList..*/.void s
f6d0: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
f6e0: 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29  e(IdList *pList)
f6f0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
f700: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
f710: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
f720: 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
f730: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
f740: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  e(pList->a[i].zN
f750: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ame);.  }.  sqli
f760: 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29  teFree(pList->a)
f770: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
f780: 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
f790: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
f7a0: 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65   in pList of the
f7b0: 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65   identifier name
f7c0: 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d  d zId.  Return -
f7d0: 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e  1.** if not foun
f7e0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
f7f0: 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69  IdListIndex(IdLi
f800: 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74  st *pList, const
f810: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
f820: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
f830: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
f840: 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  -1;.  for(i=0; i
f850: 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
f860: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
f870: 65 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  eStrICmp(pList->
f880: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  a[i].zName, zNam
f890: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  e)==0 ) return i
f8a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
f8b0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  1;.}../*.** Dele
f8c0: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63  te an entire Src
f8d0: 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61  List including a
f8e0: 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74  ll its substruct
f8f0: 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ure..*/.void sql
f900: 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65  iteSrcListDelete
f910: 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29  (SrcList *pList)
f920: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
f930: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
f940: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
f950: 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
f960: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  +){.    sqliteFr
f970: 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ee(pList->a[i].z
f980: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73  Database);.    s
f990: 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
f9a0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
f9b0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
f9c0: 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29  st->a[i].zAlias)
f9d0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
f9e0: 3e 61 5b 69 5d 2e 70 54 61 62 20 26 26 20 70 4c  >a[i].pTab && pL
f9f0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d 3e  ist->a[i].pTab->
fa00: 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20  isTransient ){. 
fa10: 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74       sqliteDelet
fa20: 65 54 61 62 6c 65 28 30 2c 20 70 4c 69 73 74 2d  eTable(0, pList-
fa30: 3e 61 5b 69 5d 2e 70 54 61 62 29 3b 0a 20 20 20  >a[i].pTab);.   
fa40: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c   }.    sqliteSel
fa50: 65 63 74 44 65 6c 65 74 65 28 70 4c 69 73 74 2d  ectDelete(pList-
fa60: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a  >a[i].pSelect);.
fa70: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65      sqliteExprDe
fa80: 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  lete(pList->a[i]
fa90: 2e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  .pOn);.    sqlit
faa0: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  eIdListDelete(pL
fab0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 55 73 69 6e 67  ist->a[i].pUsing
fac0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
fad0: 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  ree(pList);.}../
fae0: 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61  *.** Begin a tra
faf0: 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
fb00: 20 73 71 6c 69 74 65 42 65 67 69 6e 54 72 61 6e   sqliteBeginTran
fb10: 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
fb20: 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72  Parse, int onErr
fb30: 6f 72 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  or){.  sqlite *d
fb40: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
fb50: 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
fb60: 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
fb70: 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
fb80: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
fb90: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
fba0: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
fbb0: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
fbc0: 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68  if( sqliteAuthCh
fbd0: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
fbe0: 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
fbf0: 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29  "BEGIN", 0, 0) )
fc00: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 64   return;.  if( d
fc10: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
fc20: 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20  E_InTrans ){.   
fc30: 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28   sqliteErrorMsg(
fc40: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
fc50: 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
fc60: 69 6f 6e 20 77 69 74 68 69 6e 20 61 20 74 72 61  ion within a tra
fc70: 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20 20  nsaction");.    
fc80: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
fc90: 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70  liteBeginWriteOp
fca0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
fcb0: 30 2c 20 30 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  0, 0);.  db->fla
fcc0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 54  gs |= SQLITE_InT
fcd0: 72 61 6e 73 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72  rans;.  db->onEr
fce0: 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d  ror = onError;.}
fcf0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
fd00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
fd10: 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d 69  void sqliteCommi
fd20: 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  tTransaction(Par
fd30: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
fd40: 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69 66  qlite *db;..  if
fd50: 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
fd60: 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
fd70: 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  0 || db->aDb[0].
fd80: 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBt==0 ) return;
fd90: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
fda0: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
fdb0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
fdc0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
fdd0: 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  teAuthCheck(pPar
fde0: 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
fdf0: 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22  ACTION, "COMMIT"
fe00: 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
fe10: 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61  ;.  if( (db->fla
fe20: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72  gs & SQLITE_InTr
fe30: 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ans)==0 ){.    s
fe40: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
fe50: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63 6f  arse, "cannot co
fe60: 6d 6d 69 74 20 2d 20 6e 6f 20 74 72 61 6e 73 61  mmit - no transa
fe70: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22  ction is active"
fe80: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
fe90: 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26   }.  db->flags &
fea0: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e  = ~SQLITE_InTran
feb0: 73 3b 0a 20 20 73 71 6c 69 74 65 45 6e 64 57 72  s;.  sqliteEndWr
fec0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
fed0: 72 73 65 29 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72  rse);.  db->onEr
fee0: 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74  ror = OE_Default
fef0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
ff00: 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
ff10: 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
ff20: 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74  RollbackTransact
ff30: 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
ff40: 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  e){.  sqlite *db
ff50: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
ff60: 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
ff70: 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
ff80: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
ff90: 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
ffa0: 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
ffb0: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f  >nErr || sqlite_
ffc0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
ffd0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71  return;.  if( sq
ffe0: 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50  liteAuthCheck(pP
fff0: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
10000 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42  NSACTION, "ROLLB
10010 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65  ACK", 0, 0) ) re
10020 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d  turn;.  if( (db-
10030 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
10040 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20  InTrans)==0 ){. 
10050 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
10060 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
10070 74 20 72 6f 6c 6c 62 61 63 6b 20 2d 20 6e 6f 20  t rollback - no 
10080 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
10090 63 74 69 76 65 22 29 3b 0a 20 20 20 20 72 65 74  ctive");.    ret
100a0 75 72 6e 3b 20 0a 20 20 7d 0a 20 20 76 20 3d 20  urn; .  }.  v = 
100b0 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
100c0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
100d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
100e0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 6c 6c  AddOp(v, OP_Roll
100f0 62 61 63 6b 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  back, 0, 0);.  }
10100 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
10110 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b  ~SQLITE_InTrans;
10120 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d  .  db->onError =
10130 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a   OE_Default;.}..
10140 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
10150 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 77 69  DBE code that wi
10160 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20 73 63  ll verify the sc
10170 68 65 6d 61 20 63 6f 6f 6b 69 65 20 66 6f 72 20  hema cookie for 
10180 61 6c 6c 0a 2a 2a 20 6e 61 6d 65 64 20 64 61 74  all.** named dat
10190 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a  abase files..*/.
101a0 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 64 65 56  void sqliteCodeV
101b0 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73  erifySchema(Pars
101c0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
101d0 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  Db){.  sqlite *d
101e0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
101f0 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
10200 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
10210 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
10220 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
10230 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
10240 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
10250 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 44 62  !=0 );.  if( iDb
10260 21 3d 31 20 26 26 20 21 44 62 48 61 73 50 72 6f  !=1 && !DbHasPro
10270 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20 44  perty(db, iDb, D
10280 42 5f 43 6f 6f 6b 69 65 29 20 29 7b 0a 20 20 20  B_Cookie) ){.   
10290 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
102a0 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f  (v, OP_VerifyCoo
102b0 6b 69 65 2c 20 69 44 62 2c 20 64 62 2d 3e 61 44  kie, iDb, db->aD
102c0 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f  b[iDb].schema_co
102d0 6f 6b 69 65 29 3b 0a 20 20 20 20 44 62 53 65 74  okie);.    DbSet
102e0 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62  Property(db, iDb
102f0 2c 20 44 42 5f 43 6f 6f 6b 69 65 29 3b 0a 20 20  , DB_Cookie);.  
10300 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
10310 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68  ate VDBE code th
10320 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20  at prepares for 
10330 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69  doing an operati
10340 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74  on that.** might
10350 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61   change the data
10360 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  base..**.** This
10370 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20   routine starts 
10380 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
10390 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  n if we are not 
103a0 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a  already within.*
103b0 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  * a transaction.
103c0 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65    If we are alre
103d0 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61  ady within a tra
103e0 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61  nsaction, then a
103f0 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69   checkpoint.** i
10400 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74  s set if the set
10410 43 68 65 63 6b 70 6f 69 6e 74 20 70 61 72 61 6d  Checkpoint param
10420 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41  eter is true.  A
10430 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
10440 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72  ld.** be set for
10450 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74   operations that
10460 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65   might fail (due
10470 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   to a constraint
10480 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  ) part of.** the
10490 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64   way through and
104a0 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64   which will need
104b0 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72   to undo some wr
104c0 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76  ites without hav
104d0 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61  ing to.** rollba
104e0 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  ck the whole tra
104f0 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f  nsaction.  For o
10500 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20  perations where 
10510 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
10520 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65  ** can be checke
10530 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  d before any cha
10540 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
10550 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
10560 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65  t is never.** ne
10570 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
10580 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20  a write and the 
10590 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
105a0 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a  d not be set..**
105b0 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73  .** Only databas
105c0 65 20 69 44 62 20 61 6e 64 20 74 68 65 20 74 65  e iDb and the te
105d0 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20  mp database are 
105e0 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 62 79  made writable by
105f0 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49   this call..** I
10600 66 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74  f iDb==0, then t
10610 68 65 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70  he main and temp
10620 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 6d   databases are m
10630 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20  ade writable.   
10640 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65  If.** iDb==1 the
10650 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20  n only the temp 
10660 64 61 74 61 62 61 73 65 20 69 73 20 6d 61 64 65  database is made
10670 20 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69   writable.  If i
10680 44 62 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a  Db>1 then the.**
10690 20 73 70 65 63 69 66 69 65 64 20 61 75 78 69 6c   specified auxil
106a0 69 61 72 79 20 64 61 74 61 62 61 73 65 20 61 6e  iary database an
106b0 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  d the temp datab
106c0 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69  ase are made wri
106d0 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
106e0 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
106f0 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  peration(Parse *
10700 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 43  pParse, int setC
10710 68 65 63 6b 70 6f 69 6e 74 2c 20 69 6e 74 20 69  heckpoint, int i
10720 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  Db){.  Vdbe *v;.
10730 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
10740 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
10750 20 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64   DbHasProperty(d
10760 62 2c 20 69 44 62 2c 20 44 42 5f 4c 6f 63 6b 65  b, iDb, DB_Locke
10770 64 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76  d) ) return;.  v
10780 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
10790 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
107a0 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
107b0 20 69 66 28 20 21 64 62 2d 3e 61 44 62 5b 69 44   if( !db->aDb[iD
107c0 62 5d 2e 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20  b].inTrans ){.  
107d0 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
107e0 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74  p(v, OP_Transact
107f0 69 6f 6e 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20  ion, iDb, 0);.  
10800 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28    DbSetProperty(
10810 64 62 2c 20 69 44 62 2c 20 44 42 5f 4c 6f 63 6b  db, iDb, DB_Lock
10820 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 43  ed);.    sqliteC
10830 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
10840 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
10850 20 20 69 66 28 20 69 44 62 21 3d 31 20 29 7b 0a    if( iDb!=1 ){.
10860 20 20 20 20 20 20 73 71 6c 69 74 65 42 65 67 69        sqliteBegi
10870 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
10880 70 50 61 72 73 65 2c 20 73 65 74 43 68 65 63 6b  pParse, setCheck
10890 70 6f 69 6e 74 2c 20 31 29 3b 0a 20 20 20 20 7d  point, 1);.    }
108a0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 74  .  }else if( set
108b0 43 68 65 63 6b 70 6f 69 6e 74 20 29 7b 0a 20 20  Checkpoint ){.  
108c0 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
108d0 70 28 76 2c 20 4f 50 5f 43 68 65 63 6b 70 6f 69  p(v, OP_Checkpoi
108e0 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20  nt, iDb, 0);.   
108f0 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64   DbSetProperty(d
10900 62 2c 20 69 44 62 2c 20 44 42 5f 4c 6f 63 6b 65  b, iDb, DB_Locke
10910 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  d);.  }.}../*.**
10920 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
10930 68 61 74 20 63 6f 6e 63 6c 75 64 65 73 20 61 6e  hat concludes an
10940 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20   operation that 
10950 6d 61 79 20 68 61 76 65 20 63 68 61 6e 67 65 64  may have changed
10960 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
10970 2e 20 20 49 66 20 61 20 73 74 61 74 65 6d 65 6e  .  If a statemen
10980 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
10990 73 20 73 74 61 72 74 65 64 2c 20 74 68 65 6e 20  s started, then 
109a0 65 6d 69 74 0a 2a 2a 20 61 6e 20 4f 50 5f 43 6f  emit.** an OP_Co
109b0 6d 6d 69 74 20 74 68 61 74 20 77 69 6c 6c 20 63  mmit that will c
109c0 61 75 73 65 20 74 68 65 20 63 68 61 6e 67 65 73  ause the changes
109d0 20 74 6f 20 62 65 20 63 6f 6d 6d 69 74 74 65 64   to be committed
109e0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
109f0 4e 6f 74 65 20 74 68 61 74 20 63 68 65 63 6b 70  Note that checkp
10a00 6f 69 6e 74 73 20 61 72 65 20 61 75 74 6f 6d 61  oints are automa
10a10 74 69 63 61 6c 6c 79 20 63 6f 6d 6d 69 74 74 65  tically committe
10a20 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a  d at the end of.
10a30 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 20  ** a statement. 
10a40 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
10a50 74 68 65 72 65 20 63 61 6e 20 62 65 20 6d 75 6c  there can be mul
10a60 74 69 70 6c 65 20 63 61 6c 6c 73 20 74 6f 20 0a  tiple calls to .
10a70 2a 2a 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72  ** sqliteBeginWr
10a80 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 29 20 62  iteOperation() b
10a90 75 74 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  ut there should 
10aa0 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
10ab0 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  .** call to sqli
10ac0 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  teEndWriteOperat
10ad0 69 6f 6e 28 29 20 61 74 20 74 68 65 20 63 6f 6e  ion() at the con
10ae0 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 73  clusion of the s
10af0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
10b00 64 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65  d sqliteEndWrite
10b10 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
10b20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
10b30 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64   *v;.  sqlite *d
10b40 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
10b50 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 74 72    if( pParse->tr
10b60 69 67 53 74 61 63 6b 20 29 20 72 65 74 75 72 6e  igStack ) return
10b70 3b 20 2f 2a 20 69 66 20 74 68 69 73 20 69 73 20  ; /* if this is 
10b80 69 6e 20 61 20 74 72 69 67 67 65 72 20 2a 2f 0a  in a trigger */.
10b90 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
10ba0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
10bb0 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
10bc0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67  ;.  if( db->flag
10bd0 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
10be0 6e 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 42  ns ){.    /* A B
10bf0 45 47 49 4e 20 68 61 73 20 65 78 65 63 75 74 65  EGIN has execute
10c00 64 2e 20 20 44 6f 20 6e 6f 74 20 63 6f 6d 6d 69  d.  Do not commi
10c10 74 20 75 6e 74 69 6c 20 77 65 20 73 65 65 20 61  t until we see a
10c20 6e 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20 2a  n explicit.    *
10c30 2a 20 43 4f 4d 4d 49 54 20 73 74 61 74 65 6d 65  * COMMIT stateme
10c40 6e 74 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  nt. */.  }else{.
10c50 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
10c60 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74  dOp(v, OP_Commit
10c70 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a     , 0, 0);.  }.}.