/ Hex Artifact Content
Login

Artifact 85dee2c7d23f618b9c5384091df00cbf64cce527:


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 34 20 32 30 30 34 2f 30 32 2f 32 32 20 32  174 2004/02/22 2
0300: 30 3a 30 35 3a 30 31 20 64 72 68 20 45 78 70 20  0:05:01 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 4f 70 33 28 76 2c 20 4f 50 5f  teVdbeOp3(v, OP_
7180: 43 72 65 61 74 65 54 61 62 6c 65 2c 20 30 2c 20  CreateTable, 0, 
7190: 70 2d 3e 69 44 62 2c 20 28 63 68 61 72 2a 29 26  p->iDb, (char*)&
71a0: 70 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e  p->tnum, P3_POIN
71b0: 54 45 52 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  TER);.    }else{
71c0: 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77  .      /* A view
71d0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
71e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
71f0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a  Integer, 0, 0);.
7200: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e 75      }.    p->tnu
7210: 6d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  m = 0;.    sqlit
7220: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
7230: 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20  _Pull, 1, 0);.  
7240: 20 20 73 71 6c 69 74 65 56 64 62 65 4f 70 33 28    sqliteVdbeOp3(
7250: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
7260: 20 30 2c 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d   0, p->pSelect==
7270: 30 3f 22 74 61 62 6c 65 22 3a 22 76 69 65 77 22  0?"table":"view"
7280: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
7290: 20 20 73 71 6c 69 74 65 56 64 62 65 4f 70 33 28    sqliteVdbeOp3(
72a0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
72b0: 20 30 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29   0, p->zName, 0)
72c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
72d0: 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op3(v, OP_String
72e0: 2c 20 30 2c 20 30 2c 20 70 2d 3e 7a 4e 61 6d 65  , 0, 0, p->zName
72f0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
7300: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7310: 44 75 70 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20  Dup, 4, 0);.    
7320: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7330: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
7340: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 65   0);.    if( pSe
7350: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63 68  lect ){.      ch
7360: 61 72 20 2a 7a 20 3d 20 63 72 65 61 74 65 54 61  ar *z = createTa
7370: 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20 20 20 20  bleStmt(p);.    
7380: 20 20 6e 20 3d 20 7a 20 3f 20 73 74 72 6c 65 6e    n = z ? strlen
7390: 28 7a 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 73  (z) : 0;.      s
73a0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
73b0: 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a  3(v, -1, z, n);.
73c0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
73d0: 28 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (z);.    }else{.
73e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
73f0: 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  nd!=0 );.      n
7400: 20 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29   = Addr(pEnd->z)
7410: 20 2d 20 41 64 64 72 28 70 50 61 72 73 65 2d 3e   - Addr(pParse->
7420: 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 29 20 2b  sFirstToken.z) +
7430: 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
7440: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
7450: 2d 31 2c 20 70 50 61 72 73 65 2d 3e 73 46 69 72  -1, pParse->sFir
7460: 73 74 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a 20  stToken.z, n);. 
7470: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
7480: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
7490: 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 29  akeRecord, 5, 0)
74a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
74b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49  AddOp(v, OP_PutI
74c0: 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20  ntKey, 0, 0);.  
74d0: 20 20 69 66 28 20 21 70 2d 3e 69 44 62 20 29 7b    if( !p->iDb ){
74e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43 68 61  .      sqliteCha
74f0: 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29  ngeCookie(db, v)
7500: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
7510: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7520: 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
7530: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
7540: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
7550: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
7560: 6e 74 65 67 65 72 2c 20 70 2d 3e 69 44 62 2c 20  nteger, p->iDb, 
7570: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
7580: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7590: 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 30 29  OpenWrite, 1, 0)
75a0: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
75b0: 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20  nTab = 2;.      
75c0: 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61  sqliteSelect(pPa
75d0: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 53 52  rse, pSelect, SR
75e0: 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30  T_Table, 1, 0, 0
75f0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
7600: 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70  sqliteEndWriteOp
7610: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
7620: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74  .  }..  /* Add t
7630: 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  he table to the 
7640: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
7650: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
7660: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
7670: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
7680: 6c 61 69 6e 3d 3d 30 20 26 26 20 70 50 61 72 73  lain==0 && pPars
7690: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
76a0: 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20    Table *pOld;. 
76b0: 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a     FKey *pFKey;.
76c0: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
76d0: 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  eHashInsert(&db-
76e0: 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 74 62 6c  >aDb[p->iDb].tbl
76f0: 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20  Hash, .         
7700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7710: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72     p->zName, str
7720: 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c  len(p->zName)+1,
7730: 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c   p);.    if( pOl
7740: 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  d ){.      asser
7750: 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f  t( p==pOld );  /
7760: 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
7770: 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65  ve failed inside
7780: 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f   HashInsert() */
7790: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
77a0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 46 4b     }.    for(pFK
77b0: 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b  ey=p->pFKey; pFK
77c0: 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d  ey; pFKey=pFKey-
77d0: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
77e0: 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72     int nTo = str
77f0: 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20  len(pFKey->zTo) 
7800: 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 4b 65 79  + 1;.      pFKey
7810: 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69  ->pNextTo = sqli
7820: 74 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  teHashFind(&db->
7830: 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61 46 4b 65  aDb[p->iDb].aFKe
7840: 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e  y, pFKey->zTo, n
7850: 54 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  To);.      sqlit
7860: 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  eHashInsert(&db-
7870: 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61 46 4b  >aDb[p->iDb].aFK
7880: 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20  ey, pFKey->zTo, 
7890: 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20  nTo, pFKey);.   
78a0: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70   }.    pParse->p
78b0: 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  NewTable = 0;.  
78c0: 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a    db->nTable++;.
78d0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
78e0: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
78f0: 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  anges;.  }.}../*
7900: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
7910: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
7920: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72  e in order to cr
7930: 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a  eate a new VIEW.
7940: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 72  */.void sqliteCr
7950: 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73  eateView(.  Pars
7960: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
7970: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
7980: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
7990: 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a   *pBegin,     /*
79a0: 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
79b0: 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
79c0: 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
79d0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20   Token *pName,  
79e0: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
79f0: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
7a00: 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
7a10: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
7a20: 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45  elect,   /* A SE
7a30: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
7a40: 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
7a50: 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a  the new view */.
7a60: 20 20 69 6e 74 20 69 73 54 65 6d 70 20 20 20 20    int isTemp    
7a70: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72       /* TRUE for
7a80: 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65   a TEMPORARY vie
7a90: 77 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  w */.){.  Table 
7aa0: 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63  *p;.  int n;.  c
7ab0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
7ac0: 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62  Token sEnd;.  Db
7ad0: 46 69 78 65 72 20 73 46 69 78 3b 0a 0a 20 20 73  Fixer sFix;..  s
7ae0: 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c 65 28  qliteStartTable(
7af0: 70 50 61 72 73 65 2c 20 70 42 65 67 69 6e 2c 20  pParse, pBegin, 
7b00: 70 4e 61 6d 65 2c 20 69 73 54 65 6d 70 2c 20 31  pName, isTemp, 1
7b10: 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  );.  p = pParse-
7b20: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
7b30: 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  ( p==0 || pParse
7b40: 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71  ->nErr ){.    sq
7b50: 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65  liteSelectDelete
7b60: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72  (pSelect);.    r
7b70: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
7b80: 20 73 71 6c 69 74 65 46 69 78 49 6e 69 74 28 26   sqliteFixInit(&
7b90: 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 70 2d  sFix, pParse, p-
7ba0: 3e 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e  >iDb, "view", pN
7bb0: 61 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69  ame).    && sqli
7bc0: 74 65 46 69 78 53 65 6c 65 63 74 28 26 73 46 69  teFixSelect(&sFi
7bd0: 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b  x, pSelect).  ){
7be0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63  .    sqliteSelec
7bf0: 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29  tDelete(pSelect)
7c00: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
7c10: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63  }..  /* Make a c
7c20: 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72  opy of the entir
7c30: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
7c40: 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
7c50: 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54  the view..  ** T
7c60: 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61  his will force a
7c70: 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65  ll the Expr.toke
7c80: 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65  n.z values to be
7c90: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a   dynamically.  *
7ca0: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68  * allocated rath
7cb0: 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f  er than point to
7cc0: 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
7cd0: 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20  g - which means 
7ce0: 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77  that.  ** they w
7cf0: 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65  ill persist afte
7d00: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71  r the current sq
7d10: 6c 69 74 65 5f 65 78 65 63 28 29 20 63 61 6c 6c  lite_exec() call
7d20: 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20   returns..  */. 
7d30: 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71   p->pSelect = sq
7d40: 6c 69 74 65 53 65 6c 65 63 74 44 75 70 28 70 53  liteSelectDup(pS
7d50: 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
7d60: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
7d70: 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 21 70 50  lect);.  if( !pP
7d80: 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  arse->db->init.b
7d90: 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  usy ){.    sqlit
7da0: 65 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  eViewGetColumnNa
7db0: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  mes(pParse, p);.
7dc0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
7dd0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
7de0: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
7df0: 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e  ement.  Make sEn
7e00: 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20  d point to.  ** 
7e10: 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20  the end..  */.  
7e20: 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73  sEnd = pParse->s
7e30: 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28  LastToken;.  if(
7e40: 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26   sEnd.z[0]!=0 &&
7e50: 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20   sEnd.z[0]!=';' 
7e60: 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d  ){.    sEnd.z +=
7e70: 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73   sEnd.n;.  }.  s
7e80: 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d  End.n = 0;.  n =
7e90: 20 28 28 69 6e 74 29 73 45 6e 64 2e 7a 29 20 2d   ((int)sEnd.z) -
7ea0: 20 28 69 6e 74 29 70 42 65 67 69 6e 2d 3e 7a 3b   (int)pBegin->z;
7eb0: 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a  .  z = pBegin->z
7ec0: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26  ;.  while( n>0 &
7ed0: 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c  & (z[n-1]==';' |
7ee0: 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d  | isspace(z[n-1]
7ef0: 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73  )) ){ n--; }.  s
7f00: 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b  End.z = &z[n-1];
7f10: 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a  .  sEnd.n = 1;..
7f20: 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 45    /* Use sqliteE
7f30: 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64  ndTable() to add
7f40: 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65   the view to the
7f50: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
7f60: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
7f70: 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c  EndTable(pParse,
7f80: 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65   &sEnd, 0);.  re
7f90: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
7fa0: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
7fb0: 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61  re pTable is rea
7fc0: 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c  lly a VIEW.  Fil
7fd0: 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  l in the names o
7fe0: 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73  f.** the columns
7ff0: 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20   of the view in 
8000: 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63  the pTable struc
8010: 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68  ture.  Return th
8020: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65  e number.** of e
8030: 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72  rrors.  If an er
8040: 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76  ror is seen leav
8050: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
8060: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
8070: 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
8080: 6c 69 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d  liteViewGetColum
8090: 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50  nNames(Parse *pP
80a0: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
80b0: 62 6c 65 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  ble){.  ExprList
80c0: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 53 65 6c 65   *pEList;.  Sele
80d0: 63 74 20 2a 70 53 65 6c 3b 0a 20 20 54 61 62 6c  ct *pSel;.  Tabl
80e0: 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20 69 6e  e *pSelTab;.  in
80f0: 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 61  t nErr = 0;..  a
8100: 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b  ssert( pTable );
8110: 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76  ..  /* A positiv
8120: 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65  e nCol means the
8130: 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66   columns names f
8140: 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65  or this view are
8150: 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e  .  ** already kn
8160: 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  own..  */.  if( 
8170: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29  pTable->nCol>0 )
8180: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
8190: 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   A negative nCol
81a0: 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61   is a special ma
81b0: 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61  rker meaning tha
81c0: 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74  t we are current
81d0: 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  ly.  ** trying t
81e0: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  o compute the co
81f0: 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20  lumn names.  If 
8200: 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f  we enter this ro
8210: 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20  utine with.  ** 
8220: 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c  a negative nCol,
8230: 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72   it means two or
8240: 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d   more views form
8250: 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68   a loop, like th
8260: 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
8270: 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e    CREATE VIEW on
8280: 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  e AS SELECT * FR
8290: 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20  OM two;.  **    
82a0: 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f   CREATE VIEW two
82b0: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
82c0: 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  M one;.  **.  **
82d0: 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20   Actually, this 
82e0: 65 72 72 6f 72 20 69 73 20 63 61 75 67 68 74 20  error is caught 
82f0: 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64 20 73  previously and s
8300: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
8310: 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  test.  ** should
8320: 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 42   always fail.  B
8330: 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65  ut we will leave
8340: 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a 75 73   it in place jus
8350: 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a 20 20  t to be safe..  
8360: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
8370: 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73  >nCol<0 ){.    s
8380: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
8390: 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69  arse, "view %s i
83a0: 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66  s circularly def
83b0: 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  ined", pTable->z
83c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
83d0: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 1;.  }..  /* I
83e0: 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
83f0: 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e  r, it means we n
8400: 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
8410: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a  he table names..
8420: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
8430: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29  Table->pSelect )
8440: 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c  ; /* If nCol==0,
8450: 20 74 68 65 6e 20 70 54 61 62 6c 65 20 6d 75 73   then pTable mus
8460: 74 20 62 65 20 61 20 56 49 45 57 20 2a 2f 0a 20  t be a VIEW */. 
8470: 20 70 53 65 6c 20 3d 20 70 54 61 62 6c 65 2d 3e   pSel = pTable->
8480: 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e  pSelect;..  /* N
8490: 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c  ote that the cal
84a0: 6c 20 74 6f 20 73 71 6c 69 74 65 52 65 73 75 6c  l to sqliteResul
84b0: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77  tSetOfSelect() w
84c0: 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20  ill expand any. 
84d0: 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73   ** "*" elements
84e0: 20 69 6e 20 74 68 69 73 20 6c 69 73 74 2e 20 20   in this list.  
84f0: 42 75 74 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  But we will need
8500: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
8510: 6c 69 73 74 0a 20 20 2a 2a 20 62 61 63 6b 20 74  list.  ** back t
8520: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
8530: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 66 74  onfiguration aft
8540: 65 72 77 61 72 64 73 2c 20 73 6f 20 77 65 20 73  erwards, so we s
8550: 61 76 65 20 61 20 63 6f 70 79 20 6f 66 0a 20 20  ave a copy of.  
8560: 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** the original 
8570: 69 6e 20 70 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a  in pEList..  */.
8580: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 2d    pEList = pSel-
8590: 3e 70 45 4c 69 73 74 3b 0a 20 20 70 53 65 6c 2d  >pEList;.  pSel-
85a0: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
85b0: 45 78 70 72 4c 69 73 74 44 75 70 28 70 45 4c 69  ExprListDup(pELi
85c0: 73 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 2d  st);.  if( pSel-
85d0: 3e 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  >pEList==0 ){.  
85e0: 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d    pSel->pEList =
85f0: 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 72 65 74   pEList;.    ret
8600: 75 72 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  urn 1;  /* Mallo
8610: 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a  c failed */.  }.
8620: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
8630: 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d   -1;.  pSelTab =
8640: 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74   sqliteResultSet
8650: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
8660: 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 69 66 28   0, pSel);.  if(
8670: 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20   pSelTab ){.    
8680: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
8690: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70  aCol==0 );.    p
86a0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53  Table->nCol = pS
86b0: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
86c0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
86d0: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
86e0: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
86f0: 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61   = 0;.    pSelTa
8700: 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
8710: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
8720: 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a  le(0, pSelTab);.
8730: 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74      DbSetPropert
8740: 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  y(pParse->db, pT
8750: 61 62 6c 65 2d 3e 69 44 62 2c 20 44 42 5f 55 6e  able->iDb, DB_Un
8760: 72 65 73 65 74 56 69 65 77 73 29 3b 0a 20 20 7d  resetViews);.  }
8770: 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 6c 65  else{.    pTable
8780: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
8790: 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71  nErr++;.  }.  sq
87a0: 6c 69 74 65 53 65 6c 65 63 74 55 6e 62 69 6e 64  liteSelectUnbind
87b0: 28 70 53 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65  (pSel);.  sqlite
87c0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
87d0: 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sel->pEList);.  
87e0: 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70  pSel->pEList = p
87f0: 45 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e 20  EList;.  return 
8800: 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  nErr;  .}../*.**
8810: 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
8820: 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68 65  n names from the
8830: 20 56 49 45 57 20 70 54 61 62 6c 65 2e 0a 2a 2a   VIEW pTable..**
8840: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8850: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
8860: 76 65 72 20 61 6e 79 20 6f 74 68 65 72 20 74 61  ver any other ta
8870: 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 6d  ble or view is m
8880: 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 54 68 65 20  odified..** The 
8890: 76 69 65 77 20 70 61 73 73 65 64 20 69 6e 74 6f  view passed into
88a0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
88b0: 67 68 74 20 64 65 70 65 6e 64 20 64 69 72 65 63  ght depend direc
88c0: 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c  tly or indirectl
88d0: 79 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 64 69  y.** on the modi
88e0: 66 69 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  fied or deleted 
88f0: 74 61 62 6c 65 20 73 6f 20 77 65 20 6e 65 65 64  table so we need
8900: 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 6f 6c   to clear the ol
8910: 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d 65  d column.** name
8920: 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 77  s so that they w
8930: 69 6c 6c 20 62 65 20 72 65 63 6f 6d 70 75 74 65  ill be recompute
8940: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
8950: 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
8960: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62  tColumnNames(Tab
8970: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69  le *pTable){.  i
8980: 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  nt i;.  Column *
8990: 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  pCol;.  assert( 
89a0: 70 54 61 62 6c 65 21 3d 30 20 26 26 20 70 54 61  pTable!=0 && pTa
89b0: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20  ble->pSelect!=0 
89c0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  );.  for(i=0, pC
89d0: 6f 6c 3d 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b  ol=pTable->aCol;
89e0: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
89f0: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
8a00: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43     sqliteFree(pC
8a10: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
8a20: 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d  sqliteFree(pCol-
8a30: 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c  >zDflt);.    sql
8a40: 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54  iteFree(pCol->zT
8a50: 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ype);.  }.  sqli
8a60: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
8a70: 43 6f 6c 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Col);.  pTable->
8a80: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  aCol = 0;.  pTab
8a90: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a  le->nCol = 0;.}.
8aa0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
8ab0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72   column names fr
8ac0: 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e  om every VIEW in
8ad0: 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a   database idx..*
8ae0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
8af0: 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
8b00: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 69 6e 74  (sqlite *db, int
8b10: 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65   idx){.  HashEle
8b20: 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21 44 62 48  m *i;.  if( !DbH
8b30: 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  asProperty(db, i
8b40: 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
8b50: 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ews) ) return;. 
8b60: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
8b70: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b  hFirst(&db->aDb[
8b80: 69 64 78 5d 2e 74 62 6c 48 61 73 68 29 3b 20 69  idx].tblHash); i
8b90: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
8ba0: 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c  xt(i)){.    Tabl
8bb0: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
8bc0: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
8bd0: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
8be0: 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
8bf0: 74 65 56 69 65 77 52 65 73 65 74 43 6f 6c 75 6d  teViewResetColum
8c00: 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20  nNames(pTab);.  
8c10: 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61    }.  }.  DbClea
8c20: 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  rProperty(db, id
8c30: 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
8c40: 77 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  ws);.}../*.** Gi
8c50: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f  ven a token, loo
8c60: 6b 20 75 70 20 61 20 74 61 62 6c 65 20 77 69 74  k up a table wit
8c70: 68 20 74 68 61 74 20 6e 61 6d 65 2e 20 20 49 66  h that name.  If
8c80: 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 65 61 76   not found, leav
8c90: 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 66 6f  e.** an error fo
8ca0: 72 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  r the parser to 
8cb0: 66 69 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20  find and return 
8cc0: 4e 55 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  NULL..*/.Table *
8cd0: 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54  sqliteTableFromT
8ce0: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
8cf0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29  se, Token *pTok)
8d00: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
8d10: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
8d20: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
8d30: 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b  TableNameFromTok
8d40: 65 6e 28 70 54 6f 6b 29 3b 0a 20 20 69 66 28 20  en(pTok);.  if( 
8d50: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
8d60: 6e 20 30 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  n 0;.  pTab = sq
8d70: 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50  liteFindTable(pP
8d80: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  arse->db, zName,
8d90: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65   0);.  sqliteFre
8da0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  e(zName);.  if( 
8db0: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pTab==0 ){.    s
8dc0: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
8dd0: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
8de0: 61 62 6c 65 3a 20 25 54 22 2c 20 70 54 6f 6b 29  able: %T", pTok)
8df0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
8e00: 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Tab;.}../*.** Th
8e10: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8e20: 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77  lled to do the w
8e30: 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41  ork of a DROP TA
8e40: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
8e50: 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e  * pName is the n
8e60: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
8e70: 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a   to be dropped..
8e80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 72  */.void sqliteDr
8e90: 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
8ea0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
8eb0: 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 29  ame, int isView)
8ec0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  {.  Table *pTabl
8ed0: 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  e;.  Vdbe *v;.  
8ee0: 69 6e 74 20 62 61 73 65 3b 0a 20 20 73 71 6c 69  int base;.  sqli
8ef0: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
8f00: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
8f10: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
8f20: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
8f30: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
8f40: 74 75 72 6e 3b 0a 20 20 70 54 61 62 6c 65 20 3d  turn;.  pTable =
8f50: 20 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d   sqliteTableFrom
8f60: 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 4e  Token(pParse, pN
8f70: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ame);.  if( pTab
8f80: 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  le==0 ) return;.
8f90: 20 20 69 44 62 20 3d 20 70 54 61 62 6c 65 2d 3e    iDb = pTable->
8fa0: 69 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69  iDb;.  assert( i
8fb0: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
8fc0: 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65 66 20  >nDb );.#ifndef 
8fd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
8fe0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
8ff0: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
9000: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
9010: 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
9020: 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 20 20  pTable->iDb);.  
9030: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
9040: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62  b = db->aDb[pTab
9050: 6c 65 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  le->iDb].zName;.
9060: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75      if( sqliteAu
9070: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
9080: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
9090: 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20  Tab, 0, zDb)){. 
90a0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
90b0: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
90c0: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  w ){.      if( i
90d0: 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
90e0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
90f0: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20  ROP_TEMP_VIEW;. 
9100: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9110: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
9120: 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20  E_DROP_VIEW;.   
9130: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
9140: 20 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31        if( iDb==1
9150: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
9160: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
9170: 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
9180: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9190: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
91a0: 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  OP_TABLE;.      
91b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
91c0: 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28  sqliteAuthCheck(
91d0: 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54  pParse, code, pT
91e0: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20  able->zName, 0, 
91f0: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 72 65  zDb) ){.      re
9200: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
9210: 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68  if( sqliteAuthCh
9220: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
9230: 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 6c  TE_DELETE, pTabl
9240: 65 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  e->zName, 0, zDb
9250: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
9260: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  n;.    }.  }.#en
9270: 64 69 66 0a 20 20 69 66 28 20 70 54 61 62 6c 65  dif.  if( pTable
9280: 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
9290: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
92a0: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
92b0: 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72  %s may not be dr
92c0: 6f 70 70 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e  opped", pTable->
92d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 72  zName);.    pPar
92e0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
92f0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
9300: 28 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62  ( isView && pTab
9310: 6c 65 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  le->pSelect==0 )
9320: 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f  {.    sqliteErro
9330: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
9340: 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20  e DROP TABLE to 
9350: 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22  delete table %s"
9360: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
9370: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
9380: 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20  }.  if( !isView 
9390: 26 26 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  && pTable->pSele
93a0: 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
93b0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
93c0: 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20   "use DROP VIEW 
93d0: 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25  to delete view %
93e0: 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  s", pTable->zNam
93f0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
9400: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
9410: 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
9420: 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  e the table from
9430: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
9440: 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a  e.  ** on disk..
9450: 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
9460: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
9470: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
9480: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 4c 69   static VdbeOpLi
9490: 73 74 20 64 72 6f 70 54 61 62 6c 65 5b 5d 20 3d  st dropTable[] =
94a0: 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65   {.      { OP_Re
94b0: 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44  wind,     0, ADD
94c0: 52 28 38 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20  R(8),  0},.     
94d0: 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20   { OP_String,   
94e0: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30    0, 0,        0
94f0: 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20  }, /* 1 */.     
9500: 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20   { OP_MemStore, 
9510: 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20 20 30    1, 1,        0
9520: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65  },.      { OP_Me
9530: 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c 20  mLoad,    1, 0, 
9540: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20         0}, /* 3 
9550: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  */.      { OP_Co
9560: 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 32 2c 20  lumn,     0, 2, 
9570: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
9580: 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20   { OP_Ne,       
9590: 20 20 30 2c 20 41 44 44 52 28 37 29 2c 20 20 30    0, ADDR(7),  0
95a0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65  },.      { OP_De
95b0: 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20  lete,     0, 0, 
95c0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
95d0: 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20   { OP_Next,     
95e0: 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20 20 30    0, ADDR(3),  0
95f0: 7d 2c 20 2f 2a 20 37 20 2a 2f 0a 20 20 20 20 7d  }, /* 7 */.    }
9600: 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
9610: 78 3b 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a  x;.    Trigger *
9620: 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 73 71  pTrigger;.    sq
9630: 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70  liteBeginWriteOp
9640: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
9650: 30 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b  0, pTable->iDb);
9660: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c  ..    /* Drop al
9670: 6c 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63  l triggers assoc
9680: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
9690: 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
96a0: 65 64 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67  ed */.    pTrigg
96b0: 65 72 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54 72  er = pTable->pTr
96c0: 69 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65  igger;.    while
96d0: 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20  ( pTrigger ){.  
96e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69      assert( pTri
96f0: 67 67 65 72 2d 3e 69 44 62 3d 3d 70 54 61 62 6c  gger->iDb==pTabl
9700: 65 2d 3e 69 44 62 20 7c 7c 20 70 54 72 69 67 67  e->iDb || pTrigg
9710: 65 72 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20  er->iDb==1 );.  
9720: 20 20 20 20 73 71 6c 69 74 65 44 72 6f 70 54 72      sqliteDropTr
9730: 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c  iggerPtr(pParse,
9740: 20 70 54 72 69 67 67 65 72 2c 20 31 29 3b 0a 20   pTrigger, 1);. 
9750: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
9760: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
9770: 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
9780: 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a  Trigger->pNext;.
9790: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
97a0: 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20       pTrigger = 
97b0: 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72  pTable->pTrigger
97c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
97d0: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  .    /* Drop all
97e0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 65   SQLITE_MASTER e
97f0: 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65  ntries that refe
9800: 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a  r to the table *
9810: 2f 0a 20 20 20 20 73 71 6c 69 74 65 4f 70 65 6e  /.    sqliteOpen
9820: 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70  MasterTable(v, p
9830: 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 20 20 20  Table->iDb);.   
9840: 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 56 64   base = sqliteVd
9850: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
9860: 72 72 61 79 53 69 7a 65 28 64 72 6f 70 54 61 62  rraySize(dropTab
9870: 6c 65 29 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b  le), dropTable);
9880: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
9890: 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b  hangeP3(v, base+
98a0: 31 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  1, pTable->zName
98b0: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72  , 0);..    /* Dr
98c0: 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 54 45  op all SQLITE_TE
98d0: 4d 50 5f 4d 41 53 54 45 52 20 65 6e 74 72 69 65  MP_MASTER entrie
98e0: 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
98f0: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
9900: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 69 44 62   if( pTable->iDb
9910: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=1 ){.      sql
9920: 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  iteOpenMasterTab
9930: 6c 65 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20  le(v, 1);.      
9940: 62 61 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62  base = sqliteVdb
9950: 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
9960: 72 61 79 53 69 7a 65 28 64 72 6f 70 54 61 62 6c  raySize(dropTabl
9970: 65 29 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a  e), dropTable);.
9980: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
9990: 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65  ChangeP3(v, base
99a0: 2b 31 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  +1, pTable->zNam
99b0: 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  e, 0);.    }..  
99c0: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 69 44    if( pTable->iD
99d0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  b==0 ){.      sq
99e0: 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65  liteChangeCookie
99f0: 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a 20  (db, v);.    }. 
9a00: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
9a10: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
9a20: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21  0, 0);.    if( !
9a30: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
9a40: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
9a50: 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70  v, OP_Destroy, p
9a60: 54 61 62 6c 65 2d 3e 74 6e 75 6d 2c 20 70 54 61  Table->tnum, pTa
9a70: 62 6c 65 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20  ble->iDb);.     
9a80: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 6c 65   for(pIdx=pTable
9a90: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
9aa0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
9ab0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9ac0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
9ad0: 5f 44 65 73 74 72 6f 79 2c 20 70 49 64 78 2d 3e  _Destroy, pIdx->
9ae0: 74 6e 75 6d 2c 20 70 49 64 78 2d 3e 69 44 62 29  tnum, pIdx->iDb)
9af0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9b00: 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69      sqliteEndWri
9b10: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
9b20: 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  se);.  }..  /* D
9b30: 65 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  elete the in-mem
9b40: 6f 72 79 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ory description 
9b50: 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  of the table..  
9b60: 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
9b70: 6e 3a 20 69 66 20 74 68 65 20 53 51 4c 20 73 74  n: if the SQL st
9b80: 61 74 65 6d 65 6e 74 20 62 65 67 61 6e 20 77 69  atement began wi
9b90: 74 68 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b  th the EXPLAIN k
9ba0: 65 79 77 6f 72 64 2c 0a 20 20 2a 2a 20 74 68 65  eyword,.  ** the
9bb0: 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 73 68 6f  n no changes sho
9bc0: 75 6c 64 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a  uld be made..  *
9bd0: 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  /.  if( !pParse-
9be0: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
9bf0: 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44  sqliteUnlinkAndD
9c00: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
9c10: 54 61 62 6c 65 29 3b 0a 20 20 20 20 64 62 2d 3e  Table);.    db->
9c20: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
9c30: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
9c40: 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52   }.  sqliteViewR
9c50: 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29  esetAll(db, iDb)
9c60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
9c70: 72 6f 75 74 69 6e 65 20 63 6f 6e 73 74 72 75 63  routine construc
9c80: 74 73 20 61 20 50 33 20 73 74 72 69 6e 67 20 73  ts a P3 string s
9c90: 75 69 74 61 62 6c 65 20 66 6f 72 20 61 6e 20 4f  uitable for an O
9ca0: 50 5f 4d 61 6b 65 49 64 78 4b 65 79 0a 2a 2a 20  P_MakeIdxKey.** 
9cb0: 6f 70 63 6f 64 65 20 61 6e 64 20 61 64 64 73 20  opcode and adds 
9cc0: 74 68 61 74 20 50 33 20 73 74 72 69 6e 67 20 74  that P3 string t
9cd0: 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  o the most recen
9ce0: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73  tly inserted ins
9cf0: 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  truction.** in t
9d00: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
9d10: 6e 65 2e 20 20 54 68 65 20 50 33 20 73 74 72 69  ne.  The P3 stri
9d20: 6e 67 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ng consists of a
9d30: 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65   single characte
9d40: 72 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20 63 6f  r.** for each co
9d50: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 69 6e 64 65  lumn in the inde
9d60: 78 20 70 49 64 78 20 6f 66 20 74 61 62 6c 65 20  x pIdx of table 
9d70: 70 54 61 62 2e 20 20 49 66 20 74 68 65 20 63 6f  pTab.  If the co
9d80: 6c 75 6d 6e 20 75 73 65 73 0a 2a 2a 20 61 20 6e  lumn uses.** a n
9d90: 75 6d 65 72 69 63 20 73 6f 72 74 20 6f 72 64 65  umeric sort orde
9da0: 72 2c 20 74 68 65 6e 20 74 68 65 20 50 33 20 73  r, then the P3 s
9db0: 74 72 69 6e 67 20 63 68 61 72 61 63 74 65 72 20  tring character 
9dc0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
9dd0: 0a 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  .** that column 
9de0: 69 73 20 27 6e 27 2e 20 20 49 66 20 74 68 65 20  is 'n'.  If the 
9df0: 63 6f 6c 75 6d 6e 20 75 73 65 73 20 61 20 74 65  column uses a te
9e00: 78 74 20 73 6f 72 74 20 6f 72 64 65 72 2c 20 74  xt sort order, t
9e10: 68 65 6e 20 74 68 65 0a 2a 2a 20 50 33 20 73 74  hen the.** P3 st
9e20: 72 69 6e 67 20 69 73 20 27 74 27 2e 20 20 53 65  ring is 't'.  Se
9e30: 65 20 74 68 65 20 4f 50 5f 4d 61 6b 65 49 64 78  e the OP_MakeIdx
9e40: 4b 65 79 20 6f 70 63 6f 64 65 20 64 6f 63 75 6d  Key opcode docum
9e50: 65 6e 74 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  entation for.** 
9e60: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
9e70: 6d 61 74 69 6f 6e 2e 20 20 53 65 65 20 61 6c 73  mation.  See als
9e80: 6f 20 74 68 65 20 73 71 6c 69 74 65 41 64 64 4b  o the sqliteAddK
9e90: 65 79 54 79 70 65 28 29 20 72 6f 75 74 69 6e 65  eyType() routine
9ea0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9eb0: 41 64 64 49 64 78 4b 65 79 54 79 70 65 28 56 64  AddIdxKeyType(Vd
9ec0: 62 65 20 2a 76 2c 20 49 6e 64 65 78 20 2a 70 49  be *v, Index *pI
9ed0: 64 78 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 79  dx){.  char *zTy
9ee0: 70 65 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  pe;.  Table *pTa
9ef0: 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  b;.  int i, n;. 
9f00: 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30   assert( pIdx!=0
9f10: 20 26 26 20 70 49 64 78 2d 3e 70 54 61 62 6c 65   && pIdx->pTable
9f20: 21 3d 30 20 29 3b 0a 20 20 70 54 61 62 20 3d 20  !=0 );.  pTab = 
9f30: 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20  pIdx->pTable;.  
9f40: 6e 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  n = pIdx->nColum
9f50: 6e 3b 0a 20 20 7a 54 79 70 65 20 3d 20 73 71 6c  n;.  zType = sql
9f60: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 2b  iteMallocRaw( n+
9f70: 31 20 29 3b 0a 20 20 69 66 28 20 7a 54 79 70 65  1 );.  if( zType
9f80: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
9f90: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
9fa0: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c  +){.    int iCol
9fb0: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
9fc0: 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  n[i];.    assert
9fd0: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f  ( iCol>=0 && iCo
9fe0: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  l<pTab->nCol );.
9ff0: 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 61      if( (pTab->a
a000: 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 6f 72 74 4f 72  Col[iCol].sortOr
a010: 64 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f  der & SQLITE_SO_
a020: 54 59 50 45 4d 41 53 4b 29 3d 3d 53 51 4c 49 54  TYPEMASK)==SQLIT
a030: 45 5f 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20  E_SO_TEXT ){.   
a040: 20 20 20 7a 54 79 70 65 5b 69 5d 20 3d 20 27 74     zType[i] = 't
a050: 27 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ';.    }else{.  
a060: 20 20 20 20 7a 54 79 70 65 5b 69 5d 20 3d 20 27      zType[i] = '
a070: 6e 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n';.    }.  }.  
a080: 7a 54 79 70 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20  zType[n] = 0;.  
a090: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
a0a0: 50 33 28 76 2c 20 2d 31 2c 20 7a 54 79 70 65 2c  P3(v, -1, zType,
a0b0: 20 6e 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65   n);.  sqliteFre
a0c0: 65 28 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a  e(zType);.}../*.
a0d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a0e0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  is called to cre
a0f0: 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67  ate a new foreig
a100: 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62  n key on the tab
a110: 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  le.** currently 
a120: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
a130: 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65  on.  pFromCol de
a140: 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63  termines which c
a150: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
a160: 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70   current table p
a170: 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65  oint to the fore
a180: 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72  ign key.  If pFr
a190: 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a  omCol==0 then.**
a1a0: 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79   connect the key
a1b0: 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   to the last col
a1c0: 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70  umn inserted.  p
a1d0: 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  To is the name o
a1e0: 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72  f.** the table r
a1f0: 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f  eferred to.  pTo
a200: 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66  Col is a list of
a210: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f   tables in the o
a220: 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c  ther.** pTo tabl
a230: 65 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69  e that the forei
a240: 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f  gn key points to
a250: 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e  .  flags contain
a260: 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  s all.** informa
a270: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
a280: 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
a290: 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70  on algorithms sp
a2a0: 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68  ecified.** in th
a2b0: 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20  e ON DELETE, ON 
a2c0: 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e  UPDATE and ON IN
a2d0: 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SERT clauses..**
a2e0: 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75  .** An FKey stru
a2f0: 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64  cture is created
a300: 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
a310: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
a320: 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74  y.** under const
a330: 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ruction in the p
a340: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
a350: 20 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77   field.  The new
a360: 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20   FKey.** is not 
a370: 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e  linked into db->
a380: 61 46 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f  aFKey at this po
a390: 69 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20  int - that does 
a3a0: 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e  not happen.** un
a3b0: 74 69 6c 20 73 71 6c 69 74 65 45 6e 64 54 61 62  til sqliteEndTab
a3c0: 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  le()..**.** The 
a3d0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73  foreign key is s
a3e0: 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45  et for IMMEDIATE
a3f0: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20   processing.  A 
a400: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a  subsequent call.
a410: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 44 65 66 65  ** to sqliteDefe
a420: 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69  rForeignKey() mi
a430: 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20  ght change this 
a440: 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a  to DEFERRED..*/.
a450: 76 6f 69 64 20 73 71 6c 69 74 65 43 72 65 61 74  void sqliteCreat
a460: 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50  eForeignKey(.  P
a470: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
a480: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
a490: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 64 4c 69  ontext */.  IdLi
a4a0: 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 20  st *pFromCol,   
a4b0: 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
a4c0: 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70  his table that p
a4d0: 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61  oint to other ta
a4e0: 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
a4f0: 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  pTo,          /*
a500: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68   Name of the oth
a510: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 64  er table */.  Id
a520: 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20  List *pToCol,   
a530: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e     /* Columns in
a540: 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
a550: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
a560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
a570: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
a580: 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f  n algorithms. */
a590: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d  .){.  Table *p =
a5a0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
a5b0: 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  le;.  int nByte;
a5c0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
a5d0: 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nCol;.  char *z;
a5e0: 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d  .  FKey *pFKey =
a5f0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
a600: 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
a610: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
a620: 45 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  Err ) goto fk_en
a630: 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  d;.  if( pFromCo
a640: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  l==0 ){.    int 
a650: 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  iCol = p->nCol-1
a660: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  ;.    if( iCol<0
a670: 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
a680: 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26      if( pToCol &
a690: 26 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 31  & pToCol->nId!=1
a6a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a6b0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
a6c0: 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e   "foreign key on
a6d0: 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20   %s".         " 
a6e0: 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65  should reference
a6f0: 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e   only one column
a700: 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20   of table %T",. 
a710: 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b          p->aCol[
a720: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f  iCol].zName, pTo
a730: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  );.      goto fk
a740: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
a750: 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  nCol = 1;.  }els
a760: 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20  e if( pToCol && 
a770: 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 70 46 72  pToCol->nId!=pFr
a780: 6f 6d 43 6f 6c 2d 3e 6e 49 64 20 29 7b 0a 20 20  omCol->nId ){.  
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 0a 20 20 20 20 20 20 20  (pParse,.       
a7b0: 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75   "number of colu
a7c0: 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  mns in foreign k
a7d0: 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ey does not matc
a7e0: 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  h the number of 
a7f0: 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d  ".        "colum
a800: 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65  ns in the refere
a810: 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20  nced table");.  
a820: 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
a830: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c   }else{.    nCol
a840: 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 49 64   = pFromCol->nId
a850: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
a860: 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b  sizeof(*pFKey) +
a870: 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46 4b   nCol*sizeof(pFK
a880: 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70  ey->aCol[0]) + p
a890: 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28  To->n + 1;.  if(
a8a0: 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
a8b0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c  or(i=0; i<pToCol
a8c0: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
a8d0: 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c     nByte += strl
a8e0: 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  en(pToCol->a[i].
a8f0: 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  zName) + 1;.    
a900: 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20  }.  }.  pFKey = 
a910: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42  sqliteMalloc( nB
a920: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b  yte );.  if( pFK
a930: 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b 5f  ey==0 ) goto fk_
a940: 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 46  end;.  pFKey->pF
a950: 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79  rom = p;.  pFKey
a960: 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d  ->pNextFrom = p-
a970: 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63  >pFKey;.  z = (c
a980: 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a  har*)&pFKey[1];.
a990: 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20    pFKey->aCol = 
a9a0: 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a  (struct sColMap*
a9b0: 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f  )z;.  z += sizeo
a9c0: 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70  f(struct sColMap
a9d0: 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d  )*nCol;.  pFKey-
a9e0: 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63  >zTo = z;.  memc
a9f0: 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54  py(z, pTo->z, pT
aa00: 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e  o->n);.  z[pTo->
aa10: 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70  n] = 0;.  z += p
aa20: 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79  To->n+1;.  pFKey
aa30: 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20  ->pNextTo = 0;. 
aa40: 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e   pFKey->nCol = n
aa50: 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  Col;.  if( pFrom
aa60: 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  Col==0 ){.    pF
aa70: 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72  Key->aCol[0].iFr
aa80: 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  om = p->nCol-1;.
aa90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
aaa0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
aab0: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  +){.      int j;
aac0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
aad0: 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  j<p->nCol; j++){
aae0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
aaf0: 69 74 65 53 74 72 49 43 6d 70 28 70 2d 3e 61 43  iteStrICmp(p->aC
ab00: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72  ol[j].zName, pFr
ab10: 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
ab20: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
ab30: 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69     pFKey->aCol[i
ab40: 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20  ].iFrom = j;.   
ab50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ab60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ab70: 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e        if( j>=p->
ab80: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
ab90: 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
aba0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
abb0: 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d    "unknown colum
abc0: 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65  n \"%s\" in fore
abd0: 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
abe0: 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  on", .          
abf0: 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
ac00: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
ac10: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
ac20: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
ac30: 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
ac40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
ac50: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
ac60: 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54  nt n = strlen(pT
ac70: 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
ac80: 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  );.      pFKey->
ac90: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a  aCol[i].zCol = z
aca0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
acb0: 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  , pToCol->a[i].z
acc0: 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  Name, n);.      
acd0: 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  z[n] = 0;.      
ace0: 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a  z += n+1;.    }.
acf0: 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44    }.  pFKey->isD
ad00: 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70  eferred = 0;.  p
ad10: 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66  FKey->deleteConf
ad20: 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66 66 3b   = flags & 0xff;
ad30: 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61 74 65  .  pFKey->update
ad40: 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e  Conf = (flags >>
ad50: 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20 20 70   8 ) & 0xff;.  p
ad60: 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66  FKey->insertConf
ad70: 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31 36 20   = (flags >> 16 
ad80: 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a 20  ) & 0xff;..  /* 
ad90: 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e  Link the foreign
ada0: 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c   key to the tabl
adb0: 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74  e as the last st
adc0: 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46  ep..  */.  p->pF
add0: 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70  Key = pFKey;.  p
ade0: 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e  FKey = 0;..fk_en
adf0: 64 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  d:.  sqliteFree(
ae00: 70 46 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65  pFKey);.  sqlite
ae10: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 46 72  IdListDelete(pFr
ae20: 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  omCol);.  sqlite
ae30: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 54 6f  IdListDelete(pTo
ae40: 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Col);.}../*.** T
ae50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
ae60: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e  alled when an IN
ae70: 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
ae80: 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44  E or INITIALLY D
ae90: 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73  EFERRED.** claus
aea0: 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61 72  e is seen as par
aeb0: 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b  t of a foreign k
aec0: 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20  ey definition.  
aed0: 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a  The isDeferred.*
aee0: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 31  * parameter is 1
aef0: 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44   for INITIALLY D
af00: 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f  EFERRED and 0 fo
af10: 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  r INITIALLY IMME
af20: 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65  DIATE..** The be
af30: 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f  havior of the mo
af40: 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61  st recently crea
af50: 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ted foreign key 
af60: 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61  is adjusted.** a
af70: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76  ccordingly..*/.v
af80: 6f 69 64 20 73 71 6c 69 74 65 44 65 66 65 72 46  oid sqliteDeferF
af90: 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20  oreignKey(Parse 
afa0: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44  *pParse, int isD
afb0: 65 66 65 72 72 65 64 29 7b 0a 20 20 54 61 62 6c  eferred){.  Tabl
afc0: 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20  e *pTab;.  FKey 
afd0: 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70  *pFKey;.  if( (p
afe0: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
aff0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28  ewTable)==0 || (
b000: 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46  pFKey = pTab->pF
b010: 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Key)==0 ) return
b020: 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  ;.  pFKey->isDef
b030: 65 72 72 65 64 20 3d 20 69 73 44 65 66 65 72 72  erred = isDeferr
b040: 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ed;.}../*.** Cre
b050: 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20  ate a new index 
b060: 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65  for an SQL table
b070: 2e 20 20 70 49 6e 64 65 78 20 69 73 20 74 68 65  .  pIndex is the
b080: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
b090: 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 61 62 6c  ex .** and pTabl
b0a0: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
b0b0: 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
b0c0: 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
b0d0: 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a  .  Both will .**
b0e0: 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70   be NULL for a p
b0f0: 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e  rimary key or an
b100: 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63   index that is c
b110: 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66  reated to satisf
b120: 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f  y a.** UNIQUE co
b130: 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54  nstraint.  If pT
b140: 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20  able and pIndex 
b150: 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50  are NULL, use pP
b160: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a  arse->pNewTable.
b170: 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20  ** as the table 
b180: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
b190: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
b1a0: 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61  e is a table tha
b1b0: 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  t is.** currentl
b1c0: 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
b1d0: 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20  ted by a CREATE 
b1e0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
b1f0: 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20  .**.** pList is 
b200: 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  a list of column
b210: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
b220: 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20    pList will be 
b230: 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20  NULL if this.** 
b240: 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  is a primary key
b250: 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74   or unique-const
b260: 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73  raint on the mos
b270: 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20  t recent column 
b280: 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  added.** to the 
b290: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
b2a0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
b2b0: 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  on.  .*/.void sq
b2c0: 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65 78 28  liteCreateIndex(
b2d0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
b2e0: 2c 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72  ,   /* All infor
b2f0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69  mation about thi
b300: 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b  s parse */.  Tok
b310: 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f 2a  en *pName,    /*
b320: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   Name of the ind
b330: 65 78 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ex.  May be NULL
b340: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
b350: 54 61 62 6c 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f  Table, /* Name o
b360: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 69  f the table to i
b370: 6e 64 65 78 2e 20 20 55 73 65 20 70 50 61 72 73  ndex.  Use pPars
b380: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20  e->pNewTable if 
b390: 30 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70  0 */.  IdList *p
b3a0: 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73  List,   /* A lis
b3b0: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
b3c0: 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
b3d0: 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
b3e0: 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45   /* OE_Abort, OE
b3f0: 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c  _Ignore, OE_Repl
b400: 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20  ace, or OE_None 
b410: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61  */.  Token *pSta
b420: 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 43 52 45  rt,   /* The CRE
b430: 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
b440: 65 67 69 6e 73 20 61 20 43 52 45 41 54 45 20 54  egins a CREATE T
b450: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  ABLE statement *
b460: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20  /.  Token *pEnd 
b470: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20       /* The ")" 
b480: 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20  that closes the 
b490: 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
b4a0: 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54  tement */.){.  T
b4b0: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
b4c0: 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69  /* Table to be i
b4d0: 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ndexed */.  Inde
b4e0: 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 2f 2a 20  x *pIndex;   /* 
b4f0: 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
b500: 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61  created */.  cha
b510: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
b520: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65  int i, j;.  Toke
b530: 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 2f 2a 20  n nullId;    /* 
b540: 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61  Fake token for a
b550: 6e 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20  n empty ID list 
b560: 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  */.  DbFixer sFi
b570: 78 3b 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73  x;    /* For ass
b580: 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  igning database 
b590: 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20  names to pTable 
b5a0: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 3b  */.  int isTemp;
b5b0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
b5c0: 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 69 6e  r a temporary in
b5d0: 64 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20  dex */.  sqlite 
b5e0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
b5f0: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
b600: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f  >nErr || sqlite_
b610: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
b620: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
b630: 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 64 62  _index;.  if( db
b640: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 0a 20 20 20  ->init.busy .   
b650: 20 20 26 26 20 73 71 6c 69 74 65 46 69 78 49 6e    && sqliteFixIn
b660: 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
b670: 2c 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 2c 20  , db->init.iDb, 
b680: 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 0a  "index", pName).
b690: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 46 69       && sqliteFi
b6a0: 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20  xSrcList(&sFix, 
b6b0: 70 54 61 62 6c 65 29 0a 20 20 29 7b 0a 20 20 20  pTable).  ){.   
b6c0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
b6d0: 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
b6e0: 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
b6f0: 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
b700: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52  o be indexed.  R
b710: 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e  eturn early if n
b720: 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
b730: 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29   if( pTable!=0 )
b740: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
b750: 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  ame!=0 );.    as
b760: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 53  sert( pTable->nS
b770: 72 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61  rc==1 );.    pTa
b780: 62 20 3d 20 20 73 71 6c 69 74 65 53 72 63 4c 69  b =  sqliteSrcLi
b790: 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  stLookup(pParse,
b7a0: 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73   pTable);.  }els
b7b0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
b7c0: 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Name==0 );.    p
b7d0: 54 61 62 20 3d 20 20 70 50 61 72 73 65 2d 3e 70  Tab =  pParse->p
b7e0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  NewTable;.  }.  
b7f0: 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70  if( pTab==0 || p
b800: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
b810: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
b820: 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62  ndex;.  if( pTab
b830: 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
b840: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
b850: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
b860: 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  %s may not be in
b870: 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  dexed", pTab->zN
b880: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
b890: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
b8a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62  ;.  }.  if( pTab
b8b0: 2d 3e 69 44 62 3e 3d 32 20 26 26 20 64 62 2d 3e  ->iDb>=2 && db->
b8c0: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
b8d0: 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
b8e0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
b8f0: 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 68 61 76  e %s may not hav
b900: 65 20 69 6e 64 69 63 65 73 20 61 64 64 65 64 22  e indices added"
b910: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
b920: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
b930: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
b940: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
b950: 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
b960: 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
b970: 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74  , "views may not
b980: 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
b990: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
b9a0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
b9b0: 20 69 73 54 65 6d 70 20 3d 20 70 54 61 62 2d 3e   isTemp = pTab->
b9c0: 69 44 62 3d 3d 31 3b 0a 0a 20 20 2f 2a 0a 20 20  iDb==1;..  /*.  
b9d0: 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65  ** Find the name
b9e0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
b9f0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
ba00: 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
ba10: 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65  nother.  ** inde
ba20: 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20  x or table with 
ba30: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
ba40: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
ba50: 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65  tion:  If we are
ba60: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d   reading the nam
ba70: 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20  es of permanent 
ba80: 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65  indices from the
ba90: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73  .  ** sqlite_mas
baa0: 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75  ter table (becau
bab0: 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
bac0: 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68  ocess changed th
bad0: 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20  e schema) and.  
bae0: 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  ** one of the in
baf0: 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64  dex names collid
bb00: 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  es with the name
bb10: 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   of a temporary 
bb20: 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e  table or.  ** in
bb30: 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c  dex, then we wil
bb40: 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72  l continue to pr
bb50: 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78  ocess this index
bb60: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
bb70: 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
bb80: 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a   that we are.  *
bb90: 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  * dealing with a
bba0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
bbb0: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
bbc0: 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  t.  We have to i
bbd0: 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f  nvent our.  ** o
bbe0: 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  wn name..  */.  
bbf0: 69 66 28 20 70 4e 61 6d 65 20 26 26 20 21 64 62  if( pName && !db
bc00: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
bc10: 20 20 20 49 6e 64 65 78 20 2a 70 49 53 61 6d 65     Index *pISame
bc20: 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 6e 6f 74  Name;    /* Anot
bc30: 68 65 72 20 69 6e 64 65 78 20 77 69 74 68 20 74  her index with t
bc40: 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a  he same name */.
bc50: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 53 61 6d      Table *pTSam
bc60: 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74  eName;    /* A t
bc70: 61 62 6c 65 20 77 69 74 68 20 73 61 6d 65 20 6e  able with same n
bc80: 61 6d 65 20 61 73 20 74 68 65 20 69 6e 64 65 78  ame as the index
bc90: 20 2a 2f 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   */.    zName = 
bca0: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e  sqliteStrNDup(pN
bcb0: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
bcc0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
bcd0: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
bce0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
bcf0: 20 20 69 66 28 20 28 70 49 53 61 6d 65 4e 61 6d    if( (pISameNam
bd00: 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e  e = sqliteFindIn
bd10: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  dex(db, zName, 0
bd20: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ))!=0 ){.      s
bd30: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
bd40: 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20  arse, "index %s 
bd50: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
bd60: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67   zName);.      g
bd70: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
bd80: 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
bd90: 20 69 66 28 20 28 70 54 53 61 6d 65 4e 61 6d 65   if( (pTSameName
bda0: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62   = sqliteFindTab
bdb0: 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  le(db, zName, 0)
bdc0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=0 ){.      sq
bdd0: 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61  liteErrorMsg(pPa
bde0: 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
bdf0: 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e  lready a table n
be00: 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29  amed %s", zName)
be10: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
be20: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
be30: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
be40: 28 20 70 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( pName==0 ){.  
be50: 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
be60: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
be70: 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20  Index *pLoop;.  
be80: 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62    for(pLoop=pTab
be90: 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70  ->pIndex, n=1; p
bea0: 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
beb0: 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d  p->pNext, n++){}
bec0: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
bed0: 66 2c 22 25 64 29 22 2c 6e 29 3b 0a 20 20 20 20  f,"%d)",n);.    
bee0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73  zName = 0;.    s
bef0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
bf00: 7a 4e 61 6d 65 2c 20 22 28 22 2c 20 70 54 61 62  zName, "(", pTab
bf10: 2d 3e 7a 4e 61 6d 65 2c 20 22 20 61 75 74 6f 69  ->zName, " autoi
bf20: 6e 64 65 78 20 22 2c 20 7a 42 75 66 2c 20 28 63  ndex ", zBuf, (c
bf30: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 69 66 28  har*)0);.    if(
bf40: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f   zName==0 ) goto
bf50: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
bf60: 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ex;.  }else{.   
bf70: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53   zName = sqliteS
bf80: 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c  trNDup(pName->z,
bf90: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 7d 0a   pName->n);.  }.
bfa0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
bfb0: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f  authorization to
bfc0: 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78   create an index
bfd0: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
bfe0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
bff0: 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
c000: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
c010: 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d   = db->aDb[pTab-
c020: 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20  >iDb].zName;..  
c030: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
c040: 69 44 62 3d 3d 64 62 2d 3e 69 6e 69 74 2e 69 44  iDb==db->init.iD
c050: 62 20 7c 7c 20 69 73 54 65 6d 70 20 29 3b 0a 20  b || isTemp );. 
c060: 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74     if( sqliteAut
c070: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
c080: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
c090: 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d  HEMA_TABLE(isTem
c0a0: 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  p), 0, zDb) ){. 
c0b0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
c0c0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
c0d0: 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54   }.    i = SQLIT
c0e0: 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a  E_CREATE_INDEX;.
c0f0: 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29      if( isTemp )
c100: 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
c110: 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  TE_TEMP_INDEX;. 
c120: 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74     if( sqliteAut
c130: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69  hCheck(pParse, i
c140: 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  , zName, pTab->z
c150: 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
c160: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
c170: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
c180: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
c190: 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20  /* If pList==0, 
c1a0: 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f  it means this ro
c1b0: 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
c1c0: 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61   to make a prima
c1d0: 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20  ry.  ** key out 
c1e0: 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  of the last colu
c1f0: 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  mn added to the 
c200: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
c210: 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53  truction..  ** S
c220: 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20  o create a fake 
c230: 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65  list to simulate
c240: 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   this..  */.  if
c250: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
c260: 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61    nullId.z = pTa
c270: 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
c280: 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol-1].zName;.   
c290: 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c   nullId.n = strl
c2a0: 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20  en(nullId.z);.  
c2b0: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
c2c0: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  IdListAppend(0, 
c2d0: 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66  &nullId);.    if
c2e0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
c2f0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
c300: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a  dex;.  }..  /* .
c310: 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    ** Allocate th
c320: 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
c330: 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65  e. .  */.  pInde
c340: 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  x = sqliteMalloc
c350: 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20  ( sizeof(Index) 
c360: 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20  + strlen(zName) 
c370: 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20  + 1 +.          
c380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
c390: 7a 65 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d  zeof(int)*pList-
c3a0: 3e 6e 49 64 20 29 3b 0a 20 20 69 66 28 20 70 49  >nId );.  if( pI
c3b0: 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65  ndex==0 ) goto e
c3c0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
c3d0: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  ;.  pIndex->aiCo
c3e0: 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49  lumn = (int*)&pI
c3f0: 6e 64 65 78 5b 31 5d 3b 0a 20 20 70 49 6e 64 65  ndex[1];.  pInde
c400: 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  x->zName = (char
c410: 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  *)&pIndex->aiCol
c420: 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b  umn[pList->nId];
c430: 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64 65 78  .  strcpy(pIndex
c440: 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  ->zName, zName);
c450: 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  .  pIndex->pTabl
c460: 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64  e = pTab;.  pInd
c470: 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c  ex->nColumn = pL
c480: 69 73 74 2d 3e 6e 49 64 3b 0a 20 20 70 49 6e 64  ist->nId;.  pInd
c490: 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e  ex->onError = on
c4a0: 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d  Error;.  pIndex-
c4b0: 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61  >autoIndex = pNa
c4c0: 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d  me==0;.  pIndex-
c4d0: 3e 69 44 62 20 3d 20 69 73 54 65 6d 70 20 3f 20  >iDb = isTemp ? 
c4e0: 31 20 3a 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  1 : db->init.iDb
c4f0: 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65  ;..  /* Scan the
c500: 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
c510: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62  lumns of the tab
c520: 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
c530: 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74   and.  ** load t
c540: 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65  he column indice
c550: 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78  s into the Index
c560: 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 70   structure.  Rep
c570: 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a  ort an error.  *
c580: 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  * if any column 
c590: 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  is not found..  
c5a0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
c5b0: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
c5c0: 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
c5d0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
c5e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
c5f0: 69 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73 74  iteStrICmp(pList
c600: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[i].zName, pT
c610: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
c620: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
c630: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d     }.    if( j>=
c640: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
c650: 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
c660: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
c670: 65 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75  e %s has no colu
c680: 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20  mn named %s",.  
c690: 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
c6a0: 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  e, pList->a[i].z
c6b0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Name);.      sql
c6c0: 69 74 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b  iteFree(pIndex);
c6d0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
c6e0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
c6f0: 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
c700: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a  >aiColumn[i] = j
c710: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b  ;.  }..  /* Link
c720: 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73   the new Index s
c730: 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20  tructure to its 
c740: 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65  table and to the
c750: 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d   other.  ** in-m
c760: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73  emory database s
c770: 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f  tructures. .  */
c780: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
c790: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 49  explain ){.    I
c7a0: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d  ndex *p;.    p =
c7b0: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72   sqliteHashInser
c7c0: 74 28 26 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65  t(&db->aDb[pInde
c7d0: 78 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c  x->iDb].idxHash,
c7e0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
c7f0: 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65             pInde
c800: 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  x->zName, strlen
c810: 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b  (pIndex->zName)+
c820: 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  1, pIndex);.    
c830: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61  if( p ){.      a
c840: 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78  ssert( p==pIndex
c850: 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
c860: 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
c870: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  */.      sqliteF
c880: 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20  ree(pIndex);.   
c890: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
c8a0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
c8b0: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
c8c0: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
c8d0: 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f  hanges;.  }..  /
c8e0: 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e  * When adding an
c8f0: 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69   index to the li
c900: 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f  st of indices fo
c910: 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a  r a table, make.
c920: 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e    ** sure all in
c930: 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45  dices labeled OE
c940: 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66  _Replace come af
c950: 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61  ter all those la
c960: 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67  beled.  ** OE_Ig
c970: 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e  nore.  This is n
c980: 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65  ecessary for the
c990: 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69   correct operati
c9a0: 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a  on of UPDATE.  *
c9b0: 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20  * and INSERT..  
c9c0: 2a 2f 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72  */.  if( onError
c9d0: 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20  !=OE_Replace || 
c9e0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a  pTab->pIndex==0.
c9f0: 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e         || pTab->
ca00: 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d  pIndex->onError=
ca10: 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20  =OE_Replace){.  
ca20: 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
ca30: 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
ca40: 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78      pTab->pIndex
ca50: 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c   = pIndex;.  }el
ca60: 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  se{.    Index *p
ca70: 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49  Other = pTab->pI
ca80: 6e 64 65 78 3b 0a 20 20 20 20 77 68 69 6c 65 28  ndex;.    while(
ca90: 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26   pOther->pNext &
caa0: 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d  & pOther->pNext-
cab0: 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70  >onError!=OE_Rep
cac0: 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 70 4f  lace ){.      pO
cad0: 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70  ther = pOther->p
cae0: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
caf0: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
cb00: 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
cb10: 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74     pOther->pNext
cb20: 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a   = pIndex;.  }..
cb30: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
cb40: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69  init.busy is 1 i
cb50: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
cb60: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
cb70: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
cb80: 69 74 65 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  ite_master" tabl
cb90: 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 20 20  e on the disk.  
cba0: 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  So do not write 
cbb0: 74 6f 20 74 68 65 20 64 69 73 6b 0a 20 20 2a 2a  to the disk.  **
cbc0: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
cbd0: 20 74 68 65 20 74 61 62 6c 65 20 6e 75 6d 62 65   the table numbe
cbe0: 72 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69  r from the db->i
cbf0: 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c  nit.newTnum fiel
cc00: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  d..  */.  if( db
cc10: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
cc20: 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20  Table!=0 ){.    
cc30: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64  pIndex->tnum = d
cc40: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
cc50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
cc60: 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
cc70: 69 73 20 30 20 74 68 65 6e 20 63 72 65 61 74 65  is 0 then create
cc80: 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69   the index on di
cc90: 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69  sk.  This.  ** i
cca0: 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20  nvolves writing 
ccb0: 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74  the index into t
ccc0: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
ccd0: 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  and filling in t
cce0: 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69  he.  ** index wi
ccf0: 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  th the current t
cd00: 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20  able contents.. 
cd10: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d   **.  ** The db-
cd20: 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20  >init.busy is 0 
cd30: 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 66 69  when the user fi
cd40: 72 73 74 20 65 6e 74 65 72 73 20 61 20 43 52 45  rst enters a CRE
cd50: 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20  ATE INDEX .  ** 
cd60: 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e  command.  db->in
cd70: 69 74 2e 62 75 73 79 20 69 73 20 31 20 77 68 65  it.busy is 1 whe
cd80: 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20  n a database is 
cd90: 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a  opened and .  **
cda0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
cdb0: 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61  atements are rea
cdc0: 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73  d out of the mas
cdd0: 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20  ter table.  In. 
cde0: 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63   ** the latter c
cdf0: 61 73 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c  ase the index al
ce00: 72 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20  ready exists on 
ce10: 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77  disk, which is w
ce20: 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74  hy.  ** we don't
ce30: 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74   want to recreat
ce40: 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  e it..  **.  ** 
ce50: 49 66 20 70 54 61 62 6c 65 3d 3d 30 20 69 74 20  If pTable==0 it 
ce60: 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78  means this index
ce70: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73   is generated as
ce80: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20   a primary key. 
ce90: 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f   ** or UNIQUE co
cea0: 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52  nstraint of a CR
ceb0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
cec0: 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65  ment.  Since the
ced0: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20   table.  ** has 
cee0: 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65  just been create
cef0: 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e  d, it contains n
cf00: 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69  o data and the i
cf10: 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74  ndex initializat
cf20: 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61  ion.  ** step ca
cf30: 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20  n be skipped..  
cf40: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62  */.  else if( db
cf50: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
cf60: 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
cf70: 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 69 6e   Vdbe *v;.    in
cf80: 74 20 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a 20 20  t lbl1, lbl2;.  
cf90: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
cfa0: 20 61 64 64 72 3b 0a 0a 20 20 20 20 76 20 3d 20   addr;..    v = 
cfb0: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
cfc0: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
cfd0: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
cfe0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
cff0: 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20    if( pTable!=0 
d000: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42  ){.      sqliteB
d010: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
d020: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 73  on(pParse, 0, is
d030: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
d040: 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  iteOpenMasterTab
d050: 6c 65 28 76 2c 20 69 73 54 65 6d 70 29 3b 0a 20  le(v, isTemp);. 
d060: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
d070: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
d080: 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a  ewRecno, 0, 0);.
d090: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 4f 70      sqliteVdbeOp
d0a0: 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  3(v, OP_String, 
d0b0: 30 2c 20 30 2c 20 22 69 6e 64 65 78 22 2c 20 50  0, 0, "index", P
d0c0: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  3_STATIC);.    s
d0d0: 71 6c 69 74 65 56 64 62 65 4f 70 33 28 76 2c 20  qliteVdbeOp3(v, 
d0e0: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c  OP_String, 0, 0,
d0f0: 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
d100: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
d110: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69  beOp3(v, OP_Stri
d120: 6e 67 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e  ng, 0, 0, pTab->
d130: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
d140: 71 6c 69 74 65 56 64 62 65 4f 70 33 28 76 2c 20  qliteVdbeOp3(v, 
d150: 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20  OP_CreateIndex, 
d160: 30 2c 20 69 73 54 65 6d 70 2c 28 63 68 61 72 2a  0, isTemp,(char*
d170: 29 26 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 50  )&pIndex->tnum,P
d180: 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20  3_POINTER);.    
d190: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 30  pIndex->tnum = 0
d1a0: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  ;.    if( pTable
d1b0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d1c0: 56 64 62 65 43 6f 64 65 28 76 2c 0a 20 20 20 20  VdbeCode(v,.    
d1d0: 20 20 20 20 20 20 4f 50 5f 44 75 70 2c 20 20 20        OP_Dup,   
d1e0: 20 20 20 20 30 2c 20 20 20 20 20 20 30 2c 0a 20      0,      0,. 
d1f0: 20 20 20 20 20 20 20 20 20 4f 50 5f 49 6e 74 65           OP_Inte
d200: 67 65 72 2c 20 20 20 69 73 54 65 6d 70 2c 20 30  ger,   isTemp, 0
d210: 2c 0a 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4f  ,.          OP_O
d220: 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 20 20 20  penWrite, 1,    
d230: 20 20 30 2c 0a 20 20 20 20 20 20 30 29 3b 0a 20    0,.      0);. 
d240: 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20     }.    addr = 
d250: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
d260: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
d270: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74   0);.    if( pSt
d280: 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20  art && pEnd ){. 
d290: 20 20 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45       n = Addr(pE
d2a0: 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 53  nd->z) - Addr(pS
d2b0: 74 61 72 74 2d 3e 7a 29 20 2b 20 31 3b 0a 20 20  tart->z) + 1;.  
d2c0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
d2d0: 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
d2e0: 70 53 74 61 72 74 2d 3e 7a 2c 20 6e 29 3b 0a 20  pStart->z, n);. 
d2f0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
d300: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
d310: 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 29  akeRecord, 5, 0)
d320: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
d330: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49  AddOp(v, OP_PutI
d340: 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20  ntKey, 0, 0);.  
d350: 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a    if( pTable ){.
d360: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
d370: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
d380: 67 65 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20  ger, pTab->iDb, 
d390: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
d3a0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
d3b0: 65 6e 52 65 61 64 2c 20 32 2c 20 70 54 61 62 2d  enRead, 2, pTab-
d3c0: 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 7a 4e 61  >tnum, pTab->zNa
d3d0: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 6c 62  me, 0);.      lb
d3e0: 6c 32 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  l2 = sqliteVdbeM
d3f0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
d400: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
d410: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
d420: 20 32 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20   2, lbl2);.     
d430: 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 56 64   lbl1 = sqliteVd
d440: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
d450: 63 6e 6f 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  cno, 2, 0);.    
d460: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e    for(i=0; i<pIn
d470: 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  dex->nColumn; i+
d480: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
d490: 69 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 61  iCol = pIndex->a
d4a0: 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
d4b0: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50      if( pTab->iP
d4c0: 4b 65 79 3d 3d 69 43 6f 6c 20 29 7b 0a 20 20 20  Key==iCol ){.   
d4d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
d4e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
d4f0: 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , i, 0);.       
d500: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d510: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
d520: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
d530: 32 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  2, iCol);.      
d540: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
d550: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
d560: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 49 64 78 4b  p(v, OP_MakeIdxK
d570: 65 79 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ey, pIndex->nCol
d580: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  umn, 0);.      i
d590: 66 28 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d  f( db->file_form
d5a0: 61 74 3e 3d 34 20 29 20 73 71 6c 69 74 65 41 64  at>=4 ) sqliteAd
d5b0: 64 49 64 78 4b 65 79 54 79 70 65 28 76 2c 20 70  dIdxKeyType(v, p
d5c0: 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 73 71  Index);.      sq
d5d0: 6c 69 74 65 56 64 62 65 4f 70 33 28 76 2c 20 4f  liteVdbeOp3(v, O
d5e0: 50 5f 49 64 78 50 75 74 2c 20 31 2c 20 70 49 6e  P_IdxPut, 1, pIn
d5f0: 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  dex->onError!=OE
d600: 5f 4e 6f 6e 65 2c 0a 20 20 20 20 20 20 20 20 20  _None,.         
d610: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 69 6e               "in
d620: 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72  dexed columns ar
d630: 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50  e not unique", P
d640: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
d650: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d660: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20  (v, OP_Next, 2, 
d670: 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  lbl1);.      sql
d680: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
d690: 62 65 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20  bel(v, lbl2);.  
d6a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d6b0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
d6c0: 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   2, 0);.      sq
d6d0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
d6e0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29   OP_Close, 1, 0)
d6f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d700: 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20  pTable!=0 ){.   
d710: 20 20 20 69 66 28 20 21 69 73 54 65 6d 70 20 29     if( !isTemp )
d720: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
d730: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
d740: 20 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   v);.      }.   
d750: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
d760: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
d770: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
d780: 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61  iteEndWriteOpera
d790: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
d7a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c    }.  }..  /* Cl
d7b0: 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78  ean up before ex
d7c0: 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72  iting */.exit_cr
d7d0: 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 73 71  eate_index:.  sq
d7e0: 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65  liteIdListDelete
d7f0: 28 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  (pList);.  sqlit
d800: 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  eSrcListDelete(p
d810: 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65  Table);.  sqlite
d820: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72  Free(zName);.  r
d830: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
d840: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
d850: 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69  l drop an existi
d860: 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20  ng named index. 
d870: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
d880: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
d890: 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65  DROP INDEX state
d8a0: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
d8b0: 6c 69 74 65 44 72 6f 70 49 6e 64 65 78 28 50 61  liteDropIndex(Pa
d8c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
d8d0: 4c 69 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  List *pName){.  
d8e0: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
d8f0: 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
d900: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
d910: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  >db;..  if( pPar
d920: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
d930: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
d940: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
d950: 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
d960: 3d 3d 31 20 29 3b 0a 20 20 70 49 6e 64 65 78 20  ==1 );.  pIndex 
d970: 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65  = sqliteFindInde
d980: 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  x(db, pName->a[0
d990: 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
d9a0: 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
d9b0: 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
d9c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72   ){.    sqliteEr
d9d0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
d9e0: 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
d9f0: 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20  S", pName, 0);. 
da00: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
da10: 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  p_index;.  }.  i
da20: 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49  f( pIndex->autoI
da30: 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  ndex ){.    sqli
da40: 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  teErrorMsg(pPars
da50: 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69  e, "index associ
da60: 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45  ated with UNIQUE
da70: 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49   ".      "or PRI
da80: 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
da90: 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72  int cannot be dr
daa0: 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  opped", 0);.    
dab0: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
dac0: 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
dad0: 70 49 6e 64 65 78 2d 3e 69 44 62 3e 31 20 29 7b  pIndex->iDb>1 ){
dae0: 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72  .    sqliteError
daf0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
db00: 6e 6f 74 20 61 6c 74 65 72 20 73 63 68 65 6d 61  not alter schema
db10: 20 6f 66 20 61 74 74 61 63 68 65 64 20 22 0a 20   of attached ". 
db20: 20 20 20 20 20 20 22 64 61 74 61 62 61 73 65 73        "databases
db30: 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ", 0);.    goto 
db40: 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
db50: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
db60: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
db70: 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
db80: 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45  nt code = SQLITE
db90: 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _DROP_INDEX;.   
dba0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
dbb0: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20  Index->pTable;. 
dbc0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
dbd0: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e  Db = db->aDb[pIn
dbe0: 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b  dex->iDb].zName;
dbf0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
dc00: 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
dc10: 41 42 4c 45 28 70 49 6e 64 65 78 2d 3e 69 44 62  ABLE(pIndex->iDb
dc20: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
dc30: 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  eAuthCheck(pPars
dc40: 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
dc50: 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20  , zTab, 0, zDb) 
dc60: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
dc70: 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
dc80: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e     }.    if( pIn
dc90: 64 65 78 2d 3e 69 44 62 20 29 20 63 6f 64 65 20  dex->iDb ) code 
dca0: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
dcb0: 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  MP_INDEX;.    if
dcc0: 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63  ( sqliteAuthChec
dcd0: 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
dce0: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70  pIndex->zName, p
dcf0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
dd00: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
dd10: 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
dd20: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
dd30: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
dd40: 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
dd50: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f  he index and fro
dd60: 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
dd70: 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  le */.  v = sqli
dd80: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
dd90: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
dda0: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 4c    static VdbeOpL
ddb0: 69 73 74 20 64 72 6f 70 49 6e 64 65 78 5b 5d 20  ist dropIndex[] 
ddc0: 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52  = {.      { OP_R
ddd0: 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44  ewind,     0, AD
dde0: 44 52 28 39 29 2c 20 30 7d 2c 20 0a 20 20 20 20  DR(9), 0}, .    
ddf0: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20    { OP_String,  
de00: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30     0, 0,       0
de10: 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20  }, /* 1 */.     
de20: 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20   { OP_MemStore, 
de30: 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20 30 7d    1, 1,       0}
de40: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d  ,.      { OP_Mem
de50: 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c 20 20  Load,    1, 0,  
de60: 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f       0}, /* 3 */
de70: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
de80: 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20  mn,     0, 1,   
de90: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
dea0: 4f 50 5f 45 71 2c 20 20 20 20 20 20 20 20 20 30  OP_Eq,         0
deb0: 2c 20 41 44 44 52 28 38 29 2c 20 30 7d 2c 0a 20  , ADDR(8), 0},. 
dec0: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20       { OP_Next, 
ded0: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 33 29        0, ADDR(3)
dee0: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
def0: 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c 20  _Goto,       0, 
df00: 41 44 44 52 28 39 29 2c 20 30 7d 2c 0a 20 20 20  ADDR(9), 0},.   
df10: 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20     { OP_Delete, 
df20: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
df30: 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20  0}, /* 8 */.    
df40: 7d 3b 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b  };.    int base;
df50: 0a 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67 69  ..    sqliteBegi
df60: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
df70: 70 50 61 72 73 65 2c 20 30 2c 20 70 49 6e 64 65  pParse, 0, pInde
df80: 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  x->iDb);.    sql
df90: 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  iteOpenMasterTab
dfa0: 6c 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 69 44  le(v, pIndex->iD
dfb0: 62 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20 73  b);.    base = s
dfc0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69  qliteVdbeAddOpLi
dfd0: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
dfe0: 64 72 6f 70 49 6e 64 65 78 29 2c 20 64 72 6f 70  dropIndex), drop
dff0: 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  Index);.    sqli
e000: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
e010: 2c 20 62 61 73 65 2b 31 2c 20 70 49 6e 64 65 78  , base+1, pIndex
e020: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
e030: 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 44 62   if( pIndex->iDb
e040: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
e050: 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  iteChangeCookie(
e060: 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20  db, v);.    }.  
e070: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
e080: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  p(v, OP_Close, 0
e090: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
e0a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e0b0: 44 65 73 74 72 6f 79 2c 20 70 49 6e 64 65 78 2d  Destroy, pIndex-
e0c0: 3e 74 6e 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69  >tnum, pIndex->i
e0d0: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45  Db);.    sqliteE
e0e0: 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  ndWriteOperation
e0f0: 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20  (pParse);.  }.. 
e100: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 69   /* Delete the i
e110: 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 63 72 69 70  n-memory descrip
e120: 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 69 6e 64  tion of this ind
e130: 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ex..  */.  if( !
e140: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
e150: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c  ){.    sqliteUnl
e160: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65  inkAndDeleteInde
e170: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
e180: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
e190: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
e1a0: 6e 67 65 73 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f  nges;.  }..exit_
e1b0: 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71  drop_index:.  sq
e1c0: 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74  liteSrcListDelet
e1d0: 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pName);.}../*.
e1e0: 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
e1f0: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67  element to the g
e200: 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72  iven IdList.  Cr
e210: 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73  eate a new IdLis
e220: 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
e230: 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c  .**.** A new IdL
e240: 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
e250: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c   or NULL if mall
e260: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49  oc() fails..*/.I
e270: 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 49 64 4c  dList *sqliteIdL
e280: 69 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74  istAppend(IdList
e290: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
e2a0: 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70  pToken){.  if( p
e2b0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
e2c0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  List = sqliteMal
e2d0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69  loc( sizeof(IdLi
e2e0: 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
e2f0: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
e300: 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   0;.    pList->n
e310: 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  Alloc = 0;.  }. 
e320: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3e   if( pList->nId>
e330: 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29  =pList->nAlloc )
e340: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
e350: 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20  ist_item *a;.   
e360: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
e370: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32   pList->nAlloc*2
e380: 20 2b 20 35 3b 0a 20 20 20 20 61 20 3d 20 73 71   + 5;.    a = sq
e390: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73  liteRealloc(pLis
e3a0: 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c  t->a, pList->nAl
e3b0: 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  loc*sizeof(pList
e3c0: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  ->a[0]) );.    i
e3d0: 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( a==0 ){.     
e3e0: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c   sqliteIdListDel
e3f0: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
e400: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
e410: 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d  }.    pList->a =
e420: 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74   a;.  }.  memset
e430: 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74  (&pList->a[pList
e440: 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->nId], 0, sizeo
e450: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
e460: 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b  .  if( pToken ){
e470: 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d  .    char **pz =
e480: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
e490: 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->nId].zName;.  
e4a0: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
e4b0: 6e 67 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a  ng(pz, pToken->z
e4c0: 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b  , pToken->n, 0);
e4d0: 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20  .    if( *pz==0 
e4e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49  ){.      sqliteI
e4f0: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  dListDelete(pLis
e500: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
e510: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
e520: 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f       sqliteDequo
e530: 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20  te(*pz);.    }. 
e540: 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b   }.  pList->nId+
e550: 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  +;.  return pLis
e560: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  t;.}../*.** Appe
e570: 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e  nd a new table n
e580: 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ame to the given
e590: 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74   SrcList.  Creat
e5a0: 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  e a new SrcList 
e5b0: 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20  if.** need be.  
e5c0: 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63  A new entry is c
e5d0: 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72  reated in the Sr
e5e0: 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54  cList even if pT
e5f0: 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  oken is NULL..**
e600: 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73  .** A new SrcLis
e610: 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
e620: 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
e630: 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20  () fails..**.** 
e640: 49 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20  If pDatabase is 
e650: 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61  not null, it mea
e660: 6e 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  ns that the tabl
e670: 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61  e has an optiona
e680: 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61  l.** database na
e690: 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65  me prefix.  Like
e6a0: 20 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73   this:  "databas
e6b0: 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70  e.table".  The p
e6c0: 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e  Database.** poin
e6d0: 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ts to the table 
e6e0: 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61  name and the pTa
e6f0: 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ble points to th
e700: 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
e710: 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e  .** The SrcList.
e720: 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20  a[].zName field 
e730: 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
e740: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68  he table name wh
e750: 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d  ich might.** com
e760: 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69  e from pTable (i
e770: 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e  f pDatabase is N
e780: 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61  ULL) or from pDa
e790: 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63  tabase.  .** Src
e7a0: 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61  List.a[].zDataba
e7b0: 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  se is filled wit
e7c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  h the database n
e7d0: 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c  ame from pTable,
e7e0: 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c  .** or with NULL
e7f0: 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20   if no database 
e800: 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  is specified..**
e810: 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
e820: 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65  ds, if call like
e830: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
e840: 20 20 20 20 20 73 71 6c 69 74 65 53 72 63 4c 69       sqliteSrcLi
e850: 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b  stAppend(A,B,0);
e860: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73  .**.** Then B is
e870: 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e   a table name an
e880: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  d the database n
e890: 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69  ame is unspecifi
e8a0: 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a  ed.  If called.*
e8b0: 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  * like this:.**.
e8c0: 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
e8d0: 65 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41  eSrcListAppend(A
e8e0: 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,C);.**.** The
e8f0: 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65  n C is the table
e900: 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74   name and B is t
e910: 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
e920: 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
e930: 6c 69 74 65 53 72 63 4c 69 73 74 41 70 70 65 6e  liteSrcListAppen
e940: 64 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  d(SrcList *pList
e950: 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c  , Token *pTable,
e960: 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73   Token *pDatabas
e970: 65 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  e){.  if( pList=
e980: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
e990: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
e9a0: 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20  sizeof(SrcList) 
e9b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
e9c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
e9d0: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
e9e0: 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  c = 1;.  }.  if(
e9f0: 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c   pList->nSrc>=pL
ea00: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  ist->nAlloc ){. 
ea10: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77     SrcList *pNew
ea20: 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
ea30: 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e  loc *= 2;.    pN
ea40: 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  ew = sqliteReall
ea50: 6f 63 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20  oc(pList,.      
ea60: 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
ea70: 2a 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74  *pList) + (pList
ea80: 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65  ->nAlloc-1)*size
ea90: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20  of(pList->a[0]) 
eaa0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
eab0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
eac0: 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  teSrcListDelete(
ead0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
eae0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
eaf0: 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a    pList = pNew;.
eb00: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c    }.  memset(&pL
eb10: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53  ist->a[pList->nS
eb20: 72 63 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  rc], 0, sizeof(p
eb30: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
eb40: 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26  if( pDatabase &&
eb50: 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30   pDatabase->z==0
eb60: 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73   ){.    pDatabas
eb70: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
eb80: 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70 54   pDatabase && pT
eb90: 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65  able ){.    Toke
eba0: 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61  n *pTemp = pData
ebb0: 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62  base;.    pDatab
ebc0: 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ase = pTable;.  
ebd0: 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70    pTable = pTemp
ebe0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62  ;.  }.  if( pTab
ebf0: 6c 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  le ){.    char *
ec00: 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  *pz = &pList->a[
ec10: 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a 4e 61  pList->nSrc].zNa
ec20: 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65  me;.    sqliteSe
ec30: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 54 61  tNString(pz, pTa
ec40: 62 6c 65 2d 3e 7a 2c 20 70 54 61 62 6c 65 2d 3e  ble->z, pTable->
ec50: 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a  n, 0);.    if( *
ec60: 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  pz==0 ){.      s
ec70: 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65  qliteSrcListDele
ec80: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  te(pList);.     
ec90: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
eca0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
ecb0: 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a  teDequote(*pz);.
ecc0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
ecd0: 70 44 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20  pDatabase ){.   
ece0: 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c   char **pz = &pL
ecf0: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53  ist->a[pList->nS
ed00: 72 63 5d 2e 7a 44 61 74 61 62 61 73 65 3b 0a 20  rc].zDatabase;. 
ed10: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
ed20: 69 6e 67 28 70 7a 2c 20 70 44 61 74 61 62 61 73  ing(pz, pDatabas
ed30: 65 2d 3e 7a 2c 20 70 44 61 74 61 62 61 73 65 2d  e->z, pDatabase-
ed40: 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  >n, 0);.    if( 
ed50: 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  *pz==0 ){.      
ed60: 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c  sqliteSrcListDel
ed70: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
ed80: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
ed90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
eda0: 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b  iteDequote(*pz);
edb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69  .    }.  }.  pLi
edc0: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
edd0: 63 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b  c].iCursor = -1;
ede0: 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b  .  pList->nSrc++
edf0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
ee00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67  ;.}../*.** Assig
ee10: 6e 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c  n cursors to all
ee20: 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63   tables in a Src
ee30: 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  List.*/.void sql
ee40: 69 74 65 53 72 63 4c 69 73 74 41 73 73 69 67 6e  iteSrcListAssign
ee50: 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70  Cursors(Parse *p
ee60: 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
ee70: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
ee80: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
ee90: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
eea0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
eeb0: 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 30 20 29  a[i].iCursor<0 )
eec0: 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61  {.      pList->a
eed0: 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 70 50  [i].iCursor = pP
eee0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
eef0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
ef00: 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74 6f   Add an alias to
ef10: 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74 69   the last identi
ef20: 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76 65  fier on the give
ef30: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69 73  n identifier lis
ef40: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
ef50: 65 53 72 63 4c 69 73 74 41 64 64 41 6c 69 61 73  eSrcListAddAlias
ef60: 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c  (SrcList *pList,
ef70: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
ef80: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26 26 20  .  if( pList && 
ef90: 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b  pList->nSrc>0 ){
efa0: 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69  .    int i = pLi
efb0: 73 74 2d 3e 6e 53 72 63 20 2d 20 31 3b 0a 20 20  st->nSrc - 1;.  
efc0: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
efd0: 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ng(&pList->a[i].
efe0: 7a 41 6c 69 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e  zAlias, pToken->
eff0: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29  z, pToken->n, 0)
f000: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 71 75  ;.    sqliteDequ
f010: 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ote(pList->a[i].
f020: 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a  zAlias);.  }.}..
f030: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
f040: 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  IdList..*/.void 
f050: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65  sqliteIdListDele
f060: 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  te(IdList *pList
f070: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
f080: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
f090: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
f0a0: 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
f0b0: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  +){.    sqliteFr
f0c0: 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ee(pList->a[i].z
f0d0: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Name);.  }.  sql
f0e0: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
f0f0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
f100: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
f110: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
f120: 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68  x in pList of th
f130: 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d  e identifier nam
f140: 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20  ed zId.  Return 
f150: 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75  -1.** if not fou
f160: 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
f170: 65 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c  eIdListIndex(IdL
f180: 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73  ist *pList, cons
f190: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
f1a0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
f1b0: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
f1c0: 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   -1;.  for(i=0; 
f1d0: 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
f1e0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
f1f0: 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  teStrICmp(pList-
f200: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  >a[i].zName, zNa
f210: 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  me)==0 ) return 
f220: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
f230: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  -1;.}../*.** Del
f240: 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72  ete an entire Sr
f250: 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20  cList including 
f260: 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63  all its substruc
f270: 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
f280: 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74  liteSrcListDelet
f290: 65 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  e(SrcList *pList
f2a0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
f2b0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
f2c0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
f2d0: 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  i<pList->nSrc; i
f2e0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ++){.    sqliteF
f2f0: 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
f300: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
f310: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
f320: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
f330: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
f340: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73  ist->a[i].zAlias
f350: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
f360: 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 26 26 20 70  ->a[i].pTab && p
f370: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d  List->a[i].pTab-
f380: 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a  >isTransient ){.
f390: 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65        sqliteDele
f3a0: 74 65 54 61 62 6c 65 28 30 2c 20 70 4c 69 73 74  teTable(0, pList
f3b0: 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 3b 0a 20 20  ->a[i].pTab);.  
f3c0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 53 65    }.    sqliteSe
f3d0: 6c 65 63 74 44 65 6c 65 74 65 28 70 4c 69 73 74  lectDelete(pList
f3e0: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b  ->a[i].pSelect);
f3f0: 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44  .    sqliteExprD
f400: 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  elete(pList->a[i
f410: 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ].pOn);.    sqli
f420: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  teIdListDelete(p
f430: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 55 73 69 6e  List->a[i].pUsin
f440: 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
f450: 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
f460: 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72  /*.** Begin a tr
f470: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
f480: 64 20 73 71 6c 69 74 65 42 65 67 69 6e 54 72 61  d sqliteBeginTra
f490: 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
f4a0: 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72  pParse, int onEr
f4b0: 72 6f 72 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a  ror){.  sqlite *
f4c0: 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  db;..  if( pPars
f4d0: 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
f4e0: 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
f4f0: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
f500: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
f510: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
f520: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
f530: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
f540: 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43   if( sqliteAuthC
f550: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
f560: 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
f570: 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20   "BEGIN", 0, 0) 
f580: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
f590: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
f5a0: 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20  TE_InTrans ){.  
f5b0: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
f5c0: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
f5d0: 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
f5e0: 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20 74 72  tion within a tr
f5f0: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
f600: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
f610: 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
f620: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
f630: 20 30 2c 20 30 29 3b 0a 20 20 64 62 2d 3e 66 6c   0, 0);.  db->fl
f640: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
f650: 54 72 61 6e 73 3b 0a 20 20 64 62 2d 3e 6f 6e 45  Trans;.  db->onE
f660: 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  rror = onError;.
f670: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
f680: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
f690: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d  .void sqliteComm
f6a0: 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  itTransaction(Pa
f6b0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
f6c0: 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69  sqlite *db;..  i
f6d0: 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
f6e0: 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
f6f0: 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d  =0 || db->aDb[0]
f700: 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
f710: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
f720: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  nErr || sqlite_m
f730: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
f740: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
f750: 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61  iteAuthCheck(pPa
f760: 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
f770: 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54  SACTION, "COMMIT
f780: 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  ", 0, 0) ) retur
f790: 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  n;.  if( (db->fl
f7a0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
f7b0: 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  rans)==0 ){.    
f7c0: 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
f7d0: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63  Parse, "cannot c
f7e0: 6f 6d 6d 69 74 20 2d 20 6e 6f 20 74 72 61 6e 73  ommit - no trans
f7f0: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
f800: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
f810: 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20    }.  db->flags 
f820: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61  &= ~SQLITE_InTra
f830: 6e 73 3b 0a 20 20 73 71 6c 69 74 65 45 6e 64 57  ns;.  sqliteEndW
f840: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
f850: 61 72 73 65 29 3b 0a 20 20 64 62 2d 3e 6f 6e 45  arse);.  db->onE
f860: 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c  rror = OE_Defaul
f870: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  t;.}../*.** Roll
f880: 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69  back a transacti
f890: 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
f8a0: 65 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63  eRollbackTransac
f8b0: 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
f8c0: 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  se){.  sqlite *d
f8d0: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
f8e0: 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c   if( pParse==0 |
f8f0: 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62  | (db=pParse->db
f900: 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b  )==0 || db->aDb[
f910: 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
f920: 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
f930: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
f940: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
f950: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
f960: 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70  qliteAuthCheck(p
f970: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
f980: 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c  ANSACTION, "ROLL
f990: 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72  BACK", 0, 0) ) r
f9a0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 64 62  eturn;.  if( (db
f9b0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
f9c0: 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a  _InTrans)==0 ){.
f9d0: 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
f9e0: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
f9f0: 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 2d 20 6e 6f  ot rollback - no
fa00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
fa10: 61 63 74 69 76 65 22 29 3b 0a 20 20 20 20 72 65  active");.    re
fa20: 74 75 72 6e 3b 20 0a 20 20 7d 0a 20 20 76 20 3d  turn; .  }.  v =
fa30: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
fa40: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
fa50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
fa60: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 6c  eAddOp(v, OP_Rol
fa70: 6c 62 61 63 6b 2c 20 30 2c 20 30 29 3b 0a 20 20  lback, 0, 0);.  
fa80: 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  }.  db->flags &=
fa90: 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73   ~SQLITE_InTrans
faa0: 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20  ;.  db->onError 
fab0: 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a  = OE_Default;.}.
fac0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
fad0: 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 77  VDBE code that w
fae0: 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20 73  ill verify the s
faf0: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 66 6f 72  chema cookie for
fb00: 20 61 6c 6c 0a 2a 2a 20 6e 61 6d 65 64 20 64 61   all.** named da
fb10: 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2f  tabase files..*/
fb20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 64 65  .void sqliteCode
fb30: 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72  VerifySchema(Par
fb40: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
fb50: 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a  iDb){.  sqlite *
fb60: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
fb70: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
fb80: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
fb90: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  e);.  assert( iD
fba0: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
fbb0: 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
fbc0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
fbd0: 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 44  t!=0 );.  if( iD
fbe0: 62 21 3d 31 20 26 26 20 21 44 62 48 61 73 50 72  b!=1 && !DbHasPr
fbf0: 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20  operty(db, iDb, 
fc00: 44 42 5f 43 6f 6f 6b 69 65 29 20 29 7b 0a 20 20  DB_Cookie) ){.  
fc10: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
fc20: 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f  p(v, OP_VerifyCo
fc30: 6f 6b 69 65 2c 20 69 44 62 2c 20 64 62 2d 3e 61  okie, iDb, db->a
fc40: 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63  Db[iDb].schema_c
fc50: 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 44 62 53 65  ookie);.    DbSe
fc60: 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44  tProperty(db, iD
fc70: 62 2c 20 44 42 5f 43 6f 6f 6b 69 65 29 3b 0a 20  b, DB_Cookie);. 
fc80: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
fc90: 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
fca0: 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72  hat prepares for
fcb0: 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74   doing an operat
fcc0: 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  ion that.** migh
fcd0: 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74  t change the dat
fce0: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abase..**.** Thi
fcf0: 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
fd00: 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
fd10: 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  on if we are not
fd20: 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a   already within.
fd30: 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
fd40: 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72  .  If we are alr
fd50: 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72  eady within a tr
fd60: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
fd70: 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20  a checkpoint.** 
fd80: 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65  is set if the se
fd90: 74 43 68 65 63 6b 70 6f 69 6e 74 20 70 61 72 61  tCheckpoint para
fda0: 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20  meter is true.  
fdb0: 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f  A checkpoint sho
fdc0: 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f  uld.** be set fo
fdd0: 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61  r operations tha
fde0: 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75  t might fail (du
fdf0: 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e  e to a constrain
fe00: 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68  t) part of.** th
fe10: 65 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e  e way through an
fe20: 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65  d which will nee
fe30: 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77  d to undo some w
fe40: 72 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61  rites without ha
fe50: 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62  ving to.** rollb
fe60: 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72  ack the whole tr
fe70: 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20  ansaction.  For 
fe80: 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65  operations where
fe90: 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73   all constraints
fea0: 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b  .** can be check
feb0: 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68  ed before any ch
fec0: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
fed0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  o the database, 
fee0: 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e  it is never.** n
fef0: 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f  ecessary to undo
ff00: 20 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65   a write and the
ff10: 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
ff20: 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a  ld not be set..*
ff30: 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61  *.** Only databa
ff40: 73 65 20 69 44 62 20 61 6e 64 20 74 68 65 20 74  se iDb and the t
ff50: 65 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65  emp database are
ff60: 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 62   made writable b
ff70: 79 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20  y this call..** 
ff80: 49 66 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20  If iDb==0, then 
ff90: 74 68 65 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d  the main and tem
ffa0: 70 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  p databases are 
ffb0: 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20  made writable.  
ffc0: 20 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68   If.** iDb==1 th
ffd0: 65 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70  en only the temp
ffe0: 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 61 64   database is mad
fff0: 65 20 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20  e writable.  If 
10000 69 44 62 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a  iDb>1 then the.*
10010 2a 20 73 70 65 63 69 66 69 65 64 20 61 75 78 69  * specified auxi
10020 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 61  liary database a
10030 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  nd the temp data
10040 62 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72  base are made wr
10050 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  itable..*/.void 
10060 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65  sqliteBeginWrite
10070 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
10080 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74  *pParse, int set
10090 43 68 65 63 6b 70 6f 69 6e 74 2c 20 69 6e 74 20  Checkpoint, int 
100a0 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  iDb){.  Vdbe *v;
100b0 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
100c0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
100d0 28 20 44 62 48 61 73 50 72 6f 70 65 72 74 79 28  ( DbHasProperty(
100e0 64 62 2c 20 69 44 62 2c 20 44 42 5f 4c 6f 63 6b  db, iDb, DB_Lock
100f0 65 64 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ed) ) return;.  
10100 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
10110 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
10120 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
10130 20 20 69 66 28 20 21 64 62 2d 3e 61 44 62 5b 69    if( !db->aDb[i
10140 44 62 5d 2e 69 6e 54 72 61 6e 73 20 29 7b 0a 20  Db].inTrans ){. 
10150 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
10160 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  Op(v, OP_Transac
10170 74 69 6f 6e 2c 20 69 44 62 2c 20 30 29 3b 0a 20  tion, iDb, 0);. 
10180 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79     DbSetProperty
10190 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 4c 6f 63  (db, iDb, DB_Loc
101a0 6b 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ked);.    sqlite
101b0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
101c0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
101d0 20 20 20 69 66 28 20 69 44 62 21 3d 31 20 29 7b     if( iDb!=1 ){
101e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 65 67  .      sqliteBeg
101f0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
10200 28 70 50 61 72 73 65 2c 20 73 65 74 43 68 65 63  (pParse, setChec
10210 6b 70 6f 69 6e 74 2c 20 31 29 3b 0a 20 20 20 20  kpoint, 1);.    
10220 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65  }.  }else if( se
10230 74 43 68 65 63 6b 70 6f 69 6e 74 20 29 7b 0a 20  tCheckpoint ){. 
10240 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
10250 4f 70 28 76 2c 20 4f 50 5f 43 68 65 63 6b 70 6f  Op(v, OP_Checkpo
10260 69 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20  int, iDb, 0);.  
10270 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28    DbSetProperty(
10280 64 62 2c 20 69 44 62 2c 20 44 42 5f 4c 6f 63 6b  db, iDb, DB_Lock
10290 65 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ed);.  }.}../*.*
102a0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
102b0 74 68 61 74 20 63 6f 6e 63 6c 75 64 65 73 20 61  that concludes a
102c0 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
102d0 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e 67 65   may have change
102e0 64 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  d.** the databas
102f0 65 2e 20 20 49 66 20 61 20 73 74 61 74 65 6d 65  e.  If a stateme
10300 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
10310 61 73 20 73 74 61 72 74 65 64 2c 20 74 68 65 6e  as started, then
10320 20 65 6d 69 74 0a 2a 2a 20 61 6e 20 4f 50 5f 43   emit.** an OP_C
10330 6f 6d 6d 69 74 20 74 68 61 74 20 77 69 6c 6c 20  ommit that will 
10340 63 61 75 73 65 20 74 68 65 20 63 68 61 6e 67 65  cause the change
10350 73 20 74 6f 20 62 65 20 63 6f 6d 6d 69 74 74 65  s to be committe
10360 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
10370 20 4e 6f 74 65 20 74 68 61 74 20 63 68 65 63 6b   Note that check
10380 70 6f 69 6e 74 73 20 61 72 65 20 61 75 74 6f 6d  points are autom
10390 61 74 69 63 61 6c 6c 79 20 63 6f 6d 6d 69 74 74  atically committ
103a0 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
103b0 0a 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  .** a statement.
103c0 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
103d0 20 74 68 65 72 65 20 63 61 6e 20 62 65 20 6d 75   there can be mu
103e0 6c 74 69 70 6c 65 20 63 61 6c 6c 73 20 74 6f 20  ltiple calls to 
103f0 0a 2a 2a 20 73 71 6c 69 74 65 42 65 67 69 6e 57  .** sqliteBeginW
10400 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 29 20  riteOperation() 
10410 62 75 74 20 74 68 65 72 65 20 73 68 6f 75 6c 64  but there should
10420 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c   only be a singl
10430 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c  e.** call to sql
10440 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61  iteEndWriteOpera
10450 74 69 6f 6e 28 29 20 61 74 20 74 68 65 20 63 6f  tion() at the co
10460 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20  nclusion of the 
10470 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
10480 69 64 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74  id sqliteEndWrit
10490 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65  eOperation(Parse
104a0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
104b0 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a  e *v;.  sqlite *
104c0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
104d0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 74  .  if( pParse->t
104e0 72 69 67 53 74 61 63 6b 20 29 20 72 65 74 75 72  rigStack ) retur
104f0 6e 3b 20 2f 2a 20 69 66 20 74 68 69 73 20 69 73  n; /* if this is
10500 20 69 6e 20 61 20 74 72 69 67 67 65 72 20 2a 2f   in a trigger */
10510 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
10520 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
10530 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
10540 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  n;.  if( db->fla
10550 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72  gs & SQLITE_InTr
10560 61 6e 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20  ans ){.    /* A 
10570 42 45 47 49 4e 20 68 61 73 20 65 78 65 63 75 74  BEGIN has execut
10580 65 64 2e 20 20 44 6f 20 6e 6f 74 20 63 6f 6d 6d  ed.  Do not comm
10590 69 74 20 75 6e 74 69 6c 20 77 65 20 73 65 65 20  it until we see 
105a0 61 6e 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20  an explicit.    
105b0 2a 2a 20 43 4f 4d 4d 49 54 20 73 74 61 74 65 6d  ** COMMIT statem
105c0 65 6e 74 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  ent. */.  }else{
105d0 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
105e0 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69  ddOp(v, OP_Commi
105f0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  t, 0, 0);.  }.}.