/ Hex Artifact Content
Login

Artifact dbeef48d1f6f134d8a3de9f9bb6928812c3fbfee:


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 33 20 32 30 30 34 2f 30 32 2f 32 32 20 31  173 2004/02/22 1
0300: 38 3a 35 36 3a 34 39 20 64 72 68 20 45 78 70 20  8:56:49 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 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
3a20: 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
3a30: 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
3a40: 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a  rary database ".
3a50: 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f          "file fo
3a60: 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72  r storing tempor
3a70: 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20  ary tables");.  
3a80: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
3a90: 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
3aa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3ab0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
3ac0: 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20  TE_InTrans ){.  
3ad0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 42      rc = sqliteB
3ae0: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 64  treeBeginTrans(d
3af0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a  b->aDb[1].pBt);.
3b00: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
3b10: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
3b20: 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
3b30: 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
3b40: 65 20 74 6f 20 67 65 74 20 61 20 77 72 69 74 65  e to get a write
3b50: 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20   lock on ".     
3b60: 20 20 20 20 20 22 74 68 65 20 74 65 6d 70 6f 72       "the tempor
3b70: 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  ary database fil
3b80: 65 22 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  e");.        pPa
3b90: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
3ba0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
3bb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
3bc0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
3bd0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d  he new table nam
3be0: 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69  e does not colli
3bf0: 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74  de with an exist
3c00: 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  ing.  ** index o
3c10: 72 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 49  r table name.  I
3c20: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
3c30: 73 73 61 67 65 20 69 66 20 69 74 20 64 6f 65 73  ssage if it does
3c40: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ..  **.  ** If w
3c50: 65 20 61 72 65 20 72 65 2d 72 65 61 64 69 6e 67  e are re-reading
3c60: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
3c70: 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65  er table because
3c80: 20 6f 66 20 61 20 73 63 68 65 6d 61 0a 20 20 2a   of a schema.  *
3c90: 2a 20 63 68 61 6e 67 65 20 61 6e 64 20 61 20 6e  * change and a n
3ca0: 65 77 20 70 65 72 6d 61 6e 65 6e 74 20 74 61 62  ew permanent tab
3cb0: 6c 65 20 69 73 20 66 6f 75 6e 64 20 77 68 6f 73  le is found whos
3cc0: 65 20 6e 61 6d 65 20 63 6f 6c 6c 69 64 65 73 20  e name collides 
3cd0: 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 65 78 69  with.  ** an exi
3ce0: 73 74 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20  sting temporary 
3cf0: 74 61 62 6c 65 2c 20 74 68 61 74 20 69 73 20 6e  table, that is n
3d00: 6f 74 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a  ot an error..  *
3d10: 2f 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  /.  pTable = sql
3d20: 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  iteFindTable(db,
3d30: 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 44   zName, 0);.  iD
3d40: 62 20 3d 20 69 73 54 65 6d 70 20 3f 20 31 20 3a  b = isTemp ? 1 :
3d50: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20   db->init.iDb;. 
3d60: 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 26   if( pTable!=0 &
3d70: 26 20 28 70 54 61 62 6c 65 2d 3e 69 44 62 3d 3d  & (pTable->iDb==
3d80: 69 44 62 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74  iDb || !db->init
3d90: 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 73 71  .busy) ){.    sq
3da0: 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61  liteErrorMsg(pPa
3db0: 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61  rse, "table %T a
3dc0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
3dd0: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  pName);.    sqli
3de0: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
3df0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
3e00: 20 69 66 28 20 28 70 49 64 78 20 3d 20 73 71 6c   if( (pIdx = sql
3e10: 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  iteFindIndex(db,
3e20: 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 26   zName, 0))!=0 &
3e30: 26 0a 20 20 20 20 20 20 20 20 20 20 28 70 49 64  &.          (pId
3e40: 78 2d 3e 69 44 62 3d 3d 30 20 7c 7c 20 21 64 62  x->iDb==0 || !db
3e50: 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a  ->init.busy) ){.
3e60: 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
3e70: 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
3e80: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
3e90: 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c  index named %s",
3ea0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c   zName);.    sql
3eb0: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
3ec0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
3ed0: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
3ee0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
3ef0: 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20  Table) );.  if( 
3f00: 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  pTable==0 ){.   
3f10: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
3f20: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
3f30: 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e    }.  pTable->zN
3f40: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70  ame = zName;.  p
3f50: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
3f60: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
3f70: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69  = 0;.  pTable->i
3f80: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61  PKey = -1;.  pTa
3f90: 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b  ble->pIndex = 0;
3fa0: 0a 20 20 70 54 61 62 6c 65 2d 3e 69 44 62 20 3d  .  pTable->iDb =
3fb0: 20 69 44 62 3b 0a 20 20 69 66 28 20 70 50 61 72   iDb;.  if( pPar
3fc0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 20  se->pNewTable ) 
3fd0: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
3fe0: 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e  e(db, pParse->pN
3ff0: 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72  ewTable);.  pPar
4000: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
4010: 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 42 65  pTable;..  /* Be
4020: 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74  gin generating t
4030: 68 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  he code that wil
4040: 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62  l insert the tab
4050: 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20  le record into. 
4060: 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   ** the SQLITE_M
4070: 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f  ASTER table.  No
4080: 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72  te in particular
4090: 20 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f   that we must go
40a0: 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20   ahead.  ** and 
40b0: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63  allocate the rec
40c0: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
40d0: 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e  he table entry n
40e0: 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a  ow.  Before any.
40f0: 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    ** PRIMARY KEY
4100: 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f   or UNIQUE keywo
4110: 72 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20  rds are parsed. 
4120: 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20   Those keywords 
4130: 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20  will cause.  ** 
4140: 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72  indices to be cr
4150: 65 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61  eated and the ta
4160: 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20  ble record must 
4170: 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20  come before the 
4180: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20  .  ** indices.  
4190: 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72  Hence, the recor
41a0: 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  d number for the
41b0: 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61   table must be a
41c0: 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f  llocated.  ** no
41d0: 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  w..  */.  if( !d
41e0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
41f0: 28 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64  (v = sqliteGetVd
4200: 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29  be(pParse))!=0 )
4210: 7b 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67 69  {.    sqliteBegi
4220: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
4230: 70 50 61 72 73 65 2c 20 30 2c 20 69 73 54 65 6d  pParse, 0, isTem
4240: 70 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 54  p);.    if( !isT
4250: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  emp ){.      sql
4260: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4270: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e  OP_Integer, db->
4280: 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 30 29 3b  file_format, 0);
4290: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
42a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
42b0: 43 6f 6f 6b 69 65 2c 20 30 2c 20 31 29 3b 0a 20  Cookie, 0, 1);. 
42c0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 4f     }.    sqliteO
42d0: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76  penMasterTable(v
42e0: 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 73  , isTemp);.    s
42f0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4300: 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30  , OP_NewRecno, 0
4310: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4320: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4330: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
4340: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4350: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
4360: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
4370: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
4380: 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b  utIntKey, 0, 0);
4390: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
43a0: 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74  d a new column t
43b0: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
43c0: 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
43d0: 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  tructed..**.** T
43e0: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
43f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63  this routine onc
4400: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
4410: 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a  n declaration.**
4420: 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
4430: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73  LE statement.  s
4440: 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c 65 28  qliteStartTable(
4450: 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a  ) gets called.**
4460: 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68   first to get th
4470: 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65  ings going.  The
4480: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
4490: 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63  s called for eac
44a0: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  h.** column..*/.
44b0: 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 43 6f  void sqliteAddCo
44c0: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
44d0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
44e0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
44f0: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
4500: 7a 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20  z = 0;.  Column 
4510: 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20  *pCol;.  if( (p 
4520: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
4530: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
4540: 3b 0a 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74  ;.  sqliteSetNSt
4550: 72 69 6e 67 28 26 7a 2c 20 70 4e 61 6d 65 2d 3e  ring(&z, pName->
4560: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b  z, pName->n, 0);
4570: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
4580: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 44 65  turn;.  sqliteDe
4590: 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28  quote(z);.  for(
45a0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
45b0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
45c0: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c 20 70  liteStrICmp(z, p
45d0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
45e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
45f0: 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72  iteErrorMsg(pPar
4600: 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63  se, "duplicate c
4610: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c  olumn name: %s",
4620: 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   z);.      sqlit
4630: 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20  eFree(z);.      
4640: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
4650: 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c  }.  if( (p->nCol
4660: 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20   & 0x7)==0 ){.  
4670: 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a    Column *aNew;.
4680: 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
4690: 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f  eRealloc( p->aCo
46a0: 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73  l, (p->nCol+8)*s
46b0: 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d  izeof(p->aCol[0]
46c0: 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77  ));.    if( aNew
46d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
46e0: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77    p->aCol = aNew
46f0: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26  ;.  }.  pCol = &
4700: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d  p->aCol[p->nCol]
4710: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c  ;.  memset(pCol,
4720: 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43   0, sizeof(p->aC
4730: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d  ol[0]));.  pCol-
4740: 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 20 70 43  >zName = z;.  pC
4750: 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  ol->sortOrder = 
4760: 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20  SQLITE_SO_NUM;. 
4770: 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f   p->nCol++;.}../
4780: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4790: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
47a0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
47b0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
47c0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
47d0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
47e0: 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55  ment.  A "NOT NU
47f0: 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68  LL" constraint h
4800: 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20  as.** been seen 
4810: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  on a column.  Th
4820: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
4830: 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67  the notNull flag
4840: 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   on.** the colum
4850: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
4860: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
4870: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64  */.void sqliteAd
4880: 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a  dNotNull(Parse *
4890: 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72  pParse, int onEr
48a0: 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ror){.  Table *p
48b0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
48c0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
48d0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
48e0: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
48f0: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d  Col-1;.  if( i>=
4900: 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e  0 ) p->aCol[i].n
4910: 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72  otNull = onError
4920: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
4930: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
4940: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
4950: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
4960: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
4970: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
4980: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
4990: 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73   pFirst token is
49a0: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f   the first.** to
49b0: 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65  ken in the seque
49c0: 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68  nce of tokens th
49d0: 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20  at describe the 
49e0: 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  type of the.** c
49f0: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
4a00: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4a10: 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74  on.   pLast is t
4a20: 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a  he last token.**
4a30: 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65   in the sequence
4a40: 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f  .  Use this info
4a50: 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74  rmation to const
4a60: 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a  ruct a string.**
4a70: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
4a80: 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74  he typename of t
4a90: 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74  he column and st
4aa0: 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a  ore that string.
4ab0: 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20  ** in zType..*/ 
4ac0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 43  .void sqliteAddC
4ad0: 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20  olumnType(Parse 
4ae0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
4af0: 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  pFirst, Token *p
4b00: 4c 61 73 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Last){.  Table *
4b10: 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  p;.  int i, j;. 
4b20: 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20 2a   int n;.  char *
4b30: 7a 2c 20 2a 2a 70 7a 3b 0a 20 20 43 6f 6c 75 6d  z, **pz;.  Colum
4b40: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28  n *pCol;.  if( (
4b50: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
4b60: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
4b70: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
4b80: 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29  l-1;.  if( i<0 )
4b90: 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20   return;.  pCol 
4ba0: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20  = &p->aCol[i];. 
4bb0: 20 70 7a 20 3d 20 26 70 43 6f 6c 2d 3e 7a 54 79   pz = &pCol->zTy
4bc0: 70 65 3b 0a 20 20 6e 20 3d 20 70 4c 61 73 74 2d  pe;.  n = pLast-
4bd0: 3e 6e 20 2b 20 41 64 64 72 28 70 4c 61 73 74 2d  >n + Addr(pLast-
4be0: 3e 7a 29 20 2d 20 41 64 64 72 28 70 46 69 72 73  >z) - Addr(pFirs
4bf0: 74 2d 3e 7a 29 3b 0a 20 20 73 71 6c 69 74 65 53  t->z);.  sqliteS
4c00: 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 46  etNString(pz, pF
4c10: 69 72 73 74 2d 3e 7a 2c 20 6e 2c 20 30 29 3b 0a  irst->z, n, 0);.
4c20: 20 20 7a 20 3d 20 2a 70 7a 3b 0a 20 20 69 66 28    z = *pz;.  if(
4c30: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
4c40: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69    for(i=j=0; z[i
4c50: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  ]; i++){.    int
4c60: 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 69   c = z[i];.    i
4c70: 66 28 20 69 73 73 70 61 63 65 28 63 29 20 29 20  f( isspace(c) ) 
4c80: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 5b  continue;.    z[
4c90: 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20  j++] = c;.  }.  
4ca0: 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20  z[j] = 0;.  if( 
4cb0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65  pParse->db->file
4cc0: 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20  _format>=4 ){.  
4cd0: 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65    pCol->sortOrde
4ce0: 72 20 3d 20 73 71 6c 69 74 65 43 6f 6c 6c 61 74  r = sqliteCollat
4cf0: 65 54 79 70 65 28 7a 2c 20 6e 29 3b 0a 20 20 7d  eType(z, n);.  }
4d00: 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e  else{.    pCol->
4d10: 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49  sortOrder = SQLI
4d20: 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 7d 0a 7d  TE_SO_NUM;.  }.}
4d30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67 69 76 65  ../*.** The give
4d40: 6e 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 64  n token is the d
4d50: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
4d60: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
4d70: 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65   added to.** the
4d80: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
4d90: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
4da0: 69 6f 6e 2e 20 20 49 66 20 22 6d 69 6e 75 73 46  ion.  If "minusF
4db0: 6c 61 67 22 20 69 73 20 74 72 75 65 2c 20 69 74  lag" is true, it
4dc0: 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 76 61  .** means the va
4dd0: 6c 75 65 20 74 6f 6b 65 6e 20 77 61 73 20 70 72  lue token was pr
4de0: 65 63 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75  eceded by a minu
4df0: 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  s sign..**.** Th
4e00: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
4e10: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
4e20: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
4e30: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
4e40: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
4e50: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
4e60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64  /.void sqliteAdd
4e70: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72  DefaultValue(Par
4e80: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
4e90: 6e 20 2a 70 56 61 6c 2c 20 69 6e 74 20 6d 69 6e  n *pVal, int min
4ea0: 75 73 46 6c 61 67 29 7b 0a 20 20 54 61 62 6c 65  usFlag){.  Table
4eb0: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
4ec0: 63 68 61 72 20 2a 2a 70 7a 3b 0a 20 20 69 66 28  char **pz;.  if(
4ed0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
4ee0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
4ef0: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
4f00: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30  Col-1;.  if( i<0
4f10: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 7a 20   ) return;.  pz 
4f20: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44  = &p->aCol[i].zD
4f30: 66 6c 74 3b 0a 20 20 69 66 28 20 6d 69 6e 75 73  flt;.  if( minus
4f40: 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  Flag ){.    sqli
4f50: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c  teSetNString(pz,
4f60: 20 22 2d 22 2c 20 31 2c 20 70 56 61 6c 2d 3e 7a   "-", 1, pVal->z
4f70: 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20  , pVal->n, 0);. 
4f80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
4f90: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c  teSetNString(pz,
4fa0: 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e   pVal->z, pVal->
4fb0: 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  n, 0);.  }.  sql
4fc0: 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b  iteDequote(*pz);
4fd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e  .}../*.** Design
4fe0: 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20  ate the PRIMARY 
4ff0: 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c  KEY for the tabl
5000: 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c  e.  pList is a l
5010: 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a  ist of names .**
5020: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   of columns that
5030: 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72   form the primar
5040: 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74  y key.  If pList
5050: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
5060: 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e  he.** most recen
5070: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
5080: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   of the table is
5090: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
50a0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20  ..**.** A table 
50b0: 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74  can have at most
50c0: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
50d0: 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  .  If the table 
50e0: 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61  already has.** a
50f0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e   primary key (an
5100: 64 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65  d this is the se
5110: 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79  cond primary key
5120: 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e  ) then create an
5130: 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a  .** error..**.**
5140: 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   If the PRIMARY 
5150: 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67  KEY is on a sing
5160: 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20  le column whose 
5170: 64 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45  datatype is INTE
5180: 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20  GER,.** then we 
5190: 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20  will try to use 
51a0: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74  that column as t
51b0: 68 65 20 72 6f 77 20 69 64 2e 20 20 28 45 78 63  he row id.  (Exc
51c0: 65 70 74 69 6f 6e 3a 0a 2a 2a 20 46 6f 72 20 62  eption:.** For b
51d0: 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
51e0: 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65  bility with olde
51f0: 72 20 64 61 74 61 62 61 73 65 73 2c 20 64 6f 20  r databases, do 
5200: 6e 6f 74 20 64 6f 20 74 68 69 73 0a 2a 2a 20 69  not do this.** i
5210: 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  f the file forma
5220: 74 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  t version number
5230: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2e   is less than 1.
5240: 29 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65  )  Set the Table
5250: 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20  .iPKey.** field 
5260: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  of the table und
5270: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
5280: 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20  to be the index 
5290: 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  of the.** INTEGE
52a0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
52b0: 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b  lumn.  Table.iPK
52c0: 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20  ey is set to -1 
52d0: 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  if there is.** n
52e0: 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  o INTEGER PRIMAR
52f0: 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Y KEY..**.** If 
5300: 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61  the key is not a
5310: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
5320: 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61  Y KEY, then crea
5330: 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69  te a unique.** i
5340: 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79  ndex for the key
5350: 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63  .  No index is c
5360: 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47  reated for INTEG
5370: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e  ER PRIMARY KEYs.
5380: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41  .*/.void sqliteA
5390: 64 64 50 72 69 6d 61 72 79 4b 65 79 28 50 61 72  ddPrimaryKey(Par
53a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 49 64 4c 69  se *pParse, IdLi
53b0: 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 6f  st *pList, int o
53c0: 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65  nError){.  Table
53d0: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
53e0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 68  >pNewTable;.  ch
53f0: 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  ar *zType = 0;. 
5400: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20   int iCol = -1, 
5410: 69 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  i;.  if( pTab==0
5420: 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f   ) goto primary_
5430: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20  key_exit;.  if( 
5440: 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79  pTab->hasPrimKey
5450: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72   ){.    sqliteEr
5460: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
5470: 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25        "table \"%
5480: 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61  s\" has more tha
5490: 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  n one primary ke
54a0: 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  y", pTab->zName)
54b0: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61  ;.    goto prima
54c0: 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d  ry_key_exit;.  }
54d0: 0a 20 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d  .  pTab->hasPrim
54e0: 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  Key = 1;.  if( p
54f0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  List==0 ){.    i
5500: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  Col = pTab->nCol
5510: 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e   - 1;.    pTab->
5520: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69  aCol[iCol].isPri
5530: 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  mKey = 1;.  }els
5540: 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e{.    for(i=0; 
5550: 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
5560: 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43  +){.      for(iC
5570: 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
5580: 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
5590: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
55a0: 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  teStrICmp(pList-
55b0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61  >a[i].zName, pTa
55c0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
55d0: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
55e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
55f0: 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  f( iCol<pTab->nC
5600: 6f 6c 20 29 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol ) pTab->aCol[
5610: 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20  iCol].isPrimKey 
5620: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
5630: 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3e 31 20  f( pList->nId>1 
5640: 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d  ) iCol = -1;.  }
5650: 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26  .  if( iCol>=0 &
5660: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
5670: 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  l ){.    zType =
5680: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
5690: 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69  ].zType;.  }.  i
56a0: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
56b0: 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 31 20 26 26  ile_format>=1 &&
56c0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7a 54 79   .           zTy
56d0: 70 65 20 26 26 20 73 71 6c 69 74 65 53 74 72 49  pe && sqliteStrI
56e0: 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45  Cmp(zType, "INTE
56f0: 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  GER")==0 ){.    
5700: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43  pTab->iPKey = iC
5710: 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65  ol;.    pTab->ke
5720: 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b  yConf = onError;
5730: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
5740: 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65 78 28  liteCreateIndex(
5750: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 70 4c  pParse, 0, 0, pL
5760: 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ist, onError, 0,
5770: 20 30 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d   0);.    pList =
5780: 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79   0;.  }..primary
5790: 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c  _key_exit:.  sql
57a0: 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28  iteIdListDelete(
57b0: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
57c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
57d0: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
57e0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 74 79 70 65  e collating type
57f0: 20 67 69 76 65 6e 20 61 20 74 79 70 65 20 6e 61   given a type na
5800: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  me..**.** The co
5810: 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20  llation type is 
5820: 74 65 78 74 20 28 53 51 4c 49 54 45 5f 53 4f 5f  text (SQLITE_SO_
5830: 54 45 58 54 29 20 69 66 20 74 68 65 20 74 79 70  TEXT) if the typ
5840: 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f 6e 74 61 69  e.** name contai
5850: 6e 73 20 74 68 65 20 63 68 61 72 61 63 74 65 72  ns the character
5860: 20 73 74 72 65 61 6d 20 22 74 65 78 74 22 20 6f   stream "text" o
5870: 72 20 22 62 6c 6f 62 22 20 6f 72 0a 2a 2a 20 22  r "blob" or.** "
5880: 63 6c 6f 62 22 2e 20 20 41 6e 79 20 6f 74 68 65  clob".  Any othe
5890: 72 20 74 79 70 65 20 6e 61 6d 65 20 69 73 20 63  r type name is c
58a0: 6f 6c 6c 61 74 65 64 20 61 73 20 6e 75 6d 65 72  ollated as numer
58b0: 69 63 0a 2a 2a 20 28 53 51 4c 49 54 45 5f 53 4f  ic.** (SQLITE_SO
58c0: 5f 4e 55 4d 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _NUM)..*/.int sq
58d0: 6c 69 74 65 43 6f 6c 6c 61 74 65 54 79 70 65 28  liteCollateType(
58e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
58f0: 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20  e, int nType){. 
5900: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
5910: 30 3b 20 69 3c 6e 54 79 70 65 2d 33 3b 20 69 2b  0; i<nType-3; i+
5920: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20  +){.    int c = 
5930: 2a 28 7a 54 79 70 65 2b 2b 29 20 7c 20 30 78 36  *(zType++) | 0x6
5940: 30 3b 0a 20 20 20 20 69 66 28 20 28 63 3d 3d 27  0;.    if( (c=='
5950: 62 27 20 7c 7c 20 63 3d 3d 27 63 27 29 20 26 26  b' || c=='c') &&
5960: 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28   sqliteStrNICmp(
5970: 7a 54 79 70 65 2c 20 22 6c 6f 62 22 2c 20 33 29  zType, "lob", 3)
5980: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
5990: 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45  urn SQLITE_SO_TE
59a0: 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  XT;.    }.    if
59b0: 28 20 63 3d 3d 27 63 27 20 26 26 20 73 71 6c 69  ( c=='c' && sqli
59c0: 74 65 53 74 72 4e 49 43 6d 70 28 7a 54 79 70 65  teStrNICmp(zType
59d0: 2c 20 22 68 61 72 22 2c 20 33 29 3d 3d 30 20 29  , "har", 3)==0 )
59e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
59f0: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20  QLITE_SO_TEXT;. 
5a00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d     }.    if( c==
5a10: 27 74 27 20 26 26 20 73 71 6c 69 74 65 53 74 72  't' && sqliteStr
5a20: 4e 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 65 78  NICmp(zType, "ex
5a30: 74 22 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20  t", 3)==0 ){.   
5a40: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5a50: 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a  _SO_TEXT;.    }.
5a60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
5a70: 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 7d 0a 0a 2f  ITE_SO_NUM;.}../
5a80: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5a90: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
5aa0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
5ab0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
5ac0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
5ad0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
5ae0: 6d 65 6e 74 2e 20 20 41 20 22 43 4f 4c 4c 41 54  ment.  A "COLLAT
5af0: 45 22 20 63 6c 61 75 73 65 20 68 61 73 0a 2a 2a  E" clause has.**
5b00: 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20   been seen on a 
5b10: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f  column.  This ro
5b20: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 43  utine sets the C
5b30: 6f 6c 75 6d 6e 2e 73 6f 72 74 4f 72 64 65 72 20  olumn.sortOrder 
5b40: 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  on.** the column
5b50: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
5b60: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
5b70: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64  /.void sqliteAdd
5b80: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
5b90: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 63  e *pParse, int c
5ba0: 6f 6c 6c 54 79 70 65 29 7b 0a 20 20 54 61 62 6c  ollType){.  Tabl
5bb0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
5bc0: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
5bd0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
5be0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
5bf0: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
5c00: 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b   i>=0 ) p->aCol[
5c10: 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 63  i].sortOrder = c
5c20: 6f 6c 6c 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ollType;.}../*.*
5c30: 2a 20 43 6f 6d 65 20 75 70 20 77 69 74 68 20 61  * Come up with a
5c40: 20 6e 65 77 20 72 61 6e 64 6f 6d 20 76 61 6c 75   new random valu
5c50: 65 20 66 6f 72 20 74 68 65 20 73 63 68 65 6d 61  e for the schema
5c60: 20 63 6f 6f 6b 69 65 2e 20 20 4d 61 6b 65 20 73   cookie.  Make s
5c70: 75 72 65 0a 2a 2a 20 74 68 65 20 6e 65 77 20 76  ure.** the new v
5c80: 61 6c 75 65 20 69 73 20 64 69 66 66 65 72 65 6e  alue is differen
5c90: 74 20 66 72 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a  t from the old..
5ca0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  **.** The schema
5cb0: 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20   cookie is used 
5cc0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
5cd0: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  n the schema for
5ce0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
5cf0: 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72   changes.  After
5d00: 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61   each schema cha
5d10: 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20  nge, the cookie 
5d20: 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73  value.** changes
5d30: 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73  .  When a proces
5d40: 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68  s first reads th
5d50: 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f  e schema it reco
5d60: 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69  rds the.** cooki
5d70: 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20  e.  Thereafter, 
5d80: 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73  whenever it goes
5d90: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
5da0: 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63  atabase,.** it c
5db0: 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65  hecks the cookie
5dc0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5dd0: 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74  e schema has not
5de0: 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63   changed.** sinc
5df0: 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65  e it was last re
5e00: 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70  ad..**.** This p
5e10: 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c  lan is not compl
5e20: 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f  etely bullet-pro
5e30: 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69  of.  It is possi
5e40: 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ble for.** the s
5e50: 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20  chema to change 
5e60: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61  multiple times a
5e70: 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69  nd for the cooki
5e80: 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62  e to be.** set b
5e90: 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c  ack to prior val
5ea0: 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20  ue.  But schema 
5eb0: 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72  changes are infr
5ec0: 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68  equent.** and th
5ed0: 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
5ee0: 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d   hitting the sam
5ef0: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69  e cookie value i
5f00: 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e  s only.** 1 chan
5f10: 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20  ce in 2^32.  So 
5f20: 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67  we're safe enoug
5f30: 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  h..*/.void sqlit
5f40: 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71  eChangeCookie(sq
5f50: 6c 69 74 65 20 2a 64 62 2c 20 56 64 62 65 20 2a  lite *db, Vdbe *
5f60: 76 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 65  v){.  if( db->ne
5f70: 78 74 5f 63 6f 6f 6b 69 65 3d 3d 64 62 2d 3e 61  xt_cookie==db->a
5f80: 44 62 5b 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f  Db[0].schema_coo
5f90: 6b 69 65 20 29 7b 0a 20 20 20 20 75 6e 73 69 67  kie ){.    unsig
5fa0: 6e 65 64 20 63 68 61 72 20 72 3b 0a 20 20 20 20  ned char r;.    
5fb0: 73 71 6c 69 74 65 52 61 6e 64 6f 6d 6e 65 73 73  sqliteRandomness
5fc0: 28 31 2c 20 26 72 29 3b 0a 20 20 20 20 64 62 2d  (1, &r);.    db-
5fd0: 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 20 3d 20 64  >next_cookie = d
5fe0: 62 2d 3e 61 44 62 5b 30 5d 2e 73 63 68 65 6d 61  b->aDb[0].schema
5ff0: 5f 63 6f 6f 6b 69 65 20 2b 20 72 20 2b 20 31 3b  _cookie + r + 1;
6000: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
6010: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
6020: 68 61 6e 67 65 73 3b 0a 20 20 20 20 73 71 6c 69  hanges;.    sqli
6030: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6040: 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 6e  P_Integer, db->n
6050: 65 78 74 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a  ext_cookie, 0);.
6060: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6070: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  dOp(v, OP_SetCoo
6080: 6b 69 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  kie, 0, 0);.  }.
6090: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65  }../*.** Measure
60a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
60b0: 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65 64  haracters needed
60c0: 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67   to output the g
60d0: 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69  iven.** identifi
60e0: 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  er.  The number 
60f0: 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65  returned include
6100: 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65  s any quotes use
6110: 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f  d.** but does no
6120: 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75  t include the nu
6130: 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a  ll terminator..*
6140: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65  /.static int ide
6150: 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63  ntLength(const c
6160: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e  har *z){.  int n
6170: 3b 0a 20 20 69 6e 74 20 6e 65 65 64 51 75 6f 74  ;.  int needQuot
6180: 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6e 3d 30  e = 0;.  for(n=0
6190: 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b  ; *z; n++, z++){
61a0: 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 27  .    if( *z=='\'
61b0: 27 20 29 7b 20 6e 2b 2b 3b 20 6e 65 65 64 51 75  ' ){ n++; needQu
61c0: 6f 74 65 3d 31 3b 20 7d 0a 20 20 7d 0a 20 20 72  ote=1; }.  }.  r
61d0: 65 74 75 72 6e 20 6e 20 2b 20 6e 65 65 64 51 75  eturn n + needQu
61e0: 6f 74 65 2a 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ote*2;.}../*.** 
61f0: 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69 66  Write an identif
6200: 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ier onto the end
6210: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73 74   of the given st
6220: 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75  ring.  Add.** qu
6230: 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20 61  ote characters a
6240: 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  s needed..*/.sta
6250: 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75  tic void identPu
6260: 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a  t(char *z, int *
6270: 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 49 64 65  pIdx, char *zIde
6280: 6e 74 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  nt){.  int i, j,
6290: 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20   needQuote;.  i 
62a0: 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a  = *pIdx;.  for(j
62b0: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
62c0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73  ++){.    if( !is
62d0: 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29  alnum(zIdent[j])
62e0: 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27   && zIdent[j]!='
62f0: 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  _' ) break;.  }.
6300: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a    needQuote =  z
6310: 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69  Ident[j]!=0 || i
6320: 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d  sdigit(zIdent[0]
6330: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
6340: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 4b 65 79      || sqliteKey
6350: 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c  wordCode(zIdent,
6360: 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66   j)!=TK_ID;.  if
6370: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
6380: 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 66  i++] = '\'';.  f
6390: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
63a0: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69  ]; j++){.    z[i
63b0: 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b  ++] = zIdent[j];
63c0: 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b  .    if( zIdent[
63d0: 6a 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b 69 2b 2b  j]=='\'' ) z[i++
63e0: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a 20 20  ] = '\'';.  }.  
63f0: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
6400: 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20  z[i++] = '\'';. 
6410: 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49   z[i] = 0;.  *pI
6420: 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx = i;.}../*.**
6430: 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41   Generate a CREA
6440: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
6450: 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  nt appropriate f
6460: 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
6470: 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74  table.  Memory t
6480: 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20  o hold the text 
6490: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
64a0: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
64b0: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
64c0: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
64d0: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
64e0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
64f0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
6500: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 54  reateTableStmt(T
6510: 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  able *p){.  int 
6520: 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20  i, k, n;.  char 
6530: 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a  *zStmt;.  char *
6540: 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a  zSep, *zSep2, *z
6550: 45 6e 64 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  End;.  n = 0;.  
6560: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
6570: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20  ol; i++){.    n 
6580: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
6590: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
65a0: 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65  ;.  }.  n += ide
65b0: 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d  ntLength(p->zNam
65c0: 65 29 3b 0a 20 20 69 66 28 20 6e 3c 34 30 20 29  e);.  if( n<40 )
65d0: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b  {.    zSep = "";
65e0: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22  .    zSep2 = ","
65f0: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22  ;.    zEnd = ")"
6600: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
6610: 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20  Sep = "\n  ";.  
6620: 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20    zSep2 = ",\n  
6630: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c  ";.    zEnd = "\
6640: 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  n)";.  }.  n += 
6650: 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a  35 + 6*p->nCol;.
6660: 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
6670: 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b 0a  MallocRaw( n );.
6680: 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29    if( zStmt==0 )
6690: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 74 72   return 0;.  str
66a0: 63 70 79 28 7a 53 74 6d 74 2c 20 70 2d 3e 69 44  cpy(zStmt, p->iD
66b0: 62 3d 3d 31 20 3f 20 22 43 52 45 41 54 45 20 54  b==1 ? "CREATE T
66c0: 45 4d 50 20 54 41 42 4c 45 20 22 20 3a 20 22 43  EMP TABLE " : "C
66d0: 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a  REATE TABLE ");.
66e0: 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74    k = strlen(zSt
66f0: 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28  mt);.  identPut(
6700: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e  zStmt, &k, p->zN
6710: 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b  ame);.  zStmt[k+
6720: 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28  +] = '(';.  for(
6730: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
6740: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63 70 79  i++){.    strcpy
6750: 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70  (&zStmt[k], zSep
6760: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c  );.    k += strl
6770: 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20  en(&zStmt[k]);. 
6780: 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b     zSep = zSep2;
6790: 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53  .    identPut(zS
67a0: 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 61 43 6f 6c  tmt, &k, p->aCol
67b0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
67c0: 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b    strcpy(&zStmt[
67d0: 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74  k], zEnd);.  ret
67e0: 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a  urn zStmt;.}../*
67f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6800: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
6810: 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22  port the final "
6820: 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  )" that terminat
6830: 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54  es.** a CREATE T
6840: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
6850: 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
6860: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f  structure that o
6870: 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74  ther action rout
6880: 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62  ines have been b
6890: 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64  uilding.** is ad
68a0: 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ded to the inter
68b0: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c  nal hash tables,
68c0: 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   assuming no err
68d0: 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75  ors have.** occu
68e0: 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  rred..**.** An e
68f0: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62  ntry for the tab
6900: 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68  le is made in th
6910: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f  e master table o
6920: 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a  n disk, unless.*
6930: 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  * this is a temp
6940: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64  orary table or d
6950: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e  b->init.busy==1.
6960: 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e    When db->init.
6970: 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65  busy==1.** it me
6980: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
6990: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
69a0: 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75  ster table becau
69b0: 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f  se we just.** co
69c0: 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64  nnected to the d
69d0: 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75  atabase or becau
69e0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  se the sqlite_ma
69f0: 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a  ster table has.*
6a00: 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67  * recently chang
6a10: 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79  es, so the entry
6a20: 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
6a30: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
6a40: 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f  n.** the sqlite_
6a50: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57  master table.  W
6a60: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
6a70: 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e   create it again
6a80: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
6a90: 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20  Select argument 
6aa0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
6ab0: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
6ac0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63  routine.** was c
6ad0: 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
6ae0: 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  a table generate
6af0: 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52  d from a .** "CR
6b00: 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41  EATE TABLE ... A
6b10: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74  S SELECT ..." st
6b20: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f  atement.  The co
6b30: 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a  lumn names of.**
6b40: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77   the new table w
6b50: 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65  ill match the re
6b60: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
6b70: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
6b80: 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 50  sqliteEndTable(P
6b90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
6ba0: 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65 6c 65 63  ken *pEnd, Selec
6bb0: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
6bc0: 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74  able *p;.  sqlit
6bd0: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
6be0: 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64  db;..  if( (pEnd
6bf0: 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d  ==0 && pSelect==
6c00: 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  0) || pParse->nE
6c10: 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c  rr || sqlite_mal
6c20: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
6c30: 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  urn;.  p = pPars
6c40: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
6c50: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
6c60: 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  n;..  /* If the 
6c70: 74 61 62 6c 65 20 69 73 20 67 65 6e 65 72 61 74  table is generat
6c80: 65 64 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54  ed from a SELECT
6c90: 2c 20 74 68 65 6e 20 63 6f 6e 73 74 72 75 63 74  , then construct
6ca0: 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 20 6f   the.  ** list o
6cb0: 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68  f columns and th
6cc0: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 74 61  e text of the ta
6cd0: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
6ce0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 54  pSelect ){.    T
6cf0: 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 20 3d 20  able *pSelTab = 
6d00: 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f  sqliteResultSetO
6d10: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
6d20: 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  0, pSelect);.   
6d30: 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20   if( pSelTab==0 
6d40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 61 73  ) return;.    as
6d50: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30  sert( p->aCol==0
6d60: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 20   );.    p->nCol 
6d70: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
6d80: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70  .    p->aCol = p
6d90: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
6da0: 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
6db0: 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  = 0;.    pSelTab
6dc0: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
6dd0: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
6de0: 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20  e(0, pSelTab);. 
6df0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
6e00: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
6e10: 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61   1 it means we a
6e20: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53  re reading the S
6e30: 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20  QL off the.  ** 
6e40: 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20  "sqlite_master" 
6e50: 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f  or "sqlite_temp_
6e60: 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e  master" table on
6e70: 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20   the disk..  ** 
6e80: 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  So do not write 
6e90: 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61 69  to the disk agai
6ea0: 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20  n.  Extract the 
6eb0: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
6ec0: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61  .  ** for the ta
6ed0: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d  ble from the db-
6ee0: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69  >init.newTnum fi
6ef0: 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20  eld.  (The page 
6f00: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75  number.  ** shou
6f10: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74  ld have been put
6f20: 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71   there by the sq
6f30: 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69  liteOpenCb routi
6f40: 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ne.).  */.  if( 
6f50: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
6f60: 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64  .    p->tnum = d
6f70: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
6f80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  .  }..  /* If no
6f90: 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20  t initializing, 
6fa0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72 65  then create a re
6fb0: 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77  cord for the new
6fc0: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74   table.  ** in t
6fd0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
6fe0: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61   table of the da
6ff0: 74 61 62 61 73 65 2e 20 20 54 68 65 20 72 65 63  tabase.  The rec
7000: 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  ord number.  ** 
7010: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
7020: 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64 20 61  e entry should a
7030: 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74 68 65  lready be on the
7040: 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a   stack..  **.  *
7050: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 54  * If this is a T
7060: 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20  EMPORARY table, 
7070: 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79 20  write the entry 
7080: 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61  into the auxilia
7090: 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73  ry.  ** file ins
70a0: 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65  tead of into the
70b0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
70c0: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
70d0: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
70e0: 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
70f0: 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20 76   Vdbe *v;..    v
7100: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
7110: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
7120: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
7130: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c  .    if( p->pSel
7140: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect==0 ){.      
7150: 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62  /* A regular tab
7160: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  le */.      sqli
7170: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7180: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 30  P_CreateTable, 0
7190: 2c 20 70 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20  , p->iDb);.     
71a0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
71b0: 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP3(v, -1, (char
71c0: 20 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20 50 33 5f   *)&p->tnum, P3_
71d0: 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d 65  POINTER);.    }e
71e0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
71f0: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 71  view */.      sq
7200: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7210: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
7220: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  0);.    }.    p-
7230: 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 73  >tnum = 0;.    s
7240: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
7250: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
7260: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
7270: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
7280: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  ng, 0, 0);.    i
7290: 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  f( p->pSelect==0
72a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
72b0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
72c0: 2d 31 2c 20 22 74 61 62 6c 65 22 2c 20 50 33 5f  -1, "table", P3_
72d0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 65 6c  STATIC);.    }el
72e0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
72f0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
7300: 2d 31 2c 20 22 76 69 65 77 22 2c 20 50 33 5f 53  -1, "view", P3_S
7310: 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  TATIC);.    }.  
7320: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7330: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
7340: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
7350: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
7360: 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30   -1, p->zName, 0
7370: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
7380: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
7390: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
73a0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
73b0: 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61  P3(v, -1, p->zNa
73c0: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  me, 0);.    sqli
73d0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
73e0: 50 5f 44 75 70 2c 20 34 2c 20 30 29 3b 0a 20 20  P_Dup, 4, 0);.  
73f0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7400: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
7410: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
7420: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
7430: 63 68 61 72 20 2a 7a 20 3d 20 63 72 65 61 74 65  char *z = create
7440: 54 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20 20  TableStmt(p);.  
7450: 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73 74 72 6c      n = z ? strl
7460: 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 20 20 20  en(z) : 0;.     
7470: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
7480: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e 29  eP3(v, -1, z, n)
7490: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
74a0: 65 65 28 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ee(z);.    }else
74b0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
74c0: 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 20  pEnd!=0 );.     
74d0: 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e   n = Addr(pEnd->
74e0: 7a 29 20 2d 20 41 64 64 72 28 70 50 61 72 73 65  z) - Addr(pParse
74f0: 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 29  ->sFirstToken.z)
7500: 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   + 1;.      sqli
7510: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
7520: 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 73 46  , -1, pParse->sF
7530: 69 72 73 74 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b  irstToken.z, n);
7540: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
7550: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
7560: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20  _MakeRecord, 5, 
7570: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
7580: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
7590: 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a  tIntKey, 0, 0);.
75a0: 20 20 20 20 69 66 28 20 21 70 2d 3e 69 44 62 20      if( !p->iDb 
75b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43  ){.      sqliteC
75c0: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20  hangeCookie(db, 
75d0: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  v);.    }.    sq
75e0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
75f0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
7600: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  ;.    if( pSelec
7610: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
7620: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
7630: 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e 69 44 62  _Integer, p->iDb
7640: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
7650: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7660: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20  P_OpenWrite, 1, 
7670: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
7680: 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20  ->nTab = 2;.    
7690: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70    sqliteSelect(p
76a0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
76b0: 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30 2c  SRT_Table, 1, 0,
76c0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
76d0: 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65    sqliteEndWrite
76e0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
76f0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  );.  }..  /* Add
7700: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68   the table to th
7710: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
7720: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
7730: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  e database..  */
7740: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
7750: 78 70 6c 61 69 6e 3d 3d 30 20 26 26 20 70 50 61  xplain==0 && pPa
7760: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
7770: 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b      Table *pOld;
7780: 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  .    FKey *pFKey
7790: 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
77a0: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
77b0: 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 74  b->aDb[p->iDb].t
77c0: 62 6c 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20  blHash, .       
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77e0: 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73       p->zName, s
77f0: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
7800: 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  1, p);.    if( p
7810: 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
7820: 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
7830: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
7840: 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
7850: 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
7860: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  */.      return;
7870: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
7880: 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70  FKey=p->pFKey; p
7890: 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65  FKey; pFKey=pFKe
78a0: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20  y->pNextFrom){. 
78b0: 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73       int nTo = s
78c0: 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f  trlen(pFKey->zTo
78d0: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 4b  ) + 1;.      pFK
78e0: 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71  ey->pNextTo = sq
78f0: 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 64 62  liteHashFind(&db
7900: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61 46  ->aDb[p->iDb].aF
7910: 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c  Key, pFKey->zTo,
7920: 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c   nTo);.      sql
7930: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
7940: 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61  b->aDb[p->iDb].a
7950: 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f  FKey, pFKey->zTo
7960: 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20  , nTo, pFKey);. 
7970: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
7980: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a  >pNewTable = 0;.
7990: 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b      db->nTable++
79a0: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
79b0: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
79c0: 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a  Changes;.  }.}..
79d0: 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  /*.** The parser
79e0: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
79f0: 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ine in order to 
7a00: 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45  create a new VIE
7a10: 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  W.*/.void sqlite
7a20: 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61  CreateView(.  Pa
7a30: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7a40: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
7a50: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
7a60: 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20  en *pBegin,     
7a70: 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
7a80: 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
7a90: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
7aa0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
7ab0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b        /* The tok
7ac0: 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  en that holds th
7ad0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  e name of the vi
7ae0: 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ew */.  Select *
7af0: 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20  pSelect,   /* A 
7b00: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
7b10: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
7b20: 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a  e the new view *
7b30: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 20  /.  int isTemp  
7b40: 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66         /* TRUE f
7b50: 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76  or a TEMPORARY v
7b60: 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  iew */.){.  Tabl
7b70: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  e *p;.  int n;. 
7b80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
7b90: 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20    Token sEnd;.  
7ba0: 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 0a 20  DbFixer sFix;.. 
7bb0: 20 73 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c   sqliteStartTabl
7bc0: 65 28 70 50 61 72 73 65 2c 20 70 42 65 67 69 6e  e(pParse, pBegin
7bd0: 2c 20 70 4e 61 6d 65 2c 20 69 73 54 65 6d 70 2c  , pName, isTemp,
7be0: 20 31 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73   1);.  p = pPars
7bf0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
7c00: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72  if( p==0 || pPar
7c10: 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
7c20: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65  sqliteSelectDele
7c30: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  te(pSelect);.   
7c40: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
7c50: 66 28 20 73 71 6c 69 74 65 46 69 78 49 6e 69 74  f( sqliteFixInit
7c60: 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
7c70: 70 2d 3e 69 44 62 2c 20 22 76 69 65 77 22 2c 20  p->iDb, "view", 
7c80: 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20 73 71  pName).    && sq
7c90: 6c 69 74 65 46 69 78 53 65 6c 65 63 74 28 26 73  liteFixSelect(&s
7ca0: 46 69 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20  Fix, pSelect).  
7cb0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c  ){.    sqliteSel
7cc0: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
7cd0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
7ce0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61    }..  /* Make a
7cf0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74   copy of the ent
7d00: 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ire SELECT state
7d10: 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
7d20: 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a  s the view..  **
7d30: 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65   This will force
7d40: 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f   all the Expr.to
7d50: 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20  ken.z values to 
7d60: 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  be dynamically. 
7d70: 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61   ** allocated ra
7d80: 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20  ther than point 
7d90: 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  to the input str
7da0: 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e  ing - which mean
7db0: 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79  s that.  ** they
7dc0: 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66   will persist af
7dd0: 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ter the current 
7de0: 73 71 6c 69 74 65 5f 65 78 65 63 28 29 20 63 61  sqlite_exec() ca
7df0: 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f  ll returns..  */
7e00: 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20  .  p->pSelect = 
7e10: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 75 70 28  sqliteSelectDup(
7e20: 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
7e30: 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  teSelectDelete(p
7e40: 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 21  Select);.  if( !
7e50: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74  pParse->db->init
7e60: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c  .busy ){.    sql
7e70: 69 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  iteViewGetColumn
7e80: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29  Names(pParse, p)
7e90: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
7ea0: 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
7eb0: 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  e CREATE VIEW st
7ec0: 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73  atement.  Make s
7ed0: 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a  End point to.  *
7ee0: 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a  * the end..  */.
7ef0: 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d    sEnd = pParse-
7f00: 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69  >sLastToken;.  i
7f10: 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20  f( sEnd.z[0]!=0 
7f20: 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b  && sEnd.z[0]!=';
7f30: 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20  ' ){.    sEnd.z 
7f40: 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20  += sEnd.n;.  }. 
7f50: 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e   sEnd.n = 0;.  n
7f60: 20 3d 20 28 28 69 6e 74 29 73 45 6e 64 2e 7a 29   = ((int)sEnd.z)
7f70: 20 2d 20 28 69 6e 74 29 70 42 65 67 69 6e 2d 3e   - (int)pBegin->
7f80: 7a 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d  z;.  z = pBegin-
7f90: 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30  >z;.  while( n>0
7fa0: 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27   && (z[n-1]==';'
7fb0: 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d   || isspace(z[n-
7fc0: 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  1])) ){ n--; }. 
7fd0: 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31   sEnd.z = &z[n-1
7fe0: 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b  ];.  sEnd.n = 1;
7ff0: 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74  ..  /* Use sqlit
8000: 65 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61  eEndTable() to a
8010: 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74  dd the view to t
8020: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
8030: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
8040: 74 65 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73  teEndTable(pPars
8050: 65 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20  e, &sEnd, 0);.  
8060: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
8070: 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   The Table struc
8080: 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72  ture pTable is r
8090: 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46  eally a VIEW.  F
80a0: 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73  ill in the names
80b0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   of.** the colum
80c0: 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69  ns of the view i
80d0: 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72  n the pTable str
80e0: 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20  ucture.  Return 
80f0: 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
8100: 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20   errors.  If an 
8110: 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65  error is seen le
8120: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
8130: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
8140: 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
8150: 73 71 6c 69 74 65 56 69 65 77 47 65 74 43 6f 6c  sqliteViewGetCol
8160: 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a  umnNames(Parse *
8170: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
8180: 54 61 62 6c 65 29 7b 0a 20 20 45 78 70 72 4c 69  Table){.  ExprLi
8190: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 53 65  st *pEList;.  Se
81a0: 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 54 61  lect *pSel;.  Ta
81b0: 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20  ble *pSelTab;.  
81c0: 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20  int nErr = 0;.. 
81d0: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
81e0: 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74  );..  /* A posit
81f0: 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74  ive nCol means t
8200: 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73  he columns names
8210: 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61   for this view a
8220: 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  re.  ** already 
8230: 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  known..  */.  if
8240: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30  ( pTable->nCol>0
8250: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
8260: 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43  /* A negative nC
8270: 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  ol is a special 
8280: 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74  marker meaning t
8290: 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65  hat we are curre
82a0: 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67  ntly.  ** trying
82b0: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
82c0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49  column names.  I
82d0: 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20  f we enter this 
82e0: 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a  routine with.  *
82f0: 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * a negative nCo
8300: 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20  l, it means two 
8310: 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f  or more views fo
8320: 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20  rm a loop, like 
8330: 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
8340: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
8350: 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20  one AS SELECT * 
8360: 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20  FROM two;.  **  
8370: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74     CREATE VIEW t
8380: 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  wo AS SELECT * F
8390: 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20  ROM one;.  **.  
83a0: 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69  ** Actually, thi
83b0: 73 20 65 72 72 6f 72 20 69 73 20 63 61 75 67 68  s error is caugh
83c0: 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64  t previously and
83d0: 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
83e0: 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75  g test.  ** shou
83f0: 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20  ld always fail. 
8400: 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61   But we will lea
8410: 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a  ve it in place j
8420: 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a  ust to be safe..
8430: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
8440: 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  e->nCol<0 ){.   
8450: 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28   sqliteErrorMsg(
8460: 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73  pParse, "view %s
8470: 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64   is circularly d
8480: 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d  efined", pTable-
8490: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
84a0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
84b0: 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
84c0: 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65  far, it means we
84d0: 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   need to compute
84e0: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73   the table names
84f0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
8500: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
8510: 20 29 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d   ); /* If nCol==
8520: 30 2c 20 74 68 65 6e 20 70 54 61 62 6c 65 20 6d  0, then pTable m
8530: 75 73 74 20 62 65 20 61 20 56 49 45 57 20 2a 2f  ust be a VIEW */
8540: 0a 20 20 70 53 65 6c 20 3d 20 70 54 61 62 6c 65  .  pSel = pTable
8550: 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a  ->pSelect;..  /*
8560: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63   Note that the c
8570: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 52 65 73  all to sqliteRes
8580: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
8590: 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79   will expand any
85a0: 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e  .  ** "*" elemen
85b0: 74 73 20 69 6e 20 74 68 69 73 20 6c 69 73 74 2e  ts in this list.
85c0: 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6e 65    But we will ne
85d0: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
85e0: 65 20 6c 69 73 74 0a 20 20 2a 2a 20 62 61 63 6b  e list.  ** back
85f0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
8600: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61   configuration a
8610: 66 74 65 72 77 61 72 64 73 2c 20 73 6f 20 77 65  fterwards, so we
8620: 20 73 61 76 65 20 61 20 63 6f 70 79 20 6f 66 0a   save a copy of.
8630: 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61    ** the origina
8640: 6c 20 69 6e 20 70 45 4c 69 73 74 2e 0a 20 20 2a  l in pEList..  *
8650: 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  /.  pEList = pSe
8660: 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 53 65  l->pEList;.  pSe
8670: 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  l->pEList = sqli
8680: 74 65 45 78 70 72 4c 69 73 74 44 75 70 28 70 45  teExprListDup(pE
8690: 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 70 53 65  List);.  if( pSe
86a0: 6c 2d 3e 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a  l->pEList==0 ){.
86b0: 20 20 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74      pSel->pEList
86c0: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 72   = pEList;.    r
86d0: 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c  eturn 1;  /* Mal
86e0: 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  loc failed */.  
86f0: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  }.  pTable->nCol
8700: 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62   = -1;.  pSelTab
8710: 20 3d 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53   = sqliteResultS
8720: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
8730: 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 69  e, 0, pSel);.  i
8740: 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20  f( pSelTab ){.  
8750: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
8760: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
8770: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
8780: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
8790: 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20     pTable->aCol 
87a0: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
87b0: 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43  .    pSelTab->nC
87c0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c  ol = 0;.    pSel
87d0: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
87e0: 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54     sqliteDeleteT
87f0: 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29  able(0, pSelTab)
8800: 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65  ;.    DbSetPrope
8810: 72 74 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  rty(pParse->db, 
8820: 70 54 61 62 6c 65 2d 3e 69 44 62 2c 20 44 42 5f  pTable->iDb, DB_
8830: 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 20  UnresetViews);. 
8840: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62   }else{.    pTab
8850: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->nCol = 0;.  
8860: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20    nErr++;.  }.  
8870: 73 71 6c 69 74 65 53 65 6c 65 63 74 55 6e 62 69  sqliteSelectUnbi
8880: 6e 64 28 70 53 65 6c 29 3b 0a 20 20 73 71 6c 69  nd(pSel);.  sqli
8890: 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  teExprListDelete
88a0: 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a  (pSel->pEList);.
88b0: 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d    pSel->pEList =
88c0: 20 70 45 4c 69 73 74 3b 0a 20 20 72 65 74 75 72   pEList;.  retur
88d0: 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a  n nErr;  .}../*.
88e0: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c  ** Clear the col
88f0: 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74  umn names from t
8900: 68 65 20 56 49 45 57 20 70 54 61 62 6c 65 2e 0a  he VIEW pTable..
8910: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8920: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
8930: 6e 65 76 65 72 20 61 6e 79 20 6f 74 68 65 72 20  never any other 
8940: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73  table or view is
8950: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 54 68   modified..** Th
8960: 65 20 76 69 65 77 20 70 61 73 73 65 64 20 69 6e  e view passed in
8970: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
8980: 6d 69 67 68 74 20 64 65 70 65 6e 64 20 64 69 72  might depend dir
8990: 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63  ectly or indirec
89a0: 74 6c 79 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f  tly.** on the mo
89b0: 64 69 66 69 65 64 20 6f 72 20 64 65 6c 65 74 65  dified or delete
89c0: 64 20 74 61 62 6c 65 20 73 6f 20 77 65 20 6e 65  d table so we ne
89d0: 65 64 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20  ed to clear the 
89e0: 6f 6c 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61  old column.** na
89f0: 6d 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  mes so that they
8a00: 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 6d 70 75   will be recompu
8a10: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
8a20: 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
8a30: 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54  setColumnNames(T
8a40: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
8a50: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 54   int i;.  if( pT
8a60: 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c  able==0 || pTabl
8a70: 65 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20  e->pSelect==0 ) 
8a80: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 54  return;.  if( pT
8a90: 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 30 20 29 20  able->nCol==0 ) 
8aa0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
8ab0: 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f  0; i<pTable->nCo
8ac0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  l; i++){.    sql
8ad0: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e  iteFree(pTable->
8ae0: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  aCol[i].zName);.
8af0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
8b00: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  Table->aCol[i].z
8b10: 44 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Dflt);.    sqlit
8b20: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
8b30: 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20  ol[i].zType);.  
8b40: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
8b50: 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20  Table->aCol);.  
8b60: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30  pTable->aCol = 0
8b70: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ;.  pTable->nCol
8b80: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
8b90: 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
8ba0: 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79  names from every
8bb0: 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73   VIEW in databas
8bc0: 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  e idx..*/.static
8bd0: 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77   void sqliteView
8be0: 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 20  ResetAll(sqlite 
8bf0: 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20  *db, int idx){. 
8c00: 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20   HashElem *i;.  
8c10: 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72  if( !DbHasProper
8c20: 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
8c30: 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72  nresetViews) ) r
8c40: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73  eturn;.  for(i=s
8c50: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
8c60: 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 74 62 6c  db->aDb[idx].tbl
8c70: 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69  Hash); i; i=sqli
8c80: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
8c90: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
8ca0: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
8cb0: 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  (i);.    if( pTa
8cc0: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
8cd0: 20 20 20 20 73 71 6c 69 74 65 56 69 65 77 52 65      sqliteViewRe
8ce0: 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  setColumnNames(p
8cf0: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tab);.    }.  }.
8d00: 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74    DbClearPropert
8d10: 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
8d20: 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 0a  resetViews);.}..
8d30: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f  /*.** Given a to
8d40: 6b 65 6e 2c 20 6c 6f 6f 6b 20 75 70 20 61 20 74  ken, look up a t
8d50: 61 62 6c 65 20 77 69 74 68 20 74 68 61 74 20 6e  able with that n
8d60: 61 6d 65 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75  ame.  If not fou
8d70: 6e 64 2c 20 6c 65 61 76 65 0a 2a 2a 20 61 6e 20  nd, leave.** an 
8d80: 65 72 72 6f 72 20 66 6f 72 20 74 68 65 20 70 61  error for the pa
8d90: 72 73 65 72 20 74 6f 20 66 69 6e 64 20 61 6e 64  rser to find and
8da0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
8db0: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 54 61  .Table *sqliteTa
8dc0: 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 50 61 72  bleFromToken(Par
8dd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
8de0: 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20 63 68 61 72  n *pTok){.  char
8df0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 54 61 62 6c 65   *zName;.  Table
8e00: 20 2a 70 54 61 62 3b 0a 20 20 7a 4e 61 6d 65 20   *pTab;.  zName 
8e10: 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d  = sqliteTableNam
8e20: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29  eFromToken(pTok)
8e30: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
8e40: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
8e50: 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  Tab = sqliteFind
8e60: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
8e70: 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73  , zName, 0);.  s
8e80: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
8e90: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
8ea0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72  ){.    sqliteErr
8eb0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
8ec0: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 54  o such table: %T
8ed0: 22 2c 20 70 54 6f 6b 29 3b 0a 20 20 7d 0a 20 20  ", pTok);.  }.  
8ee0: 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
8ef0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
8f00: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
8f10: 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61  do the work of a
8f20: 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74   DROP TABLE stat
8f30: 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20  ement..** pName 
8f40: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
8f50: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64  he table to be d
8f60: 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ropped..*/.void 
8f70: 73 71 6c 69 74 65 44 72 6f 70 54 61 62 6c 65 28  sqliteDropTable(
8f80: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
8f90: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  oken *pName, int
8fa0: 20 69 73 56 69 65 77 29 7b 0a 20 20 54 61 62 6c   isView){.  Tabl
8fb0: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 56 64 62  e *pTable;.  Vdb
8fc0: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 62 61 73 65  e *v;.  int base
8fd0: 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
8fe0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
8ff0: 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70  nt iDb;..  if( p
9000: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
9010: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
9020: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
9030: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 54  pTable = sqliteT
9040: 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  ableFromToken(pP
9050: 61 72 73 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  arse, pName);.  
9060: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20  if( pTable==0 ) 
9070: 72 65 74 75 72 6e 3b 0a 20 20 69 44 62 20 3d 20  return;.  iDb = 
9080: 70 54 61 62 6c 65 2d 3e 69 44 62 3b 0a 20 20 61  pTable->iDb;.  a
9090: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
90a0: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
90b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
90c0: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
90d0: 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
90e0: 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  de;.    const ch
90f0: 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
9100: 41 5f 54 41 42 4c 45 28 70 54 61 62 6c 65 2d 3e  A_TABLE(pTable->
9110: 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  iDb);.    const 
9120: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
9130: 61 44 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62 5d  aDb[pTable->iDb]
9140: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
9150: 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28  sqliteAuthCheck(
9160: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
9170: 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
9180: 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 72 65 74  zDb)){.      ret
9190: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
91a0: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
91b0: 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b     if( iDb==1 ){
91c0: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
91d0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
91e0: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
91f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
9200: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
9210: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
9220: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
9230: 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  ( iDb==1 ){.    
9240: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
9250: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
9260: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
9270: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
9280: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
9290: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
92a0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75      if( sqliteAu
92b0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
92c0: 63 6f 64 65 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  code, pTable->zN
92d0: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
92e0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
92f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
9300: 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  teAuthCheck(pPar
9310: 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
9320: 45 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  E, pTable->zName
9330: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
9340: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
9350: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
9360: 28 20 70 54 61 62 6c 65 2d 3e 72 65 61 64 4f 6e  ( pTable->readOn
9370: 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ly ){.    sqlite
9380: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9390: 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
93a0: 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
93b0: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
93c0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
93d0: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
93e0: 20 20 7d 0a 20 20 69 66 28 20 69 73 56 69 65 77    }.  if( isView
93f0: 20 26 26 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c   && pTable->pSel
9400: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
9410: 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61  liteErrorMsg(pPa
9420: 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54  rse, "use DROP T
9430: 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74  ABLE to delete t
9440: 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 6c 65  able %s", pTable
9450: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
9460: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
9470: 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62 6c  !isView && pTabl
9480: 65 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  e->pSelect ){.  
9490: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
94a0: 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
94b0: 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74  OP VIEW to delet
94c0: 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62  e view %s", pTab
94d0: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  le->zName);.    
94e0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
94f0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
9500: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61  to remove the ta
9510: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  ble from the mas
9520: 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ter table.  ** o
9530: 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76  n disk..  */.  v
9540: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
9550: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
9560: 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  v ){.    static 
9570: 56 64 62 65 4f 70 4c 69 73 74 20 64 72 6f 70 54  VdbeOpList dropT
9580: 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  able[] = {.     
9590: 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20   { OP_Rewind,   
95a0: 20 20 30 2c 20 41 44 44 52 28 38 29 2c 20 20 30    0, ADDR(8),  0
95b0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74  },.      { OP_St
95c0: 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20  ring,     0, 0, 
95d0: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20         0}, /* 1 
95e0: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65  */.      { OP_Me
95f0: 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20  mStore,   1, 1, 
9600: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
9610: 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20   { OP_MemLoad,  
9620: 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30    1, 0,        0
9630: 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20  }, /* 3 */.     
9640: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20   { OP_Column,   
9650: 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30    0, 2,        0
9660: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65  },.      { OP_Ne
9670: 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41 44 44  ,         0, ADD
9680: 52 28 37 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20  R(7),  0},.     
9690: 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20   { OP_Delete,   
96a0: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30    0, 0,        0
96b0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65  },.      { OP_Ne
96c0: 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44  xt,       0, ADD
96d0: 52 28 33 29 2c 20 20 30 7d 2c 20 2f 2a 20 37 20  R(3),  0}, /* 7 
96e0: 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 49 6e  */.    };.    In
96f0: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 54  dex *pIdx;.    T
9700: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
9710: 3b 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67 69  ;.    sqliteBegi
9720: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
9730: 70 50 61 72 73 65 2c 20 30 2c 20 70 54 61 62 6c  pParse, 0, pTabl
9740: 65 2d 3e 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a  e->iDb);..    /*
9750: 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65   Drop all trigge
9760: 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
9770: 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  th the table bei
9780: 6e 67 20 64 72 6f 70 70 65 64 20 2a 2f 0a 20 20  ng dropped */.  
9790: 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 61    pTrigger = pTa
97a0: 62 6c 65 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20  ble->pTrigger;. 
97b0: 20 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67     while( pTrigg
97c0: 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  er ){.      asse
97d0: 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 69 44  rt( pTrigger->iD
97e0: 62 3d 3d 70 54 61 62 6c 65 2d 3e 69 44 62 20 7c  b==pTable->iDb |
97f0: 7c 20 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d  | pTrigger->iDb=
9800: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
9810: 74 65 44 72 6f 70 54 72 69 67 67 65 72 50 74 72  teDropTriggerPtr
9820: 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
9830: 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  r, 1);.      if(
9840: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
9850: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 69   ){.        pTri
9860: 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d  gger = pTrigger-
9870: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65  >pNext;.      }e
9880: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 72  lse{.        pTr
9890: 69 67 67 65 72 20 3d 20 70 54 61 62 6c 65 2d 3e  igger = pTable->
98a0: 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20  pTrigger;.      
98b0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
98c0: 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f  Drop all SQLITE_
98d0: 4d 41 53 54 45 52 20 65 6e 74 72 69 65 73 20 74  MASTER entries t
98e0: 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
98f0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71   table */.    sq
9900: 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61  liteOpenMasterTa
9910: 62 6c 65 28 76 2c 20 70 54 61 62 6c 65 2d 3e 69  ble(v, pTable->i
9920: 44 62 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20  Db);.    base = 
9930: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c  sqliteVdbeAddOpL
9940: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
9950: 28 64 72 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f  (dropTable), dro
9960: 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c  pTable);.    sql
9970: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
9980: 76 2c 20 62 61 73 65 2b 31 2c 20 70 54 61 62 6c  v, base+1, pTabl
9990: 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 0a 20  e->zName, 0);.. 
99a0: 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53     /* Drop all S
99b0: 51 4c 49 54 45 5f 54 45 4d 50 5f 4d 41 53 54 45  QLITE_TEMP_MASTE
99c0: 52 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72  R entries that r
99d0: 65 66 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c  efer to the tabl
99e0: 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61  e */.    if( pTa
99f0: 62 6c 65 2d 3e 69 44 62 21 3d 31 20 29 7b 0a 20  ble->iDb!=1 ){. 
9a00: 20 20 20 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d       sqliteOpenM
9a10: 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 31 29  asterTable(v, 1)
9a20: 3b 0a 20 20 20 20 20 20 62 61 73 65 20 3d 20 73  ;.      base = s
9a30: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69  qliteVdbeAddOpLi
9a40: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
9a50: 64 72 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f 70  dropTable), drop
9a60: 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 73 71  Table);.      sq
9a70: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
9a80: 28 76 2c 20 62 61 73 65 2b 31 2c 20 70 54 61 62  (v, base+1, pTab
9a90: 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  le->zName, 0);. 
9aa0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 54     }..    if( pT
9ab0: 61 62 6c 65 2d 3e 69 44 62 3d 3d 30 20 29 7b 0a  able->iDb==0 ){.
9ac0: 20 20 20 20 20 20 73 71 6c 69 74 65 43 68 61 6e        sqliteChan
9ad0: 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b  geCookie(db, v);
9ae0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9af0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
9b00: 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20  _Close, 0, 0);. 
9b10: 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29     if( !isView )
9b20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
9b30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
9b40: 73 74 72 6f 79 2c 20 70 54 61 62 6c 65 2d 3e 74  stroy, pTable->t
9b50: 6e 75 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62  num, pTable->iDb
9b60: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64  );.      for(pId
9b70: 78 3d 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  x=pTable->pIndex
9b80: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
9b90: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
9ba0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
9bb0: 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79  Op(v, OP_Destroy
9bc0: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 49  , pIdx->tnum, pI
9bd0: 64 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20  dx->iDb);.      
9be0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
9bf0: 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  teEndWriteOperat
9c00: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  ion(pParse);.  }
9c10: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
9c20: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 63  e in-memory desc
9c30: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  ription of the t
9c40: 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
9c50: 45 78 63 65 70 74 69 6f 6e 3a 20 69 66 20 74 68  Exception: if th
9c60: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
9c70: 62 65 67 61 6e 20 77 69 74 68 20 74 68 65 20 45  began with the E
9c80: 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 2c 0a  XPLAIN keyword,.
9c90: 20 20 2a 2a 20 74 68 65 6e 20 6e 6f 20 63 68 61    ** then no cha
9ca0: 6e 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 6d  nges should be m
9cb0: 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ade..  */.  if( 
9cc0: 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
9cd0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e   ){.    sqliteUn
9ce0: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62  linkAndDeleteTab
9cf0: 6c 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  le(db, pTable);.
9d00: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
9d10: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
9d20: 61 6e 67 65 73 3b 0a 20 20 7d 0a 20 20 73 71 6c  anges;.  }.  sql
9d30: 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
9d40: 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  db, iDb);.}../*.
9d50: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9d60: 63 6f 6e 73 74 72 75 63 74 73 20 61 20 50 33 20  constructs a P3 
9d70: 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20  string suitable 
9d80: 66 6f 72 20 61 6e 20 4f 50 5f 4d 61 6b 65 49 64  for an OP_MakeId
9d90: 78 4b 65 79 0a 2a 2a 20 6f 70 63 6f 64 65 20 61  xKey.** opcode a
9da0: 6e 64 20 61 64 64 73 20 74 68 61 74 20 50 33 20  nd adds that P3 
9db0: 73 74 72 69 6e 67 20 74 6f 20 74 68 65 20 6d 6f  string to the mo
9dc0: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
9dd0: 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  rted instruction
9de0: 0a 2a 2a 20 69 6e 20 74 68 65 20 76 69 72 74 75  .** in the virtu
9df0: 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 65  al machine.  The
9e00: 20 50 33 20 73 74 72 69 6e 67 20 63 6f 6e 73 69   P3 string consi
9e10: 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  sts of a single 
9e20: 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 66 6f 72  character.** for
9e30: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20   each column in 
9e40: 74 68 65 20 69 6e 64 65 78 20 70 49 64 78 20 6f  the index pIdx o
9e50: 66 20 74 61 62 6c 65 20 70 54 61 62 2e 20 20 49  f table pTab.  I
9e60: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 75 73 65  f the column use
9e70: 73 0a 2a 2a 20 61 20 6e 75 6d 65 72 69 63 20 73  s.** a numeric s
9e80: 6f 72 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20  ort order, then 
9e90: 74 68 65 20 50 33 20 73 74 72 69 6e 67 20 63 68  the P3 string ch
9ea0: 61 72 61 63 74 65 72 20 63 6f 72 72 65 73 70 6f  aracter correspo
9eb0: 6e 64 69 6e 67 20 74 6f 0a 2a 2a 20 74 68 61 74  nding to.** that
9ec0: 20 63 6f 6c 75 6d 6e 20 69 73 20 27 6e 27 2e 20   column is 'n'. 
9ed0: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 75   If the column u
9ee0: 73 65 73 20 61 20 74 65 78 74 20 73 6f 72 74 20  ses a text sort 
9ef0: 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68 65 0a  order, then the.
9f00: 2a 2a 20 50 33 20 73 74 72 69 6e 67 20 69 73 20  ** P3 string is 
9f10: 27 74 27 2e 20 20 53 65 65 20 74 68 65 20 4f 50  't'.  See the OP
9f20: 5f 4d 61 6b 65 49 64 78 4b 65 79 20 6f 70 63 6f  _MakeIdxKey opco
9f30: 64 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  de documentation
9f40: 20 66 6f 72 0a 2a 2a 20 61 64 64 69 74 69 6f 6e   for.** addition
9f50: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  al information. 
9f60: 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 73 71   See also the sq
9f70: 6c 69 74 65 41 64 64 4b 65 79 54 79 70 65 28 29  liteAddKeyType()
9f80: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69   routine..*/.voi
9f90: 64 20 73 71 6c 69 74 65 41 64 64 49 64 78 4b 65  d sqliteAddIdxKe
9fa0: 79 54 79 70 65 28 56 64 62 65 20 2a 76 2c 20 49  yType(Vdbe *v, I
9fb0: 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 63  ndex *pIdx){.  c
9fc0: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 54 61  har *zType;.  Ta
9fd0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74  ble *pTab;.  int
9fe0: 20 69 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28   i, n;.  assert(
9ff0: 20 70 49 64 78 21 3d 30 20 26 26 20 70 49 64 78   pIdx!=0 && pIdx
a000: 2d 3e 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20  ->pTable!=0 );. 
a010: 20 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54   pTab = pIdx->pT
a020: 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 70 49 64 78  able;.  n = pIdx
a030: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7a 54 79  ->nColumn;.  zTy
a040: 70 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  pe = sqliteMallo
a050: 63 52 61 77 28 20 6e 2b 31 20 29 3b 0a 20 20 69  cRaw( n+1 );.  i
a060: 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20 72 65  f( zType==0 ) re
a070: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
a080: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
a090: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d  int iCol = pIdx-
a0a0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
a0b0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
a0c0: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
a0d0: 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 69 66 28 20  nCol );.    if( 
a0e0: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  (pTab->aCol[iCol
a0f0: 5d 2e 73 6f 72 74 4f 72 64 65 72 20 26 20 53 51  ].sortOrder & SQ
a100: 4c 49 54 45 5f 53 4f 5f 54 59 50 45 4d 41 53 4b  LITE_SO_TYPEMASK
a110: 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58  )==SQLITE_SO_TEX
a120: 54 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  T ){.      zType
a130: 5b 69 5d 20 3d 20 27 74 27 3b 0a 20 20 20 20 7d  [i] = 't';.    }
a140: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 54 79 70  else{.      zTyp
a150: 65 5b 69 5d 20 3d 20 27 6e 27 3b 0a 20 20 20 20  e[i] = 'n';.    
a160: 7d 0a 20 20 7d 0a 20 20 7a 54 79 70 65 5b 6e 5d  }.  }.  zType[n]
a170: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 56 64   = 0;.  sqliteVd
a180: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
a190: 2c 20 7a 54 79 70 65 2c 20 6e 29 3b 0a 20 20 73  , zType, n);.  s
a1a0: 71 6c 69 74 65 46 72 65 65 28 7a 54 79 70 65 29  qliteFree(zType)
a1b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
a1c0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
a1d0: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  d to create a ne
a1e0: 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e  w foreign key on
a1f0: 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75   the table.** cu
a200: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
a210: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72  nstruction.  pFr
a220: 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73  omCol determines
a230: 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a   which columns.*
a240: 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * in the current
a250: 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20   table point to 
a260: 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e  the foreign key.
a270: 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30    If pFromCol==0
a280: 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74   then.** connect
a290: 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20   the key to the 
a2a0: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65  last column inse
a2b0: 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68  rted.  pTo is th
a2c0: 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65  e name of.** the
a2d0: 20 74 61 62 6c 65 20 72 65 66 65 72 72 65 64 20   table referred 
a2e0: 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61  to.  pToCol is a
a2f0: 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   list of tables 
a300: 69 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20  in the other.** 
a310: 70 54 6f 20 74 61 62 6c 65 20 74 68 61 74 20 74  pTo table that t
a320: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 70  he foreign key p
a330: 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67 73  oints to.  flags
a340: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a   contains all.**
a350: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
a360: 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  ut the conflict 
a370: 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
a380: 69 74 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a  ithms specified.
a390: 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c  ** in the ON DEL
a3a0: 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61  ETE, ON UPDATE a
a3b0: 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61  nd ON INSERT cla
a3c0: 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46  uses..**.** An F
a3d0: 4b 65 79 20 73 74 72 75 63 74 75 72 65 20 69 73  Key structure is
a3e0: 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64 64   created and add
a3f0: 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ed to the table 
a400: 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64  currently.** und
a410: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
a420: 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70  in the pParse->p
a430: 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 20  NewTable field. 
a440: 20 54 68 65 20 6e 65 77 20 46 4b 65 79 0a 2a 2a   The new FKey.**
a450: 20 69 73 20 6e 6f 74 20 6c 69 6e 6b 65 64 20 69   is not linked i
a460: 6e 74 6f 20 64 62 2d 3e 61 46 4b 65 79 20 61 74  nto db->aFKey at
a470: 20 74 68 69 73 20 70 6f 69 6e 74 20 2d 20 74 68   this point - th
a480: 61 74 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70  at does not happ
a490: 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73 71 6c 69  en.** until sqli
a4a0: 74 65 45 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a  teEndTable()..**
a4b0: 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20  .** The foreign 
a4c0: 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72 20 49  key is set for I
a4d0: 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73 73  MMEDIATE process
a4e0: 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75 65  ing.  A subseque
a4f0: 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71  nt call.** to sq
a500: 6c 69 74 65 44 65 66 65 72 46 6f 72 65 69 67 6e  liteDeferForeign
a510: 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e  Key() might chan
a520: 67 65 20 74 68 69 73 20 74 6f 20 44 45 46 45 52  ge this to DEFER
a530: 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  RED..*/.void sql
a540: 69 74 65 43 72 65 61 74 65 46 6f 72 65 69 67 6e  iteCreateForeign
a550: 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
a560: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
a570: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
a580: 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 46 72 6f  /.  IdList *pFro
a590: 6d 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75  mCol,    /* Colu
a5a0: 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c  mns in this tabl
a5b0: 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  e that point to 
a5c0: 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
a5d0: 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20   Token *pTo,    
a5e0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
a5f0: 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
a600: 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 54   */.  IdList *pT
a610: 6f 43 6f 6c 2c 20 20 20 20 20 20 2f 2a 20 43 6f  oCol,      /* Co
a620: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68  lumns in the oth
a630: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  er table */.  in
a640: 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
a650: 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72     /* Conflict r
a660: 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
a670: 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 54 61  thms. */.){.  Ta
a680: 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d  ble *p = pParse-
a690: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e  >pNewTable;.  in
a6a0: 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69  t nByte;.  int i
a6b0: 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  ;.  int nCol;.  
a6c0: 63 68 61 72 20 2a 7a 3b 0a 20 20 46 4b 65 79 20  char *z;.  FKey 
a6d0: 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 61  *pFKey = 0;..  a
a6e0: 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b  ssert( pTo!=0 );
a6f0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
a700: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
a710: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28  to fk_end;.  if(
a720: 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
a730: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
a740: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66  ->nCol-1;.    if
a750: 28 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20  ( iCol<0 ) goto 
a760: 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  fk_end;.    if( 
a770: 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
a780: 2d 3e 6e 49 64 21 3d 31 20 29 7b 0a 20 20 20 20  ->nId!=1 ){.    
a790: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
a7a0: 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67  (pParse, "foreig
a7b0: 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20  n key on %s".   
a7c0: 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72        " should r
a7d0: 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e  eference only on
a7e0: 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  e column of tabl
a7f0: 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20  e %T",.         
a800: 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  p->aCol[iCol].zN
a810: 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20  ame, pTo);.     
a820: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
a830: 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31    }.    nCol = 1
a840: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  ;.  }else if( pT
a850: 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
a860: 6e 49 64 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  nId!=pFromCol->n
a870: 49 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Id ){.    sqlite
a880: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
a890: 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72  .        "number
a8a0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66   of columns in f
a8b0: 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20  oreign key does 
a8c0: 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75  not match the nu
a8d0: 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20  mber of ".      
a8e0: 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68    "columns in th
a8f0: 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
a900: 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66  le");.    goto f
a910: 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  k_end;.  }else{.
a920: 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d      nCol = pFrom
a930: 43 6f 6c 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 20 20  Col->nId;.  }.  
a940: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
a950: 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69  pFKey) + nCol*si
a960: 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
a970: 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
a980: 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
a990: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
a9a0: 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 49 64 3b 20 69  i<pToCol->nId; i
a9b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  ++){.      nByte
a9c0: 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f   += strlen(pToCo
a9d0: 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b  l->a[i].zName) +
a9e0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
a9f0: 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d 61  pFKey = sqliteMa
aa00: 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20  lloc( nByte );. 
aa10: 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 20   if( pFKey==0 ) 
aa20: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 70  goto fk_end;.  p
aa30: 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b  FKey->pFrom = p;
aa40: 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  .  pFKey->pNextF
aa50: 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a  rom = p->pFKey;.
aa60: 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46    z = (char*)&pF
aa70: 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d  Key[1];.  pFKey-
aa80: 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75 63 74 20  >aCol = (struct 
aa90: 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20  sColMap*)z;.  z 
aaa0: 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  += sizeof(struct
aab0: 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a   sColMap)*nCol;.
aac0: 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a    pFKey->zTo = z
aad0: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54  ;.  memcpy(z, pT
aae0: 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20  o->z, pTo->n);. 
aaf0: 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a   z[pTo->n] = 0;.
ab00: 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b    z += pTo->n+1;
ab10: 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54  .  pFKey->pNextT
ab20: 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e  o = 0;.  pFKey->
ab30: 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69  nCol = nCol;.  i
ab40: 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
ab50: 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f  {.    pFKey->aCo
ab60: 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e  l[0].iFrom = p->
ab70: 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  nCol-1;.  }else{
ab80: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
ab90: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
aba0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
abb0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f  or(j=0; j<p->nCo
abc0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
abd0: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
abe0: 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  mp(p->aCol[j].zN
abf0: 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61  ame, pFromCol->a
ac00: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
ac10: 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79  .          pFKey
ac20: 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20  ->aCol[i].iFrom 
ac30: 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = j;.          b
ac40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
ac50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
ac60: 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a  ( j>=p->nCol ){.
ac70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 72          sqliteEr
ac80: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
ac90: 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
aca0: 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22  wn column \"%s\"
acb0: 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
acc0: 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20  definition", .  
acd0: 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
ace0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
acf0: 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
ad00: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
ad10: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
ad20: 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
ad30: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
ad40: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
ad50: 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b  trlen(pToCol->a[
ad60: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
ad70: 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
ad80: 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20  zCol = z;.      
ad90: 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c  memcpy(z, pToCol
ada0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29  ->a[i].zName, n)
adb0: 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30  ;.      z[n] = 0
adc0: 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31  ;.      z += n+1
add0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
ade0: 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
adf0: 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65  = 0;.  pFKey->de
ae00: 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73  leteConf = flags
ae10: 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79   & 0xff;.  pFKey
ae20: 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d 20 28  ->updateConf = (
ae30: 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30  flags >> 8 ) & 0
ae40: 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e  xff;.  pFKey->in
ae50: 73 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67  sertConf = (flag
ae60: 73 20 3e 3e 20 31 36 20 29 20 26 20 30 78 66 66  s >> 16 ) & 0xff
ae70: 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  ;..  /* Link the
ae80: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20   foreign key to 
ae90: 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65  the table as the
aea0: 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f   last step..  */
aeb0: 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46  .  p->pFKey = pF
aec0: 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30  Key;.  pFKey = 0
aed0: 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c  ;..fk_end:.  sql
aee0: 69 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a  iteFree(pFKey);.
aef0: 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65    sqliteIdListDe
af00: 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a  lete(pFromCol);.
af10: 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65    sqliteIdListDe
af20: 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a  lete(pToCol);.}.
af30: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
af40: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
af50: 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20  en an INITIALLY 
af60: 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49  IMMEDIATE or INI
af70: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
af80: 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65  ** clause is see
af90: 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66  n as part of a f
afa0: 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
afb0: 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65  ition.  The isDe
afc0: 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65  ferred.** parame
afd0: 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49  ter is 1 for INI
afe0: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20  TIALLY DEFERRED 
aff0: 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41  and 0 for INITIA
b000: 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a  LLY IMMEDIATE..*
b010: 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f  * The behavior o
b020: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
b030: 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65  tly created fore
b040: 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73  ign key is adjus
b050: 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  ted.** according
b060: 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
b070: 74 65 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  teDeferForeignKe
b080: 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
b090: 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29   int isDeferred)
b0a0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
b0b0: 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a  .  FKey *pFKey;.
b0c0: 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50    if( (pTab = pP
b0d0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
b0e0: 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20  ==0 || (pFKey = 
b0f0: 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20  pTab->pFKey)==0 
b100: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65  ) return;.  pFKe
b110: 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
b120: 69 73 44 65 66 65 72 72 65 64 3b 0a 7d 0a 0a 2f  isDeferred;.}../
b130: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
b140: 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53  w index for an S
b150: 51 4c 20 74 61 62 6c 65 2e 20 20 70 49 6e 64 65  QL table.  pInde
b160: 78 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  x is the name of
b170: 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61   the index .** a
b180: 6e 64 20 70 54 61 62 6c 65 20 69 73 20 74 68 65  nd pTable is the
b190: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
b1a0: 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
b1b0: 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20   indexed.  Both 
b1c0: 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c  will .** be NULL
b1d0: 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b   for a primary k
b1e0: 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74  ey or an index t
b1f0: 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74  hat is created t
b200: 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55  o satisfy a.** U
b210: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
b220: 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64  .  If pTable and
b230: 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c   pIndex are NULL
b240: 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  , use pParse->pN
b250: 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68  ewTable.** as th
b260: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
b270: 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e  dexed.  pParse->
b280: 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74  pNewTable is a t
b290: 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  able that is.** 
b2a0: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
b2b0: 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61  constructed by a
b2c0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
b2d0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70  atement..**.** p
b2e0: 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
b2f0: 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
b300: 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20  indexed.  pList 
b310: 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  will be NULL if 
b320: 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69  this.** is a pri
b330: 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71  mary key or uniq
b340: 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  ue-constraint on
b350: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
b360: 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a   column added.**
b370: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
b380: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
b390: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f  nstruction.  .*/
b3a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 72 65 61  .void sqliteCrea
b3b0: 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  teIndex(.  Parse
b3c0: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 41   *pParse,   /* A
b3d0: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
b3e0: 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20  bout this parse 
b3f0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
b400: 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  e,    /* Name of
b410: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 79   the index.  May
b420: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72   be NULL */.  Sr
b430: 63 4c 69 73 74 20 2a 70 54 61 62 6c 65 2c 20 2f  cList *pTable, /
b440: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
b450: 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 20 55  ble to index.  U
b460: 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
b470: 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 49  able if 0 */.  I
b480: 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  dList *pList,   
b490: 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c  /* A list of col
b4a0: 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
b4b0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ed */.  int onEr
b4c0: 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f 45 5f 41  ror,     /* OE_A
b4d0: 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  bort, OE_Ignore,
b4e0: 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20   OE_Replace, or 
b4f0: 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b  OE_None */.  Tok
b500: 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a  en *pStart,   /*
b510: 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
b520: 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 61 20  n that begins a 
b530: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
b540: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
b550: 6e 20 2a 70 45 6e 64 20 20 20 20 20 20 2f 2a 20  n *pEnd      /* 
b560: 54 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f  The ")" that clo
b570: 73 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49  ses the CREATE I
b580: 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
b590: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
b5a0: 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ab;     /* Table
b5b0: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
b5c0: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
b5d0: 78 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  x;   /* The inde
b5e0: 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  x to be created 
b5f0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
b600: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a   = 0;.  int i, j
b610: 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64  ;.  Token nullId
b620: 3b 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b  ;    /* Fake tok
b630: 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20  en for an empty 
b640: 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46  ID list */.  DbF
b650: 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 2f 2a  ixer sFix;    /*
b660: 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64   For assigning d
b670: 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f  atabase names to
b680: 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   pTable */.  int
b690: 20 69 73 54 65 6d 70 3b 20 20 20 20 20 20 2f 2a   isTemp;      /*
b6a0: 20 54 72 75 65 20 66 6f 72 20 61 20 74 65 6d 70   True for a temp
b6b0: 6f 72 61 72 79 20 69 6e 64 65 78 20 2a 2f 0a 20  orary index */. 
b6c0: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
b6d0: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
b6e0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
b6f0: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
b700: 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69  ailed ) goto exi
b710: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
b720: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
b730: 75 73 79 20 0a 20 20 20 20 20 26 26 20 73 71 6c  usy .     && sql
b740: 69 74 65 46 69 78 49 6e 69 74 28 26 73 46 69 78  iteFixInit(&sFix
b750: 2c 20 70 50 61 72 73 65 2c 20 64 62 2d 3e 69 6e  , pParse, db->in
b760: 69 74 2e 69 44 62 2c 20 22 69 6e 64 65 78 22 2c  it.iDb, "index",
b770: 20 70 4e 61 6d 65 29 0a 20 20 20 20 20 26 26 20   pName).     && 
b780: 73 71 6c 69 74 65 46 69 78 53 72 63 4c 69 73 74  sqliteFixSrcList
b790: 28 26 73 46 69 78 2c 20 70 54 61 62 6c 65 29 0a  (&sFix, pTable).
b7a0: 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78    ){.    goto ex
b7b0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
b7c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
b7d0: 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74  Find the table t
b7e0: 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64  hat is to be ind
b7f0: 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61  exed.  Return ea
b800: 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  rly if not found
b810: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
b820: 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 61 73  ble!=0 ){.    as
b830: 73 65 72 74 28 20 70 4e 61 6d 65 21 3d 30 20 29  sert( pName!=0 )
b840: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
b850: 61 62 6c 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  able->nSrc==1 );
b860: 0a 20 20 20 20 70 54 61 62 20 3d 20 20 73 71 6c  .    pTab =  sql
b870: 69 74 65 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70  iteSrcListLookup
b880: 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29  (pParse, pTable)
b890: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
b8a0: 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20  ssert( pName==0 
b8b0: 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70  );.    pTab =  p
b8c0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
b8d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62  ;.  }.  if( pTab
b8e0: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
b8f0: 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Err ) goto exit_
b900: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
b910: 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e  if( pTab->readOn
b920: 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ly ){.    sqlite
b930: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
b940: 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
b950: 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20  ot be indexed", 
b960: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
b970: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
b980: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
b990: 69 66 28 20 70 54 61 62 2d 3e 69 44 62 3e 3d 32  if( pTab->iDb>=2
b9a0: 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   && db->init.bus
b9b0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  y==0 ){.    sqli
b9c0: 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  teErrorMsg(pPars
b9d0: 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
b9e0: 20 6e 6f 74 20 68 61 76 65 20 69 6e 64 69 63 65   not have indice
b9f0: 73 20 61 64 64 65 64 22 2c 20 70 54 61 62 2d 3e  s added", pTab->
ba00: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
ba10: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
ba20: 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54  ex;.  }.  if( pT
ba30: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
ba40: 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
ba50: 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 73  g(pParse, "views
ba60: 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
ba70: 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  xed");.    goto 
ba80: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
ba90: 78 3b 0a 20 20 7d 0a 20 20 69 73 54 65 6d 70 20  x;.  }.  isTemp 
baa0: 3d 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31 3b 0a  = pTab->iDb==1;.
bab0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
bac0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
bad0: 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72  index.  Make sur
bae0: 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61  e there is not a
baf0: 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20  lready another. 
bb00: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
bb10: 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  le with the same
bb20: 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20   name.  .  **.  
bb30: 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49  ** Exception:  I
bb40: 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  f we are reading
bb50: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65   the names of pe
bb60: 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20  rmanent indices 
bb70: 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71  from the.  ** sq
bb80: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
bb90: 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20  e (because some 
bba0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68  other process ch
bbb0: 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61  anged the schema
bbc0: 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f  ) and.  ** one o
bbd0: 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  f the index name
bbe0: 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20  s collides with 
bbf0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65  the name of a te
bc00: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
bc10: 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65  .  ** index, the
bc20: 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  n we will contin
bc30: 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ue to process th
bc40: 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20  is index..  **. 
bc50: 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20   ** If pName==0 
bc60: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
bc70: 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e   are.  ** dealin
bc80: 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79  g with a primary
bc90: 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63   key or UNIQUE c
bca0: 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68  onstraint.  We h
bcb0: 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75  ave to invent ou
bcc0: 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e  r.  ** own name.
bcd0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d  .  */.  if( pNam
bce0: 65 20 26 26 20 21 64 62 2d 3e 69 6e 69 74 2e 62  e && !db->init.b
bcf0: 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  usy ){.    Index
bd00: 20 2a 70 49 53 61 6d 65 4e 61 6d 65 3b 20 20 20   *pISameName;   
bd10: 20 2f 2a 20 41 6e 6f 74 68 65 72 20 69 6e 64 65   /* Another inde
bd20: 78 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  x with the same 
bd30: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54 61 62 6c  name */.    Tabl
bd40: 65 20 2a 70 54 53 61 6d 65 4e 61 6d 65 3b 20 20  e *pTSameName;  
bd50: 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 77 69 74    /* A table wit
bd60: 68 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  h same name as t
bd70: 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  he index */.    
bd80: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
bd90: 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20  rNDup(pName->z, 
bda0: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69  pName->n);.    i
bdb0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
bdc0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
bdd0: 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 28 70  ndex;.    if( (p
bde0: 49 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69  ISameName = sqli
bdf0: 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  teFindIndex(db, 
be00: 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 29 7b  zName, 0))!=0 ){
be10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72  .      sqliteErr
be20: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
be30: 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79 20  ndex %s already 
be40: 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b  exists", zName);
be50: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
be60: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
be70: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 54     }.    if( (pT
be80: 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74  SameName = sqlit
be90: 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  eFindTable(db, z
bea0: 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a  Name, 0))!=0 ){.
beb0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f        sqliteErro
bec0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68  rMsg(pParse, "th
bed0: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
bee0: 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22   table named %s"
bef0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
bf00: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
bf10: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
bf20: 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 3d  }else if( pName=
bf30: 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  =0 ){.    char z
bf40: 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74  Buf[30];.    int
bf50: 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   n;.    Index *p
bf60: 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c  Loop;.    for(pL
bf70: 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  oop=pTab->pIndex
bf80: 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c  , n=1; pLoop; pL
bf90: 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74  oop=pLoop->pNext
bfa0: 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72  , n++){}.    spr
bfb0: 69 6e 74 66 28 7a 42 75 66 2c 22 25 64 29 22 2c  intf(zBuf,"%d)",
bfc0: 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  n);.    zName = 
bfd0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  0;.    sqliteSet
bfe0: 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22  String(&zName, "
bff0: 28 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  (", pTab->zName,
c000: 20 22 20 61 75 74 6f 69 6e 64 65 78 20 22 2c 20   " autoindex ", 
c010: 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b  zBuf, (char*)0);
c020: 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
c030: 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
c040: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 65  eate_index;.  }e
c050: 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  lse{.    zName =
c060: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
c070: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
c080: 6e 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  n);.  }..  /* Ch
c090: 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a  eck for authoriz
c0a0: 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20  ation to create 
c0b0: 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23  an index..  */.#
c0c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c0d0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
c0e0: 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  .  {.    const c
c0f0: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
c100: 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e  Db[pTab->iDb].zN
c110: 61 6d 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ame;..    assert
c120: 28 20 70 54 61 62 2d 3e 69 44 62 3d 3d 64 62 2d  ( pTab->iDb==db-
c130: 3e 69 6e 69 74 2e 69 44 62 20 7c 7c 20 69 73 54  >init.iDb || isT
c140: 65 6d 70 20 29 3b 0a 20 20 20 20 69 66 28 20 73  emp );.    if( s
c150: 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70  qliteAuthCheck(p
c160: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
c170: 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
c180: 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a  LE(isTemp), 0, z
c190: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
c1a0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
c1b0: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
c1c0: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
c1d0: 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
c1e0: 69 73 54 65 6d 70 20 29 20 69 20 3d 20 53 51 4c  isTemp ) i = SQL
c1f0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
c200: 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
c210: 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70  qliteAuthCheck(p
c220: 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c  Parse, i, zName,
c230: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
c240: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
c250: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
c260: 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
c270: 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c  ndif..  /* If pL
c280: 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73  ist==0, it means
c290: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
c2a0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65  s called to make
c2b0: 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20   a primary.  ** 
c2c0: 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  key out of the l
c2d0: 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ast column added
c2e0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e   to the table un
c2f0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
c300: 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65  ..  ** So create
c310: 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20   a fake list to 
c320: 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20  simulate this.. 
c330: 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   */.  if( pList=
c340: 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64  =0 ){.    nullId
c350: 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  .z = pTab->aCol[
c360: 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e  pTab->nCol-1].zN
c370: 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  ame;.    nullId.
c380: 6e 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c 6c 49  n = strlen(nullI
c390: 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  d.z);.    pList 
c3a0: 3d 20 73 71 6c 69 74 65 49 64 4c 69 73 74 41 70  = sqliteIdListAp
c3b0: 70 65 6e 64 28 30 2c 20 26 6e 75 6c 6c 49 64 29  pend(0, &nullId)
c3c0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
c3d0: 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
c3e0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
c3f0: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c  ..  /* .  ** All
c400: 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
c410: 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f  structure. .  */
c420: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
c430: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
c440: 28 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e  (Index) + strlen
c450: 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20 20  (zName) + 1 +.  
c460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c470: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74        sizeof(int
c480: 29 2a 70 4c 69 73 74 2d 3e 6e 49 64 20 29 3b 0a  )*pList->nId );.
c490: 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20    if( pIndex==0 
c4a0: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
c4b0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49 6e 64  te_index;.  pInd
c4c0: 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28  ex->aiColumn = (
c4d0: 69 6e 74 2a 29 26 70 49 6e 64 65 78 5b 31 5d 3b  int*)&pIndex[1];
c4e0: 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
c4f0: 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65   = (char*)&pInde
c500: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73  x->aiColumn[pLis
c510: 74 2d 3e 6e 49 64 5d 3b 0a 20 20 73 74 72 63 70  t->nId];.  strcp
c520: 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  y(pIndex->zName,
c530: 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65   zName);.  pInde
c540: 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
c550: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ;.  pIndex->nCol
c560: 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 49 64  umn = pList->nId
c570: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ;.  pIndex->onEr
c580: 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20  ror = onError;. 
c590: 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
c5a0: 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20  ex = pName==0;. 
c5b0: 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 3d 20 69   pIndex->iDb = i
c5c0: 73 54 65 6d 70 20 3f 20 31 20 3a 20 64 62 2d 3e  sTemp ? 1 : db->
c5d0: 69 6e 69 74 2e 69 44 62 3b 0a 0a 20 20 2f 2a 20  init.iDb;..  /* 
c5e0: 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  Scan the names o
c5f0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  f the columns of
c600: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
c610: 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a   indexed and.  *
c620: 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d  * load the colum
c630: 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74  n indices into t
c640: 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  he Index structu
c650: 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65  re.  Report an e
c660: 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79  rror.  ** if any
c670: 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66   column is not f
c680: 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ound..  */.  for
c690: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
c6a0: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f  Id; i++){.    fo
c6b0: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
c6c0: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
c6d0: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
c6e0: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
c6f0: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
c700: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [j].zName)==0 ) 
c710: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
c720: 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
c730: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
c740: 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  teErrorMsg(pPars
c750: 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73  e, "table %s has
c760: 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64   no column named
c770: 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54   %s",.        pT
c780: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69 73 74  ab->zName, pList
c790: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
c7a0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
c7b0: 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 67  pIndex);.      g
c7c0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
c7d0: 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
c7e0: 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
c7f0: 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 7d 0a 0a 20  n[i] = j;.  }.. 
c800: 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77   /* Link the new
c810: 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
c820: 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e   to its table an
c830: 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20  d to the other. 
c840: 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   ** in-memory da
c850: 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
c860: 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  s. .  */.  if( !
c870: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
c880: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  ){.    Index *p;
c890: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 48  .    p = sqliteH
c8a0: 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61  ashInsert(&db->a
c8b0: 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e  Db[pIndex->iDb].
c8c0: 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20  idxHash, .      
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
c8f0: 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d  , strlen(pIndex-
c900: 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65  >zName)+1, pInde
c910: 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  x);.    if( p ){
c920: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c930: 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20  ==pIndex );  /* 
c940: 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
c950: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
c960: 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64   sqliteFree(pInd
c970: 65 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ex);.      goto 
c980: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
c990: 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  x;.    }.    db-
c9a0: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
c9b0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
c9c0: 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61    }..  /* When a
c9d0: 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74  dding an index t
c9e0: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
c9f0: 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c  dices for a tabl
ca00: 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  e, make.  ** sur
ca10: 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61  e all indices la
ca20: 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65  beled OE_Replace
ca30: 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20   come after all 
ca40: 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20  those labeled.  
ca50: 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54  ** OE_Ignore.  T
ca60: 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
ca70: 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74   for the correct
ca80: 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50   operation of UP
ca90: 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e  DATE.  ** and IN
caa0: 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  SERT..  */.  if(
cab0: 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70   onError!=OE_Rep
cac0: 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49  lace || pTab->pI
cad0: 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 7c  ndex==0.       |
cae0: 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e  | pTab->pIndex->
caf0: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c  onError==OE_Repl
cb00: 61 63 65 29 7b 0a 20 20 20 20 70 49 6e 64 65 78  ace){.    pIndex
cb10: 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e  ->pNext = pTab->
cb20: 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62  pIndex;.    pTab
cb30: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
cb40: 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  x;.  }else{.    
cb50: 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20  Index *pOther = 
cb60: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
cb70: 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d    while( pOther-
cb80: 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72  >pNext && pOther
cb90: 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72  ->pNext->onError
cba0: 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a  !=OE_Replace ){.
cbb0: 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70        pOther = p
cbc0: 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
cbd0: 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
cbe0: 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e  pNext = pOther->
cbf0: 70 4e 65 78 74 3b 0a 20 20 20 20 70 4f 74 68 65  pNext;.    pOthe
cc00: 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  r->pNext = pInde
cc10: 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  x;.  }..  /* If 
cc20: 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  the db->init.bus
cc30: 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20  y is 1 it means 
cc40: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
cc50: 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20  he SQL off the. 
cc60: 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74   ** "sqlite_mast
cc70: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
cc80: 20 64 69 73 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f   disk.  So do no
cc90: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  t write to the d
cca0: 69 73 6b 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20  isk.  ** again. 
ccb0: 20 45 78 74 72 61 63 74 20 74 68 65 20 74 61 62   Extract the tab
ccc0: 6c 65 20 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74  le number from t
ccd0: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  he db->init.newT
cce0: 6e 75 6d 20 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a  num field..  */.
ccf0: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
cd00: 75 73 79 20 26 26 20 70 54 61 62 6c 65 21 3d 30  usy && pTable!=0
cd10: 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e   ){.    pIndex->
cd20: 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
cd30: 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20  newTnum;.  }..  
cd40: 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
cd50: 69 74 2e 62 75 73 79 20 69 73 20 30 20 74 68 65  it.busy is 0 the
cd60: 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64  n create the ind
cd70: 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69  ex on disk.  Thi
cd80: 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20  s.  ** involves 
cd90: 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65  writing the inde
cda0: 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65  x into the maste
cdb0: 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c  r table and fill
cdc0: 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ing in the.  ** 
cdd0: 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63  index with the c
cde0: 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e  urrent table con
cdf0: 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tents..  **.  **
ce00: 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   The db->init.bu
ce10: 73 79 20 69 73 20 30 20 77 68 65 6e 20 74 68 65  sy is 0 when the
ce20: 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65   user first ente
ce30: 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45  rs a CREATE INDE
ce40: 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e  X .  ** command.
ce50: 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20    db->init.busy 
ce60: 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61  is 1 when a data
ce70: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61  base is opened a
ce80: 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20  nd .  ** CREATE 
ce90: 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73  INDEX statements
cea0: 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66   are read out of
ceb0: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
cec0: 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20  e.  In.  ** the 
ced0: 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20  latter case the 
cee0: 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
cef0: 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68  ists on disk, wh
cf00: 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20  ich is why.  ** 
cf10: 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  we don't want to
cf20: 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20   recreate it..  
cf30: 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 61 62 6c  **.  ** If pTabl
cf40: 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
cf50: 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65  is index is gene
cf60: 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61  rated as a prima
cf70: 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55  ry key.  ** or U
cf80: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
cf90: 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42   of a CREATE TAB
cfa0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  LE statement.  S
cfb0: 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20  ince the table. 
cfc0: 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65   ** has just bee
cfd0: 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f  n created, it co
cfe0: 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61  ntains no data a
cff0: 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69  nd the index ini
d000: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
d010: 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69   step can be ski
d020: 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
d030: 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62  e if( db->init.b
d040: 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  usy==0 ){.    in
d050: 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  t n;.    Vdbe *v
d060: 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31 2c 20  ;.    int lbl1, 
d070: 6c 62 6c 32 3b 0a 20 20 20 20 69 6e 74 20 69 3b  lbl2;.    int i;
d080: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a  .    int addr;..
d090: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65      v = sqliteGe
d0a0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
d0b0: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f     if( v==0 ) go
d0c0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
d0d0: 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 54  ndex;.    if( pT
d0e0: 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  able!=0 ){.     
d0f0: 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74   sqliteBeginWrit
d100: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
d110: 65 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a 20  e, 0, isTemp);. 
d120: 20 20 20 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d       sqliteOpenM
d130: 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69 73  asterTable(v, is
d140: 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Temp);.    }.   
d150: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d160: 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c  (v, OP_NewRecno,
d170: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
d180: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d190: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
d1a0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
d1b0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
d1c0: 69 6e 64 65 78 22 2c 20 50 33 5f 53 54 41 54 49  index", P3_STATI
d1d0: 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  C);.    sqliteVd
d1e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
d1f0: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
d200: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
d210: 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 6e 64 65  eP3(v, -1, pInde
d220: 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  x->zName, strlen
d230: 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29  (pIndex->zName))
d240: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
d250: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
d260: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ng, 0, 0);.    s
d270: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
d280: 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a  3(v, -1, pTab->z
d290: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 61 64  Name, 0);.    ad
d2a0: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
d2b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74  ddOp(v, OP_Creat
d2c0: 65 49 6e 64 65 78 2c 20 30 2c 20 69 73 54 65 6d  eIndex, 0, isTem
d2d0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  p);.    sqliteVd
d2e0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
d2f0: 64 72 2c 20 28 63 68 61 72 2a 29 26 70 49 6e 64  dr, (char*)&pInd
d300: 65 78 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49  ex->tnum, P3_POI
d310: 4e 54 45 52 29 3b 0a 20 20 20 20 70 49 6e 64 65  NTER);.    pInde
d320: 78 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20  x->tnum = 0;.   
d330: 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20   if( pTable ){. 
d340: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
d350: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
d360: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
d370: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
d380: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 73 54 65  OP_Integer, isTe
d390: 6d 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  mp, 0);.      sq
d3a0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
d3b0: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31   OP_OpenWrite, 1
d3c0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
d3d0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62  addr = sqliteVdb
d3e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
d3f0: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
d400: 69 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45  if( pStart && pE
d410: 6e 64 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  nd ){.      n = 
d420: 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20  Addr(pEnd->z) - 
d430: 41 64 64 72 28 70 53 74 61 72 74 2d 3e 7a 29 20  Addr(pStart->z) 
d440: 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  + 1;.      sqlit
d450: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
d460: 20 61 64 64 72 2c 20 70 53 74 61 72 74 2d 3e 7a   addr, pStart->z
d470: 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
d480: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
d490: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
d4a0: 2c 20 35 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 5, 0);.    sql
d4b0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
d4c0: 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c  OP_PutIntKey, 0,
d4d0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61   0);.    if( pTa
d4e0: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ble ){.      sql
d4f0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
d500: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62  OP_Integer, pTab
d510: 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20  ->iDb, 0);.     
d520: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d530: 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
d540: 20 32 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b   2, pTab->tnum);
d550: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
d560: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
d570: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
d580: 3b 0a 20 20 20 20 20 20 6c 62 6c 32 20 3d 20 73  ;.      lbl2 = s
d590: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
d5a0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
d5b0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
d5c0: 4f 50 5f 52 65 77 69 6e 64 2c 20 32 2c 20 6c 62  OP_Rewind, 2, lb
d5d0: 6c 32 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20  l2);.      lbl1 
d5e0: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
d5f0: 70 28 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20 32  p(v, OP_Recno, 2
d600: 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  , 0);.      for(
d610: 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e  i=0; i<pIndex->n
d620: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
d630: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
d640: 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
d650: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  n[i];.        if
d660: 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69  ( pTab->iPKey==i
d670: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Col ){.         
d680: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d690: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 69 2c 20 30  (v, OP_Dup, i, 0
d6a0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
d6b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
d6c0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d6d0: 50 5f 43 6f 6c 75 6d 6e 2c 20 32 2c 20 69 43 6f  P_Column, 2, iCo
d6e0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
d6f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
d700: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d710: 50 5f 4d 61 6b 65 49 64 78 4b 65 79 2c 20 70 49  P_MakeIdxKey, pI
d720: 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 30  ndex->nColumn, 0
d730: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
d740: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
d750: 29 20 73 71 6c 69 74 65 41 64 64 49 64 78 4b 65  ) sqliteAddIdxKe
d760: 79 54 79 70 65 28 76 2c 20 70 49 6e 64 65 78 29  yType(v, pIndex)
d770: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
d780: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
d790: 78 50 75 74 2c 20 31 2c 20 70 49 6e 64 65 78 2d  xPut, 1, pIndex-
d7a0: 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
d7b0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
d7c0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
d7d0: 2d 31 2c 20 22 69 6e 64 65 78 65 64 20 63 6f 6c  -1, "indexed col
d7e0: 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69  umns are not uni
d7f0: 71 75 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29  que", P3_STATIC)
d800: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
d810: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
d820: 78 74 2c 20 32 2c 20 6c 62 6c 31 29 3b 0a 20 20  xt, 2, lbl1);.  
d830: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65      sqliteVdbeRe
d840: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
d850: 6c 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l2);.      sqlit
d860: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
d870: 5f 43 6c 6f 73 65 2c 20 32 2c 20 30 29 3b 0a 20  _Close, 2, 0);. 
d880: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
d890: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
d8a0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 0);.    }. 
d8b0: 20 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30     if( pTable!=0
d8c0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69   ){.      if( !i
d8d0: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
d8e0: 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f   sqliteChangeCoo
d8f0: 6b 69 65 28 64 62 2c 20 76 29 3b 0a 20 20 20 20  kie(db, v);.    
d900: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
d910: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d920: 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Close, 0, 0);.  
d930: 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69      sqliteEndWri
d940: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
d950: 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  se);.    }.  }..
d960: 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65    /* Clean up be
d970: 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a  fore exiting */.
d980: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
d990: 78 3a 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73  x:.  sqliteIdLis
d9a0: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
d9b0: 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44    sqliteSrcListD
d9c0: 65 6c 65 74 65 28 70 54 61 62 6c 65 29 3b 0a 20  elete(pTable);. 
d9d0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
d9e0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
d9f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
da00: 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e  ine will drop an
da10: 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20   existing named 
da20: 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75  index.  This rou
da30: 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tine.** implemen
da40: 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45  ts the DROP INDE
da50: 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  X statement..*/.
da60: 76 6f 69 64 20 73 71 6c 69 74 65 44 72 6f 70 49  void sqliteDropI
da70: 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
da80: 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61  se, SrcList *pNa
da90: 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  me){.  Index *pI
daa0: 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ndex;.  Vdbe *v;
dab0: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
dac0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
dad0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
dae0: 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  || sqlite_malloc
daf0: 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  _failed ) return
db00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  ;.  assert( pNam
db10: 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
db20: 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 46  pIndex = sqliteF
db30: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61  indIndex(db, pNa
db40: 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
db50: 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
db60: 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49  abase);.  if( pI
db70: 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ndex==0 ){.    s
db80: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
db90: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
dba0: 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65  ndex: %S", pName
dbb0: 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  , 0);.    goto e
dbc0: 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
dbd0: 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78    }.  if( pIndex
dbe0: 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20  ->autoIndex ){. 
dbf0: 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
dc00: 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
dc10: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
dc20: 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20   UNIQUE ".      
dc30: 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20  "or PRIMARY KEY 
dc40: 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f  constraint canno
dc50: 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30  t be dropped", 0
dc60: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
dc70: 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
dc80: 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69  .  if( pIndex->i
dc90: 44 62 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  Db>1 ){.    sqli
dca0: 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  teErrorMsg(pPars
dcb0: 65 2c 20 22 63 61 6e 6e 6f 74 20 61 6c 74 65 72  e, "cannot alter
dcc0: 20 73 63 68 65 6d 61 20 6f 66 20 61 74 74 61 63   schema of attac
dcd0: 68 65 64 20 22 0a 20 20 20 20 20 20 20 22 64 61  hed ".       "da
dce0: 74 61 62 61 73 65 73 22 2c 20 30 29 3b 0a 20 20  tabases", 0);.  
dcf0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
dd00: 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e  _index;.  }.#ifn
dd10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
dd20: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
dd30: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d  {.    int code =
dd40: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44   SQLITE_DROP_IND
dd50: 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  EX;.    Table *p
dd60: 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
dd70: 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  able;.    const 
dd80: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
dd90: 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d  aDb[pIndex->iDb]
dda0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  .zName;.    cons
ddb0: 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
ddc0: 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 49 6e 64  CHEMA_TABLE(pInd
ddd0: 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 69 66  ex->iDb);.    if
dde0: 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63  ( sqliteAuthChec
ddf0: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
de00: 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
de10: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
de20: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
de30: 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
de40: 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 20  if( pIndex->iDb 
de50: 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  ) code = SQLITE_
de60: 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  DROP_TEMP_INDEX;
de70: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 41  .    if( sqliteA
de80: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
de90: 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a   code, pIndex->z
dea0: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
deb0: 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
dec0: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
ded0: 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
dee0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
def0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
df00: 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
df10: 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  and from the mas
df20: 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76  ter table */.  v
df30: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
df40: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
df50: 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  v ){.    static 
df60: 56 64 62 65 4f 70 4c 69 73 74 20 64 72 6f 70 49  VdbeOpList dropI
df70: 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  ndex[] = {.     
df80: 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20   { OP_Rewind,   
df90: 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30 7d    0, ADDR(9), 0}
dfa0: 2c 20 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74  , .      { OP_St
dfb0: 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20  ring,     0, 0, 
dfc0: 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a        0}, /* 1 *
dfd0: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d  /.      { OP_Mem
dfe0: 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20 20  Store,   1, 1,  
dff0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
e000: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20   OP_MemLoad,    
e010: 31 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  1, 0,       0}, 
e020: 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 3 */.      { 
e030: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30  OP_Column,     0
e040: 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 1,       0},. 
e050: 20 20 20 20 20 7b 20 4f 50 5f 45 71 2c 20 20 20       { OP_Eq,   
e060: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 38 29        0, ADDR(8)
e070: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
e080: 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20  _Next,       0, 
e090: 41 44 44 52 28 33 29 2c 20 30 7d 2c 0a 20 20 20  ADDR(3), 0},.   
e0a0: 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20     { OP_Goto,   
e0b0: 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20      0, ADDR(9), 
e0c0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44  0},.      { OP_D
e0d0: 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c  elete,     0, 0,
e0e0: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 38 20         0}, /* 8 
e0f0: 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  */.    };.    in
e100: 74 20 62 61 73 65 3b 0a 0a 20 20 20 20 73 71 6c  t base;..    sql
e110: 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65  iteBeginWriteOpe
e120: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
e130: 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a  , pIndex->iDb);.
e140: 20 20 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61      sqliteOpenMa
e150: 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70 49 6e  sterTable(v, pIn
e160: 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 62  dex->iDb);.    b
e170: 61 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ase = sqliteVdbe
e180: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
e190: 61 79 53 69 7a 65 28 64 72 6f 70 49 6e 64 65 78  aySize(dropIndex
e1a0: 29 2c 20 64 72 6f 70 49 6e 64 65 78 29 3b 0a 20  ), dropIndex);. 
e1b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
e1c0: 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31 2c  ngeP3(v, base+1,
e1d0: 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
e1e0: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64  0);.    if( pInd
e1f0: 65 78 2d 3e 69 44 62 3d 3d 30 20 29 7b 0a 20 20  ex->iDb==0 ){.  
e200: 20 20 20 20 73 71 6c 69 74 65 43 68 61 6e 67 65      sqliteChange
e210: 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a 20  Cookie(db, v);. 
e220: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
e230: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
e240: 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lose, 0, 0);.   
e250: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
e260: 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20  (v, OP_Destroy, 
e270: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 70 49  pIndex->tnum, pI
e280: 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20  ndex->iDb);.    
e290: 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70  sqliteEndWriteOp
e2a0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
e2b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
e2c0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
e2d0: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
e2e0: 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a  his index..  */.
e2f0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65    if( !pParse->e
e300: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73 71  xplain ){.    sq
e310: 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  liteUnlinkAndDel
e320: 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  eteIndex(db, pIn
e330: 64 65 78 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c  dex);.    db->fl
e340: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
e350: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d  ternChanges;.  }
e360: 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  ..exit_drop_inde
e370: 78 3a 0a 20 20 73 71 6c 69 74 65 53 72 63 4c 69  x:.  sqliteSrcLi
e380: 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b  stDelete(pName);
e390: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
e3a0: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
e3b0: 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69  o the given IdLi
e3c0: 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
e3d0: 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e  w IdList if.** n
e3e0: 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  eed be..**.** A 
e3f0: 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65  new IdList is re
e400: 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
e410: 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  if malloc() fail
e420: 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71  s..*/.IdList *sq
e430: 6c 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e 64  liteIdListAppend
e440: 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
e450: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
e460: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
e470: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
e480: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
e490: 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20  of(IdList) );.  
e4a0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
e4b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
e4c0: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30  List->nAlloc = 0
e4d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
e4e0: 74 2d 3e 6e 49 64 3e 3d 70 4c 69 73 74 2d 3e 6e  t->nId>=pList->n
e4f0: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 73 74 72  Alloc ){.    str
e500: 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20  uct IdList_item 
e510: 2a 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e  *a;.    pList->n
e520: 41 6c 6c 6f 63 20 3d 20 70 4c 69 73 74 2d 3e 6e  Alloc = pList->n
e530: 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20 20 20  Alloc*2 + 5;.   
e540: 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c   a = sqliteReall
e550: 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69  oc(pList->a, pLi
e560: 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f  st->nAlloc*sizeo
e570: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29  f(pList->a[0]) )
e580: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
e590: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49 64  {.      sqliteId
e5a0: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
e5b0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
e5c0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  0;.    }.    pLi
e5d0: 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20  st->a = a;.  }. 
e5e0: 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e   memset(&pList->
e5f0: 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20 30  a[pList->nId], 0
e600: 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  , sizeof(pList->
e610: 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 54  a[0]));.  if( pT
e620: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  oken ){.    char
e630: 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e   **pz = &pList->
e640: 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e  a[pList->nId].zN
e650: 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 53  ame;.    sqliteS
e660: 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 54  etNString(pz, pT
e670: 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d  oken->z, pToken-
e680: 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  >n, 0);.    if( 
e690: 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  *pz==0 ){.      
e6a0: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65  sqliteIdListDele
e6b0: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  te(pList);.     
e6c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
e6d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
e6e0: 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a  teDequote(*pz);.
e6f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73      }.  }.  pLis
e700: 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75  t->nId++;.  retu
e710: 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
e720: 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
e730: 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
e740: 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e  e given SrcList.
e750: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53    Create a new S
e760: 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  rcList if.** nee
e770: 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74  d be.  A new ent
e780: 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  ry is created in
e790: 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65   the SrcList eve
e7a0: 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e  n if pToken is N
e7b0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  ULL..**.** A new
e7c0: 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75   SrcList is retu
e7d0: 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
e7e0: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
e7f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62  .**.** If pDatab
e800: 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c  ase is not null,
e810: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
e820: 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20  he table has an 
e830: 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61  optional.** data
e840: 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78  base name prefix
e850: 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22  .  Like this:  "
e860: 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e  database.table".
e870: 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a    The pDatabase.
e880: 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ** points to the
e890: 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
e8a0: 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74  the pTable point
e8b0: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
e8c0: 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53  e name..** The S
e8d0: 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65  rcList.a[].zName
e8e0: 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64   field is filled
e8f0: 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
e900: 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74  name which might
e910: 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54  .** come from pT
e920: 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61  able (if pDataba
e930: 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66  se is NULL) or f
e940: 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20  rom pDatabase.  
e950: 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  .** SrcList.a[].
e960: 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c  zDatabase is fil
e970: 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  led with the dat
e980: 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20  abase name from 
e990: 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69  pTable,.** or wi
e9a0: 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61  th NULL if no da
e9b0: 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66  tabase is specif
e9c0: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74  ied..**.** In ot
e9d0: 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61  her words, if ca
e9e0: 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ll like this:.**
e9f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
ea00: 74 65 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  teSrcListAppend(
ea10: 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,0);.**.** Th
ea20: 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20  en B is a table 
ea30: 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
ea40: 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e  abase name is un
ea50: 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63  specified.  If c
ea60: 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68  alled.** like th
ea70: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
ea80: 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41    sqliteSrcListA
ea90: 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a  ppend(A,B,C);.**
eaa0: 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68  .** Then C is th
eab0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
eac0: 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61   B is the databa
ead0: 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c  se name..*/.SrcL
eae0: 69 73 74 20 2a 73 71 6c 69 74 65 53 72 63 4c 69  ist *sqliteSrcLi
eaf0: 73 74 41 70 70 65 6e 64 28 53 72 63 4c 69 73 74  stAppend(SrcList
eb00: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
eb10: 70 54 61 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70  pTable, Token *p
eb20: 44 61 74 61 62 61 73 65 29 7b 0a 20 20 69 66 28  Database){.  if(
eb30: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
eb40: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d   pList = sqliteM
eb50: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53 72  alloc( sizeof(Sr
eb60: 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  cList) );.    if
eb70: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
eb80: 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
eb90: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20  ->nAlloc = 1;.  
eba0: 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e  }.  if( pList->n
ebb0: 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c  Src>=pList->nAll
ebc0: 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  oc ){.    SrcLis
ebd0: 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69  t *pNew;.    pLi
ebe0: 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b  st->nAlloc *= 2;
ebf0: 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
ec00: 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c  teRealloc(pList,
ec10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ec20: 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b  sizeof(*pList) +
ec30: 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d   (pList->nAlloc-
ec40: 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  1)*sizeof(pList-
ec50: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  >a[0]) );.    if
ec60: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
ec70: 20 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74     sqliteSrcList
ec80: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
ec90: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
eca0: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d     }.    pList =
ecb0: 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 6d 65 6d   pNew;.  }.  mem
ecc0: 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  set(&pList->a[pL
ecd0: 69 73 74 2d 3e 6e 53 72 63 5d 2c 20 30 2c 20 73  ist->nSrc], 0, s
ece0: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
ecf0: 5d 29 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61  ]));.  if( pData
ed00: 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73  base && pDatabas
ed10: 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70  e->z==0 ){.    p
ed20: 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
ed30: 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  }.  if( pDatabas
ed40: 65 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a 20  e && pTable ){. 
ed50: 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20     Token *pTemp 
ed60: 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20  = pDatabase;.   
ed70: 20 70 44 61 74 61 62 61 73 65 20 3d 20 70 54 61   pDatabase = pTa
ed80: 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20  ble;.    pTable 
ed90: 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 69  = pTemp;.  }.  i
eda0: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
edb0: 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c   char **pz = &pL
edc0: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53  ist->a[pList->nS
edd0: 72 63 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73  rc].zName;.    s
ede0: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
edf0: 70 7a 2c 20 70 54 61 62 6c 65 2d 3e 7a 2c 20 70  pz, pTable->z, p
ee00: 54 61 62 6c 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20  Table->n, 0);.  
ee10: 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a    if( *pz==0 ){.
ee20: 20 20 20 20 20 20 73 71 6c 69 74 65 53 72 63 4c        sqliteSrcL
ee30: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
ee40: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
ee50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ee60: 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65     sqliteDequote
ee70: 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (*pz);.    }.  }
ee80: 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
ee90: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70   ){.    char **p
eea0: 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  z = &pList->a[pL
eeb0: 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a 44 61 74 61  ist->nSrc].zData
eec0: 62 61 73 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  base;.    sqlite
eed0: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70  SetNString(pz, p
eee0: 44 61 74 61 62 61 73 65 2d 3e 7a 2c 20 70 44 61  Database->z, pDa
eef0: 74 61 62 61 73 65 2d 3e 6e 2c 20 30 29 3b 0a 20  tabase->n, 0);. 
ef00: 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b     if( *pz==0 ){
ef10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 72 63  .      sqliteSrc
ef20: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
ef30: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
ef40: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
ef50: 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74      sqliteDequot
ef60: 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  e(*pz);.    }.  
ef70: 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69  }.  pList->a[pLi
ef80: 73 74 2d 3e 6e 53 72 63 5d 2e 69 43 75 72 73 6f  st->nSrc].iCurso
ef90: 72 20 3d 20 2d 31 3b 0a 20 20 70 4c 69 73 74 2d  r = -1;.  pList-
efa0: 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75 72  >nSrc++;.  retur
efb0: 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
efc0: 2a 20 41 73 73 69 67 6e 20 63 75 72 73 6f 72 73  * Assign cursors
efd0: 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   to all tables i
efe0: 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76  n a SrcList.*/.v
eff0: 6f 69 64 20 73 71 6c 69 74 65 53 72 63 4c 69 73  oid sqliteSrcLis
f000: 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50  tAssignCursors(P
f010: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
f020: 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
f030: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
f040: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  0; i<pList->nSrc
f050: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
f060: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  pList->a[i].iCur
f070: 73 6f 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  sor<0 ){.      p
f080: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
f090: 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
f0a0: 62 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  b++;.    }.  }.}
f0b0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61  ../*.** Add an a
f0c0: 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61 73 74  lias to the last
f0d0: 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 20 74   identifier on t
f0e0: 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74 69 66  he given identif
f0f0: 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ier list..*/.voi
f100: 64 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41  d sqliteSrcListA
f110: 64 64 41 6c 69 61 73 28 53 72 63 4c 69 73 74 20  ddAlias(SrcList 
f120: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
f130: 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c  Token){.  if( pL
f140: 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 53  ist && pList->nS
f150: 72 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  rc>0 ){.    int 
f160: 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20  i = pList->nSrc 
f170: 2d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 53  - 1;.    sqliteS
f180: 65 74 4e 53 74 72 69 6e 67 28 26 70 4c 69 73 74  etNString(&pList
f190: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20 70  ->a[i].zAlias, p
f1a0: 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e  Token->z, pToken
f1b0: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ->n, 0);.    sql
f1c0: 69 74 65 44 65 71 75 6f 74 65 28 70 4c 69 73 74  iteDequote(pList
f1d0: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a  ->a[i].zAlias);.
f1e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
f1f0: 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a  ete an IdList..*
f200: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 49 64 4c  /.void sqliteIdL
f210: 69 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74  istDelete(IdList
f220: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
f230: 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
f240: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
f250: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
f260: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
f270: 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
f280: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
f290: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
f2a0: 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
f2b0: 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
f2c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
f2d0: 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  he index in pLis
f2e0: 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66  t of the identif
f2f0: 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20  ier named zId.  
f300: 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
f310: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e  not found..*/.in
f320: 74 20 73 71 6c 69 74 65 49 64 4c 69 73 74 49 6e  t sqliteIdListIn
f330: 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  dex(IdList *pLis
f340: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
f350: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
f360: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
f370: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f   return -1;.  fo
f380: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
f390: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nId; i++){.    i
f3a0: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
f3b0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
f3c0: 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  me, zName)==0 ) 
f3d0: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
f3e0: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
f3f0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
f400: 74 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63  tire SrcList inc
f410: 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73  luding all its s
f420: 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  ubstructure..*/.
f430: 76 6f 69 64 20 73 71 6c 69 74 65 53 72 63 4c 69  void sqliteSrcLi
f440: 73 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74  stDelete(SrcList
f450: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
f460: 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
f470: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
f480: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
f490: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
f4a0: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
f4b0: 2d 3e 61 5b 69 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[i].zDatabase
f4c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
f4d0: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  e(pList->a[i].zN
f4e0: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
f4f0: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Free(pList->a[i]
f500: 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66  .zAlias);.    if
f510: 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54  ( pList->a[i].pT
f520: 61 62 20 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69  ab && pList->a[i
f530: 5d 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69  ].pTab->isTransi
f540: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ent ){.      sql
f550: 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30  iteDeleteTable(0
f560: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54  , pList->a[i].pT
f570: 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ab);.    }.    s
f580: 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74  qliteSelectDelet
f590: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53  e(pList->a[i].pS
f5a0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69  elect);.    sqli
f5b0: 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 4c 69  teExprDelete(pLi
f5c0: 73 74 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20  st->a[i].pOn);. 
f5d0: 20 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44     sqliteIdListD
f5e0: 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  elete(pList->a[i
f5f0: 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20  ].pUsing);.  }. 
f600: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
f610: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  t);.}../*.** Beg
f620: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
f630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 42  .*/.void sqliteB
f640: 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  eginTransaction(
f650: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
f660: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 73  nt onError){.  s
f670: 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69 66  qlite *db;..  if
f680: 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
f690: 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
f6a0: 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  0 || db->aDb[0].
f6b0: 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBt==0 ) return;
f6c0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
f6d0: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
f6e0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
f6f0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
f700: 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  teAuthCheck(pPar
f710: 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
f720: 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c  ACTION, "BEGIN",
f730: 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
f740: 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73  .  if( db->flags
f750: 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e   & SQLITE_InTran
f760: 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45  s ){.    sqliteE
f770: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
f780: 22 63 61 6e 6e 6f 74 20 73 74 61 72 74 20 61 20  "cannot start a 
f790: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 74 68  transaction with
f7a0: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
f7b0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
f7c0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 42 65 67 69    }.  sqliteBegi
f7d0: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
f7e0: 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20  pParse, 0, 0);. 
f7f0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
f800: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20  LITE_InTrans;.  
f810: 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e  db->onError = on
f820: 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Error;.}../*.** 
f830: 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63  Commit a transac
f840: 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
f850: 69 74 65 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63  iteCommitTransac
f860: 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
f870: 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  se){.  sqlite *d
f880: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
f890: 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
f8a0: 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
f8b0: 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
f8c0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
f8d0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
f8e0: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
f8f0: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
f900: 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68  if( sqliteAuthCh
f910: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
f920: 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
f930: 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20  "COMMIT", 0, 0) 
f940: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
f950: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
f960: 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20  ITE_InTrans)==0 
f970: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72  ){.    sqliteErr
f980: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
f990: 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 2d 20 6e  annot commit - n
f9a0: 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  o transaction is
f9b0: 20 61 63 74 69 76 65 22 29 3b 0a 20 20 20 20 72   active");.    r
f9c0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 64 62 2d  eturn;.  }.  db-
f9d0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
f9e0: 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 73 71 6c  E_InTrans;.  sql
f9f0: 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61  iteEndWriteOpera
fa00: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
fa10: 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45  db->onError = OE
fa20: 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  _Default;.}../*.
fa30: 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72  ** Rollback a tr
fa40: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
fa50: 64 20 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63 6b  d sqliteRollback
fa60: 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
fa70: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
fa80: 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65  lite *db;.  Vdbe
fa90: 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72   *v;..  if( pPar
faa0: 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61  se==0 || (db=pPa
fab0: 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64  rse->db)==0 || d
fac0: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
fad0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
fae0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
faf0: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
fb00: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
fb10: 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68    if( sqliteAuth
fb20: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
fb30: 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
fb40: 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c  , "ROLLBACK", 0,
fb50: 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   0) ) return;.  
fb60: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
fb70: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29   SQLITE_InTrans)
fb80: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
fb90: 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
fba0: 2c 20 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62 61  , "cannot rollba
fbb0: 63 6b 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74  ck - no transact
fbc0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 29 3b  ion is active");
fbd0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 0a 20 20  .    return; .  
fbe0: 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  }.  v = sqliteGe
fbf0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
fc00: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
fc10: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
fc20: 20 4f 50 5f 52 6f 6c 6c 62 61 63 6b 2c 20 30 2c   OP_Rollback, 0,
fc30: 20 30 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66   0);.  }.  db->f
fc40: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
fc50: 49 6e 54 72 61 6e 73 3b 0a 20 20 64 62 2d 3e 6f  InTrans;.  db->o
fc60: 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61  nError = OE_Defa
fc70: 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ult;.}../*.** Ge
fc80: 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
fc90: 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69 66   that will verif
fca0: 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
fcb0: 6b 69 65 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 6e  kie for all.** n
fcc0: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  amed database fi
fcd0: 6c 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  les..*/.void sql
fce0: 69 74 65 43 6f 64 65 56 65 72 69 66 79 53 63 68  iteCodeVerifySch
fcf0: 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
fd00: 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73  e, int iDb){.  s
fd10: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
fd20: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
fd30: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
fd40: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
fd50: 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
fd60: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
fd70: 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
fd80: 69 44 62 5d 2e 70 42 74 21 3d 30 20 29 3b 0a 20  iDb].pBt!=0 );. 
fd90: 20 69 66 28 20 69 44 62 21 3d 31 20 26 26 20 21   if( iDb!=1 && !
fda0: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
fdb0: 2c 20 69 44 62 2c 20 44 42 5f 43 6f 6f 6b 69 65  , iDb, DB_Cookie
fdc0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  ) ){.    sqliteV
fdd0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56  dbeAddOp(v, OP_V
fde0: 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69 44 62  erifyCookie, iDb
fdf0: 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73  , db->aDb[iDb].s
fe00: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 29 3b 0a 20  chema_cookie);. 
fe10: 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79     DbSetProperty
fe20: 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 43 6f 6f  (db, iDb, DB_Coo
fe30: 6b 69 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  kie);.  }.}../*.
fe40: 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
fe50: 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61   code that prepa
fe60: 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e  res for doing an
fe70: 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a   operation that.
fe80: 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
fe90: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
fea0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
feb0: 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72   starts a new tr
fec0: 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20  ansaction if we 
fed0: 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  are not already 
fee0: 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e  within.** a tran
fef0: 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20  saction.  If we 
ff00: 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68  are already with
ff10: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
ff20: 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f  , then a checkpo
ff30: 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66  int.** is set if
ff40: 20 74 68 65 20 73 65 74 43 68 65 63 6b 70 6f 69   the setCheckpoi
ff50: 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
ff60: 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f  true.  A checkpo
ff70: 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  int should.** be
ff80: 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69   set for operati
ff90: 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66  ons that might f
ffa0: 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f  ail (due to a co
ffb0: 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f  nstraint) part o
ffc0: 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72  f.** the way thr
ffd0: 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77  ough and which w
ffe0: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f  ill need to undo
fff0: 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74   some writes wit
10000 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a  hout having to.*
10010 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77  * rollback the w
10020 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  hole transaction
10030 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e  .  For operation
10040 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73  s where all cons
10050 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62  traints.** can b
10060 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65  e checked before
10070 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65   any changes are
10080 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
10090 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76  abase, it is nev
100a0 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20  er.** necessary 
100b0 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20  to undo a write 
100c0 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69  and the checkpoi
100d0 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  nt should not be
100e0 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79   set..**.** Only
100f0 20 64 61 74 61 62 61 73 65 20 69 44 62 20 61 6e   database iDb an
10100 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  d the temp datab
10110 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69  ase are made wri
10120 74 61 62 6c 65 20 62 79 20 74 68 69 73 20 63 61  table by this ca
10130 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30  ll..** If iDb==0
10140 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20  , then the main 
10150 61 6e 64 20 74 65 6d 70 20 64 61 74 61 62 61 73  and temp databas
10160 65 73 20 61 72 65 20 6d 61 64 65 20 77 72 69 74  es are made writ
10170 61 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44  able.   If.** iD
10180 62 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74  b==1 then only t
10190 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
101a0 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c   is made writabl
101b0 65 2e 20 20 49 66 20 69 44 62 3e 31 20 74 68 65  e.  If iDb>1 the
101c0 6e 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  n the.** specifi
101d0 65 64 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ed auxiliary dat
101e0 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 74 65  abase and the te
101f0 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20  mp database are 
10200 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a  made writable..*
10210 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 42 65 67  /.void sqliteBeg
10220 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
10230 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10240 69 6e 74 20 73 65 74 43 68 65 63 6b 70 6f 69 6e  int setCheckpoin
10250 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56  t, int iDb){.  V
10260 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
10270 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
10280 62 3b 0a 20 20 69 66 28 20 44 62 48 61 73 50 72  b;.  if( DbHasPr
10290 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20  operty(db, iDb, 
102a0 44 42 5f 4c 6f 63 6b 65 64 29 20 29 20 72 65 74  DB_Locked) ) ret
102b0 75 72 6e 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74  urn;.  v = sqlit
102c0 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
102d0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
102e0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 64 62  eturn;.  if( !db
102f0 2d 3e 61 44 62 5b 69 44 62 5d 2e 69 6e 54 72 61  ->aDb[iDb].inTra
10300 6e 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ns ){.    sqlite
10310 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10320 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62  Transaction, iDb
10330 2c 20 30 29 3b 0a 20 20 20 20 44 62 53 65 74 50  , 0);.    DbSetP
10340 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c  roperty(db, iDb,
10350 20 44 42 5f 4c 6f 63 6b 65 64 29 3b 0a 20 20 20   DB_Locked);.   
10360 20 73 71 6c 69 74 65 43 6f 64 65 56 65 72 69 66   sqliteCodeVerif
10370 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
10380 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 69 44  iDb);.    if( iD
10390 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  b!=1 ){.      sq
103a0 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70  liteBeginWriteOp
103b0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
103c0 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 2c 20 31  setCheckpoint, 1
103d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
103e0 20 69 66 28 20 73 65 74 43 68 65 63 6b 70 6f 69   if( setCheckpoi
103f0 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nt ){.    sqlite
10400 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10410 43 68 65 63 6b 70 6f 69 6e 74 2c 20 69 44 62 2c  Checkpoint, iDb,
10420 20 30 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72   0);.    DbSetPr
10430 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20  operty(db, iDb, 
10440 44 42 5f 4c 6f 63 6b 65 64 29 3b 0a 20 20 7d 0a  DB_Locked);.  }.
10450 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
10460 65 20 63 6f 64 65 20 74 68 61 74 20 63 6f 6e 63  e code that conc
10470 6c 75 64 65 73 20 61 6e 20 6f 70 65 72 61 74 69  ludes an operati
10480 6f 6e 20 74 68 61 74 20 6d 61 79 20 68 61 76 65  on that may have
10490 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 68 65 20   changed.** the 
104a0 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 61 20  database.  If a 
104b0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
104c0 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65  ction was starte
104d0 64 2c 20 74 68 65 6e 20 65 6d 69 74 0a 2a 2a 20  d, then emit.** 
104e0 61 6e 20 4f 50 5f 43 6f 6d 6d 69 74 20 74 68 61  an OP_Commit tha
104f0 74 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65  t will cause the
10500 20 63 68 61 6e 67 65 73 20 74 6f 20 62 65 20 63   changes to be c
10510 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
10520 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
10530 74 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 61 72  t checkpoints ar
10540 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
10550 63 6f 6d 6d 69 74 74 65 64 20 61 74 20 74 68 65  committed at the
10560 20 65 6e 64 20 6f 66 0a 2a 2a 20 61 20 73 74 61   end of.** a sta
10570 74 65 6d 65 6e 74 2e 20 20 4e 6f 74 65 20 61 6c  tement.  Note al
10580 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 63 61  so that there ca
10590 6e 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 63 61  n be multiple ca
105a0 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74  lls to .** sqlit
105b0 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  eBeginWriteOpera
105c0 74 69 6f 6e 28 29 20 62 75 74 20 74 68 65 72 65  tion() but there
105d0 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
105e0 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 63 61 6c 6c  a single.** call
105f0 20 74 6f 20 73 71 6c 69 74 65 45 6e 64 57 72 69   to sqliteEndWri
10600 74 65 4f 70 65 72 61 74 69 6f 6e 28 29 20 61 74  teOperation() at
10610 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
10620 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
10630 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10640 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
10650 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
10660 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  {.  Vdbe *v;.  s
10670 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
10680 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50  se->db;.  if( pP
10690 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20  arse->trigStack 
106a0 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 69 66 20  ) return; /* if 
106b0 74 68 69 73 20 69 73 20 69 6e 20 61 20 74 72 69  this is in a tri
106c0 67 67 65 72 20 2a 2f 0a 20 20 76 20 3d 20 73 71  gger */.  v = sq
106d0 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
106e0 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
106f0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
10700 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
10710 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20  TE_InTrans ){.  
10720 20 20 2f 2a 20 41 20 42 45 47 49 4e 20 68 61 73    /* A BEGIN has
10730 20 65 78 65 63 75 74 65 64 2e 20 20 44 6f 20 6e   executed.  Do n
10740 6f 74 20 63 6f 6d 6d 69 74 20 75 6e 74 69 6c 20  ot commit until 
10750 77 65 20 73 65 65 20 61 6e 20 65 78 70 6c 69 63  we see an explic
10760 69 74 0a 20 20 20 20 2a 2a 20 43 4f 4d 4d 49 54  it.    ** COMMIT
10770 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20   statement. */. 
10780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
10790 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
107a0 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b  P_Commit, 0, 0);
107b0 0a 20 20 7d 0a 7d 0a                             .  }.}.