/ Hex Artifact Content
Login

Artifact ec02b35d542d647ab22f31387733759ee0538826:


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 39 30 20 32 30 30 34 2f 30 35 2f 32 30 20 32  190 2004/05/20 2
0300: 32 3a 31 36 3a 32 39 20 64 72 68 20 45 78 70 20  2:16:29 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 33 42 65 67 69 6e 50 61 72 73  sqlite3BeginPars
0440: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
0450: 20 69 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67   int explainFlag
0460: 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  ){.  sqlite *db 
0470: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
0480: 69 6e 74 20 69 3b 0a 20 20 70 50 61 72 73 65 2d  int i;.  pParse-
0490: 3e 65 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61  >explain = expla
04a0: 69 6e 46 6c 61 67 3b 0a 20 20 69 66 28 28 64 62  inFlag;.  if((db
04b0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
04c0: 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 3d 3d 30  _Initialized)==0
04d0: 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   && db->init.bus
04e0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  y==0 ){.    int 
04f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74  rc = sqlite3Init
0500: 28 64 62 2c 20 26 70 50 61 72 73 65 2d 3e 7a 45  (db, &pParse->zE
0510: 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20  rrMsg);.    if( 
0520: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
0530: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
0540: 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 70 50  c = rc;.      pP
0550: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
0560: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
0570: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
0580: 2b 29 7b 0a 20 20 20 20 44 62 43 6c 65 61 72 50  +){.    DbClearP
0590: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44  roperty(db, i, D
05a0: 42 5f 4c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69  B_Locked);.    i
05b0: 66 28 20 21 64 62 2d 3e 61 44 62 5b 69 5d 2e 69  f( !db->aDb[i].i
05c0: 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20  nTrans ){.      
05d0: 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
05e0: 64 62 2c 20 69 2c 20 44 42 5f 43 6f 6f 6b 69 65  db, i, DB_Cookie
05f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
0600: 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b  Parse->nVar = 0;
0610: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
0620: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
0630: 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65 20   after a single 
0640: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68 61  SQL statement ha
0650: 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65 64  s been.** parsed
0660: 20 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 20   and we want to 
0670: 65 78 65 63 75 74 65 20 74 68 65 20 56 44 42 45  execute the VDBE
0680: 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65   code to impleme
0690: 6e 74 20 0a 2a 2a 20 74 68 61 74 20 73 74 61 74  nt .** that stat
06a0: 65 6d 65 6e 74 2e 20 20 50 72 69 6f 72 20 61 63  ement.  Prior ac
06b0: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 73 68  tion routines sh
06c0: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
06d0: 79 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65 64  y.** constructed
06e0: 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 64 6f   VDBE code to do
06f0: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 65   the work of the
0700: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
0710: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0720: 6a 75 73 74 20 68 61 73 20 74 6f 20 65 78 65 63  just has to exec
0730: 75 74 65 20 74 68 65 20 56 44 42 45 20 63 6f 64  ute the VDBE cod
0740: 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  e..**.** Note th
0750: 61 74 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  at if an error o
0760: 63 63 75 72 72 65 64 2c 20 69 74 20 6d 69 67 68  ccurred, it migh
0770: 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  t be the case th
0780: 61 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f  at.** no VDBE co
0790: 64 65 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  de was generated
07a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
07b0: 33 45 78 65 63 28 50 61 72 73 65 20 2a 70 50 61  3Exec(Parse *pPa
07c0: 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a  rse){.  sqlite *
07d0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
07e0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
07f0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 69  rse->pVdbe;..  i
0800: 66 28 20 76 3d 3d 30 20 26 26 20 28 76 20 3d 20  f( v==0 && (v = 
0810: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
0820: 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20  Parse))!=0 ){.  
0830: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
0840: 4f 70 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 30  Op(v, OP_Halt, 0
0850: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
0860: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
0870: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
0880: 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72 73    if( v && pPars
0890: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
08a0: 20 20 46 49 4c 45 20 2a 74 72 61 63 65 20 3d 20    FILE *trace = 
08b0: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
08c0: 49 54 45 5f 56 64 62 65 54 72 61 63 65 29 21 3d  ITE_VdbeTrace)!=
08d0: 30 20 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b 0a  0 ? stdout : 0;.
08e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54      sqlite3VdbeT
08f0: 72 61 63 65 28 76 2c 20 74 72 61 63 65 29 3b 0a  race(v, trace);.
0900: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
0910: 61 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61 72  akeReady(v, pPar
0920: 73 65 2d 3e 6e 56 61 72 2c 20 70 50 61 72 73 65  se->nVar, pParse
0930: 2d 3e 65 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20  ->explain);.    
0940: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 70 50 61  pParse->rc = pPa
0950: 72 73 65 2d 3e 6e 45 72 72 20 3f 20 53 51 4c 49  rse->nErr ? SQLI
0960: 54 45 5f 45 52 52 4f 52 20 3a 20 53 51 4c 49 54  TE_ERROR : SQLIT
0970: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72  E_DONE;.    pPar
0980: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
0990: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
09a0: 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c   pParse->rc==SQL
09b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
09c0: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
09d0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  E_ERROR;.  }.  p
09e0: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b  Parse->nTab = 0;
09f0: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
0a00: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
0a10: 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Set = 0;.  pPars
0a20: 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a 20 20 70  e->nAgg = 0;.  p
0a30: 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b  Parse->nVar = 0;
0a40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
0a50: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
0a60: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
0a70: 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61  scribes .** a pa
0a80: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
0a90: 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68  e table given th
0aa0: 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68 61  e name.** of tha
0ab0: 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74  t table and (opt
0ac0: 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d  ionally) the nam
0ad0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
0ae0: 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20  e.** containing 
0af0: 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
0b00: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
0b10: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
0b20: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
0b30: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
0b40: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
0b50: 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74  e.** table and t
0b60: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
0b70: 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72  g table is retur
0b80: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
0b90: 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63  ng.** for duplic
0ba0: 61 74 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 20  ate table names 
0bb0: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
0bc0: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a  earch order is.*
0bd0: 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  * TEMP first, th
0be0: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
0bf0: 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  y auxiliary data
0c00: 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75  bases added.** u
0c10: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
0c20: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53  command..**.** S
0c30: 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c  ee also sqlite3L
0c40: 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f  ocateTable()..*/
0c50: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46  .Table *sqlite3F
0c60: 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 20  indTable(sqlite 
0c70: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
0c80: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
0c90: 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a  ar *zDatabase){.
0ca0: 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a    Table *p = 0;.
0cb0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
0cc0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
0cd0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  ++){.    int j =
0ce0: 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69   (i<2) ? i^1 : i
0cf0: 3b 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  ;   /* Search TE
0d00: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
0d10: 2f 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62  /.    if( zDatab
0d20: 61 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65  ase!=0 && sqlite
0d30: 33 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61  3StrICmp(zDataba
0d40: 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a  se, db->aDb[j].z
0d50: 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Name) ) continue
0d60: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
0d70: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
0d80: 44 62 5b 6a 5d 2e 74 62 6c 48 61 73 68 2c 20 7a  Db[j].tblHash, z
0d90: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61  Name, strlen(zNa
0da0: 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20  me)+1);.    if( 
0db0: 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  p ) break;.  }. 
0dc0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
0dd0: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
0de0: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
0df0: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
0e00: 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c  s .** a particul
0e10: 61 72 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ar database tabl
0e20: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
0e30: 0a 2a 2a 20 6f 66 20 74 68 61 74 20 74 61 62 6c  .** of that tabl
0e40: 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c  e and (optionall
0e50: 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  y) the name of t
0e60: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  he database.** c
0e70: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
0e80: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ble.  Return NUL
0e90: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
0ea0: 2a 2a 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e  ** Also leave an
0eb0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
0ec0: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
0ed0: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  g..**.** The dif
0ee0: 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
0ef0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64  this routine and
0f00: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
0f10: 65 28 29 0a 2a 2a 20 69 73 20 74 68 61 74 20 74  e().** is that t
0f20: 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 65 61 76  his routine leav
0f30: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
0f40: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
0f50: 45 72 72 4d 73 67 0a 2a 2a 20 77 68 65 72 65 20  ErrMsg.** where 
0f60: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
0f70: 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a  () does not..*/.
0f80: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f  Table *sqlite3Lo
0f90: 63 61 74 65 54 61 62 6c 65 28 50 61 72 73 65 20  cateTable(Parse 
0fa0: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
0fb0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
0fc0: 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65 29 7b  t char *zDbase){
0fd0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20  .  Table *p;..  
0fe0: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  p = sqlite3FindT
0ff0: 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
1000: 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b   zName, zDbase);
1010: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
1020: 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b     if( zDbase ){
1030: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
1040: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1050: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
1060: 73 2e 25 73 22 2c 20 7a 44 62 61 73 65 2c 20 7a  s.%s", zDbase, z
1070: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
1080: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
1090: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
10a0: 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29  , zName, 0)!=0 )
10b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
10c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10d0: 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 69 73  "table \"%s\" is
10e0: 20 6e 6f 74 20 69 6e 20 64 61 74 61 62 61 73 65   not in database
10f0: 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20   \"%s\"",.      
1100: 20 20 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65     zName, zDbase
1110: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1120: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1130: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
1140: 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c  such table: %s",
1150: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   zName);.    }. 
1160: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
1170: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
1180: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
1190: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
11a0: 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74  ribes .** a part
11b0: 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76  icular index giv
11c0: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
11d0: 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64  hat index.** and
11e0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
11f0: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63   database that c
1200: 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65  ontains the inde
1210: 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c  x..** Return NUL
1220: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
1230: 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61  **.** If zDataba
1240: 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74  se is 0, all dat
1250: 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63  abases are searc
1260: 68 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74  hed for the.** t
1270: 61 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72  able and the fir
1280: 73 74 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65  st matching inde
1290: 78 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  x is returned.  
12a0: 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  (No checking.** 
12b0: 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e  for duplicate in
12c0: 64 65 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e  dex names is don
12d0: 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20  e.)  The search 
12e0: 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50  order is.** TEMP
12f0: 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49   first, then MAI
1300: 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69  N, then any auxi
1310: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20  liary databases 
1320: 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74  added.** using t
1330: 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e  he ATTACH comman
1340: 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c  d..*/.Index *sql
1350: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71  ite3FindIndex(sq
1360: 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73 74 20  lite *db, const 
1370: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
1380: 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
1390: 20 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20   Index *p = 0;. 
13a0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
13b0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
13c0: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20  +){.    int j = 
13d0: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
13e0: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
13f0: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
1400: 20 20 20 20 69 66 28 20 7a 44 62 20 26 26 20 73      if( zDb && s
1410: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
1420: 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e  b, db->aDb[j].zN
1430: 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ame) ) continue;
1440: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
1450: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
1460: 62 5b 6a 5d 2e 69 64 78 48 61 73 68 2c 20 7a 4e  b[j].idxHash, zN
1470: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
1480: 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70  e)+1);.    if( p
1490: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
14a0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
14b0: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69  ** Remove the gi
14c0: 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  ven index from t
14d0: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
14e0: 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a  ble, and free.**
14f0: 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75   its memory stru
1500: 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ctures..**.** Th
1510: 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76  e index is remov
1520: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
1530: 62 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 73  base hash tables
1540: 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f   but.** it is no
1550: 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  t unlinked from 
1560: 74 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69  the Table that i
1570: 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e  t indexes..** Un
1580: 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65  linking from the
1590: 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64   Table must be d
15a0: 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69  one by the calli
15b0: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
15c0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
15d0: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  teDeleteIndex(sq
15e0: 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65 78 20  lite *db, Index 
15f0: 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f  *p){.  Index *pO
1600: 6c 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64  ld;..  assert( d
1610: 62 21 3d 30 20 26 26 20 70 2d 3e 7a 4e 61 6d 65  b!=0 && p->zName
1620: 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20  !=0 );.  pOld = 
1630: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
1640: 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44  t(&db->aDb[p->iD
1650: 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a  b].idxHash, p->z
1660: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29  strlen(p->zName)
1690: 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 4f  +1, 0);.  if( pO
16a0: 6c 64 21 3d 30 20 26 26 20 70 4f 6c 64 21 3d 70  ld!=0 && pOld!=p
16b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 48   ){.    sqlite3H
16c0: 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61  ashInsert(&db->a
16d0: 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61  Db[p->iDb].idxHa
16e0: 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c  sh, pOld->zName,
16f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1700: 20 20 20 20 20 20 73 74 72 6c 65 6e 28 70 4f 6c        strlen(pOl
1710: 64 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c  d->zName)+1, pOl
1720: 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  d);.  }.  if( p-
1730: 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a 20 20 20 20  >zColAff ){.    
1740: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 43  sqliteFree(p->zC
1750: 6f 6c 41 66 66 29 3b 0a 20 20 7d 0a 20 20 73 71  olAff);.  }.  sq
1760: 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a  liteFree(p);.}..
1770: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  /*.** Unlink the
1780: 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f   given index fro
1790: 6d 20 69 74 73 20 74 61 62 6c 65 2c 20 74 68 65  m its table, the
17a0: 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20 74 68 65 20  n remove.** the 
17b0: 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69  index from the i
17c0: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 20  ndex hash table 
17d0: 61 6e 64 20 66 72 65 65 20 69 74 73 20 6d 65 6d  and free its mem
17e0: 6f 72 79 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ory.** structure
17f0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1800: 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
1810: 65 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64  eIndex(sqlite *d
1820: 62 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  b, Index *pIndex
1830: 29 7b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d  ){.  if( pIndex-
1840: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d  >pTable->pIndex=
1850: 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 70  =pIndex ){.    p
1860: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70  Index->pTable->p
1870: 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e  Index = pIndex->
1880: 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
1890: 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
18a0: 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e    for(p=pIndex->
18b0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
18c0: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70  p && p->pNext!=p
18d0: 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78  Index; p=p->pNex
18e0: 74 29 7b 7d 0a 20 20 20 20 69 66 28 20 70 20 26  t){}.    if( p &
18f0: 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64  & p->pNext==pInd
1900: 65 78 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  ex ){.      p->p
1910: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
1920: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
1930: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e    sqliteDeleteIn
1940: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
1950: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
1960: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
1970: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
1980: 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
1990: 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 64 61 74 61  ables of.** data
19a0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
19b0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
19c0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c  s called to recl
19d0: 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65  aim memory.** be
19e0: 66 6f 72 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  fore the connect
19f0: 69 6f 6e 20 63 6c 6f 73 65 73 2e 20 20 49 74 20  ion closes.  It 
1a00: 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64  is also called d
1a10: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
1a20: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65 72  .** if there wer
1a30: 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
1a40: 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e   during the tran
1a50: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  saction..**.** I
1a60: 66 20 69 44 62 3c 3d 30 20 74 68 65 6e 20 72 65  f iDb<=0 then re
1a70: 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  set the internal
1a80: 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73 20 66   schema tables f
1a90: 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a  or all database.
1aa0: 2a 2a 20 66 69 6c 65 73 2e 20 20 49 66 20 69 44  ** files.  If iD
1ab0: 62 3e 3d 32 20 74 68 65 6e 20 72 65 73 65 74 20  b>=2 then reset 
1ac0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
1ad0: 65 6d 61 20 66 6f 72 20 6f 6e 6c 79 20 74 68 65  ema for only the
1ae0: 0a 2a 2a 20 73 69 6e 67 6c 65 20 66 69 6c 65 20  .** single file 
1af0: 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f  indicated..*/.vo
1b00: 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 49  id sqlite3ResetI
1b10: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 73 71  nternalSchema(sq
1b20: 6c 69 74 65 20 2a 64 62 2c 20 69 6e 74 20 69 44  lite *db, int iD
1b30: 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  b){.  HashElem *
1b40: 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 74 65  pElem;.  Hash te
1b50: 6d 70 31 3b 0a 20 20 48 61 73 68 20 74 65 6d 70  mp1;.  Hash temp
1b60: 32 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a  2;.  int i, j;..
1b70: 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
1b80: 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
1b90: 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  );.  db->flags &
1ba0: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 69 74 69 61  = ~SQLITE_Initia
1bb0: 6c 69 7a 65 64 3b 0a 20 20 66 6f 72 28 69 3d 69  lized;.  for(i=i
1bc0: 44 62 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  Db; i<db->nDb; i
1bd0: 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62  ++){.    Db *pDb
1be0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
1bf0: 20 20 20 20 74 65 6d 70 31 20 3d 20 70 44 62 2d      temp1 = pDb-
1c00: 3e 74 62 6c 48 61 73 68 3b 0a 20 20 20 20 74 65  >tblHash;.    te
1c10: 6d 70 32 20 3d 20 70 44 62 2d 3e 74 72 69 67 48  mp2 = pDb->trigH
1c20: 61 73 68 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ash;.    sqlite3
1c30: 48 61 73 68 49 6e 69 74 28 26 70 44 62 2d 3e 74  HashInit(&pDb->t
1c40: 72 69 67 48 61 73 68 2c 20 53 51 4c 49 54 45 5f  rigHash, SQLITE_
1c50: 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b  HASH_STRING, 0);
1c60: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
1c70: 43 6c 65 61 72 28 26 70 44 62 2d 3e 61 46 4b 65  Clear(&pDb->aFKe
1c80: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48  y);.    sqlite3H
1c90: 61 73 68 43 6c 65 61 72 28 26 70 44 62 2d 3e 69  ashClear(&pDb->i
1ca0: 64 78 48 61 73 68 29 3b 0a 20 20 20 20 66 6f 72  dxHash);.    for
1cb0: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
1cc0: 68 46 69 72 73 74 28 26 74 65 6d 70 32 29 3b 20  hFirst(&temp2); 
1cd0: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
1ce0: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
1cf0: 6d 29 29 7b 0a 20 20 20 20 20 20 54 72 69 67 67  m)){.      Trigg
1d00: 65 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20 73  er *pTrigger = s
1d10: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
1d20: 6c 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lem);.      sqli
1d30: 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 72  te3DeleteTrigger
1d40: 28 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20  (pTrigger);.    
1d50: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73  }.    sqlite3Has
1d60: 68 43 6c 65 61 72 28 26 74 65 6d 70 32 29 3b 0a  hClear(&temp2);.
1d70: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
1d80: 6e 69 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73  nit(&pDb->tblHas
1d90: 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53  h, SQLITE_HASH_S
1da0: 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 66  TRING, 0);.    f
1db0: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
1dc0: 61 73 68 46 69 72 73 74 28 26 74 65 6d 70 31 29  ashFirst(&temp1)
1dd0: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
1de0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
1df0: 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 54 61 62  lem)){.      Tab
1e00: 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
1e10: 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
1e20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
1e30: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
1e40: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Tab);.    }.    
1e50: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
1e60: 28 26 74 65 6d 70 31 29 3b 0a 20 20 20 20 44 62  (&temp1);.    Db
1e70: 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62  ClearProperty(db
1e80: 2c 20 69 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f  , i, DB_SchemaLo
1e90: 61 64 65 64 29 3b 0a 20 20 20 20 69 66 28 20 69  aded);.    if( i
1ea0: 44 62 3e 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db>0 ) return;. 
1eb0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 44 62   }.  assert( iDb
1ec0: 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  ==0 );.  db->fla
1ed0: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
1ee0: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 20 20  ternChanges;..  
1ef0: 2f 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  /* If one or mor
1f00: 65 20 6f 66 20 74 68 65 20 61 75 78 69 6c 69 61  e of the auxilia
1f10: 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
1f20: 73 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65  s has been close
1f30: 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 6d  d,.  ** then rem
1f40: 6f 76 65 20 74 68 65 6e 20 66 72 6f 6d 20 74 68  ove then from th
1f50: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
1f60: 62 61 73 65 20 6c 69 73 74 2e 20 20 57 65 20 74  base list.  We t
1f70: 61 6b 65 20 74 68 65 0a 20 20 2a 2a 20 6f 70 70  ake the.  ** opp
1f80: 6f 72 74 75 6e 69 74 79 20 74 6f 20 64 6f 20 74  ortunity to do t
1f90: 68 69 73 20 68 65 72 65 20 73 69 6e 63 65 20 77  his here since w
1fa0: 65 20 68 61 76 65 20 6a 75 73 74 20 64 65 6c 65  e have just dele
1fb0: 74 65 64 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20  ted all of the. 
1fc0: 20 2a 2a 20 73 63 68 65 6d 61 20 68 61 73 68 20   ** schema hash 
1fd0: 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 72 65  tables and there
1fe0: 66 6f 72 65 20 64 6f 20 6e 6f 74 20 68 61 76 65  fore do not have
1ff0: 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 63 68 61   to make any cha
2000: 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 61 6e 79  nges.  ** to any
2010: 20 6f 66 20 74 68 6f 73 65 20 74 61 62 6c 65 73   of those tables
2020: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
2030: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
2040: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
2050: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
2060: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
2070: 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pBt==0 ){.    
2080: 20 20 69 66 28 20 70 44 62 2d 3e 70 41 75 78 20    if( pDb->pAux 
2090: 26 26 20 70 44 62 2d 3e 78 46 72 65 65 41 75 78  && pDb->xFreeAux
20a0: 20 29 20 70 44 62 2d 3e 78 46 72 65 65 41 75 78   ) pDb->xFreeAux
20b0: 28 70 44 62 2d 3e 70 41 75 78 29 3b 0a 20 20 20  (pDb->pAux);.   
20c0: 20 20 20 70 44 62 2d 3e 70 41 75 78 20 3d 20 30     pDb->pAux = 0
20d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
20e0: 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e  r(i=j=2; i<db->n
20f0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  Db; i++){.    st
2100: 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26  ruct Db *pDb = &
2110: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
2120: 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20  if( pDb->pBt==0 
2130: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  ){.      sqliteF
2140: 72 65 65 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b  ree(pDb->zName);
2150: 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d  .      pDb->zNam
2160: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  e = 0;.      con
2170: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
2180: 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20   if( j<i ){.    
2190: 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64    db->aDb[j] = d
21a0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d  b->aDb[i];.    }
21b0: 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
21c0: 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44 62 5b  memset(&db->aDb[
21d0: 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d  j], 0, (db->nDb-
21e0: 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44  j)*sizeof(db->aD
21f0: 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44  b[j]));.  db->nD
2200: 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d  b = j;.  if( db-
2210: 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61  >nDb<=2 && db->a
2220: 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69  Db!=db->aDbStati
2230: 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  c ){.    memcpy(
2240: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64  db->aDbStatic, d
2250: 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66  b->aDb, 2*sizeof
2260: 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20  (db->aDb[0]));. 
2270: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 64 62     sqliteFree(db
2280: 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e  ->aDb);.    db->
2290: 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61  aDb = db->aDbSta
22a0: 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  tic;.  }.}../*.*
22b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
22c0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65  s called wheneve
22d0: 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  r a rollback occ
22e0: 75 72 73 2e 20 20 49 66 20 74 68 65 72 65 20 77  urs.  If there w
22f0: 65 72 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 68  ere.** schema ch
2300: 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65  anges during the
2310: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
2320: 65 6e 20 77 65 20 68 61 76 65 20 74 6f 20 72 65  en we have to re
2330: 73 65 74 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72  set the.** inter
2340: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 20  nal hash tables 
2350: 61 6e 64 20 72 65 6c 6f 61 64 20 74 68 65 6d 20  and reload them 
2360: 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f  from disk..*/.vo
2370: 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  id sqlite3Rollba
2380: 63 6b 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  ckInternalChange
2390: 73 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20  s(sqlite *db){. 
23a0: 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
23b0: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
23c0: 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 71 6c  anges ){.    sql
23d0: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
23e0: 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a  lSchema(db, 0);.
23f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
2400: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2410: 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69  led when a commi
2420: 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69  t occurs..*/.voi
2430: 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49  d sqlite3CommitI
2440: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73  nternalChanges(s
2450: 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 64 62  qlite *db){.  db
2460: 2d 3e 61 44 62 5b 30 5d 2e 73 63 68 65 6d 61 5f  ->aDb[0].schema_
2470: 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 6e 65 78  cookie = db->nex
2480: 74 5f 63 6f 6f 6b 69 65 3b 0a 20 20 64 62 2d 3e  t_cookie;.  db->
2490: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
24a0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
24b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
24c0: 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20  the memory data 
24d0: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
24e0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
24f0: 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20  iven.** Table.  
2500: 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
2510: 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74  ade to disk by t
2520: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
2530: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2540: 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65  just deletes the
2550: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e   data structure.
2560: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e    It does not un
2570: 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c  link.** the tabl
2580: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
2590: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
25a0: 61 62 6c 65 2e 20 20 4e 6f 72 20 64 6f 65 73 20  able.  Nor does 
25b0: 69 74 20 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f 72  it remove.** for
25c0: 65 69 67 6e 20 6b 65 79 73 20 66 72 6f 6d 20 74  eign keys from t
25d0: 68 65 20 73 71 6c 69 74 65 2e 61 46 4b 65 79 20  he sqlite.aFKey 
25e0: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74  hash table.  But
25f0: 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79   it does destroy
2600: 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  .** memory struc
2610: 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64  tures of the ind
2620: 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e  ices and foreign
2630: 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64   keys associated
2640: 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61   with .** the ta
2650: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63  ble..**.** Indic
2660: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
2670: 74 68 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  th the table are
2680: 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74   unlinked from t
2690: 68 65 20 22 64 62 22 0a 2a 2a 20 64 61 74 61 20  he "db".** data 
26a0: 73 74 72 75 63 74 75 72 65 20 69 66 20 64 62 21  structure if db!
26b0: 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d 3d 4e  =NULL.  If db==N
26c0: 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61 74 74  ULL, indices att
26d0: 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20  ached to.** the 
26e0: 74 61 62 6c 65 20 61 72 65 20 64 65 6c 65 74 65  table are delete
26f0: 64 2c 20 62 75 74 20 69 74 20 69 73 20 61 73 73  d, but it is ass
2700: 75 6d 65 64 20 74 68 65 79 20 68 61 76 65 20 61  umed they have a
2710: 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 75  lready been.** u
2720: 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64  nlinked..*/.void
2730: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
2740: 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20  ble(sqlite *db, 
2750: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
2760: 20 20 69 6e 74 20 69 3b 0a 20 20 49 6e 64 65 78    int i;.  Index
2770: 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74   *pIndex, *pNext
2780: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c  ;.  FKey *pFKey,
2790: 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20   *pNextFKey;..  
27a0: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20  if( pTable==0 ) 
27b0: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 65  return;..  /* De
27c0: 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  lete all indices
27d0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
27e0: 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f   this table.  */
27f0: 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20  .  for(pIndex = 
2800: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
2810: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70  pIndex; pIndex=p
2820: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
2830: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
2840: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
2850: 6e 64 65 78 2d 3e 69 44 62 3d 3d 70 54 61 62 6c  ndex->iDb==pTabl
2860: 65 2d 3e 69 44 62 20 7c 7c 20 28 70 54 61 62 6c  e->iDb || (pTabl
2870: 65 2d 3e 69 44 62 3d 3d 30 20 26 26 20 70 49 6e  e->iDb==0 && pIn
2880: 64 65 78 2d 3e 69 44 62 3d 3d 31 29 20 29 3b 0a  dex->iDb==1) );.
2890: 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65      sqliteDelete
28a0: 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
28b0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
28c0: 65 74 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20  ete all foreign 
28d0: 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  keys associated 
28e0: 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e  with this table.
28f0: 20 20 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20    The keys.  ** 
2900: 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65  should have alre
2910: 61 64 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65  ady been unlinke
2920: 64 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 61  d from the db->a
2930: 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65 20  FKey hash table 
2940: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b 65  .  */.  for(pFKe
2950: 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b 65 79 3b  y=pTable->pFKey;
2960: 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 4e   pFKey; pFKey=pN
2970: 65 78 74 46 4b 65 79 29 7b 0a 20 20 20 20 70 4e  extFKey){.    pN
2980: 65 78 74 46 4b 65 79 20 3d 20 70 46 4b 65 79 2d  extFKey = pFKey-
2990: 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20  >pNextFrom;.    
29a0: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
29b0: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
29c0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
29d0: 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  e3HashFind(&db->
29e0: 61 44 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62 5d  aDb[pTable->iDb]
29f0: 2e 61 46 4b 65 79 2c 0a 20 20 20 20 20 20 20 20  .aFKey,.        
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73     pFKey->zTo, s
2a20: 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f  trlen(pFKey->zTo
2a30: 29 2b 31 29 21 3d 70 46 4b 65 79 20 29 3b 0a 20  )+1)!=pFKey );. 
2a40: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 46     sqliteFree(pF
2a50: 4b 65 79 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Key);.  }..  /* 
2a60: 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65  Delete the Table
2a70: 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c   structure itsel
2a80: 66 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  f..  */.  for(i=
2a90: 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f  0; i<pTable->nCo
2aa0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  l; i++){.    sql
2ab0: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e  iteFree(pTable->
2ac0: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  aCol[i].zName);.
2ad0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
2ae0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  Table->aCol[i].z
2af0: 44 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Dflt);.    sqlit
2b00: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
2b10: 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20  ol[i].zType);.  
2b20: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
2b30: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Table->zName);. 
2b40: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
2b50: 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 69 66 28  le->aCol);.  if(
2b60: 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66   pTable->zColAff
2b70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
2b80: 65 65 28 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41  ee(pTable->zColA
2b90: 66 66 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ff);.  }.  sqlit
2ba0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
2bb0: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b  Table->pSelect);
2bc0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54  .  sqliteFree(pT
2bd0: 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  able);.}../*.** 
2be0: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
2bf0: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
2c00: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
2c10: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
2c20: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
2c30: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
2c40: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
2c50: 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 73 74 61 74  gn keys..*/.stat
2c60: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 55 6e  ic void sqliteUn
2c70: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62  linkAndDeleteTab
2c80: 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 54  le(sqlite *db, T
2c90: 61 62 6c 65 20 2a 70 29 7b 0a 20 20 54 61 62 6c  able *p){.  Tabl
2ca0: 65 20 2a 70 4f 6c 64 3b 0a 20 20 46 4b 65 79 20  e *pOld;.  FKey 
2cb0: 2a 70 46 31 2c 20 2a 70 46 32 3b 0a 20 20 69 6e  *pF1, *pF2;.  in
2cc0: 74 20 69 20 3d 20 70 2d 3e 69 44 62 3b 0a 20 20  t i = p->iDb;.  
2cd0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
2ce0: 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65  .  pOld = sqlite
2cf0: 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  3HashInsert(&db-
2d00: 3e 61 44 62 5b 69 5d 2e 74 62 6c 48 61 73 68 2c  >aDb[i].tblHash,
2d10: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   p->zName, strle
2d20: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30  n(p->zName)+1, 0
2d30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 6c  );.  assert( pOl
2d40: 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20  d==0 || pOld==p 
2d50: 29 3b 0a 20 20 66 6f 72 28 70 46 31 3d 70 2d 3e  );.  for(pF1=p->
2d60: 70 46 4b 65 79 3b 20 70 46 31 3b 20 70 46 31 3d  pFKey; pF1; pF1=
2d70: 70 46 31 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b  pF1->pNextFrom){
2d80: 0a 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73  .    int nTo = s
2d90: 74 72 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20  trlen(pF1->zTo) 
2da0: 2b 20 31 3b 0a 20 20 20 20 70 46 32 20 3d 20 73  + 1;.    pF2 = s
2db0: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
2dc0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 61 46 4b 65 79  db->aDb[i].aFKey
2dd0: 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 29  , pF1->zTo, nTo)
2de0: 3b 0a 20 20 20 20 69 66 28 20 70 46 32 3d 3d 70  ;.    if( pF2==p
2df0: 46 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  F1 ){.      sqli
2e00: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64  te3HashInsert(&d
2e10: 62 2d 3e 61 44 62 5b 69 5d 2e 61 46 4b 65 79 2c  b->aDb[i].aFKey,
2e20: 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20   pF1->zTo, nTo, 
2e30: 70 46 31 2d 3e 70 4e 65 78 74 54 6f 29 3b 0a 20  pF1->pNextTo);. 
2e40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e50: 77 68 69 6c 65 28 20 70 46 32 20 26 26 20 70 46  while( pF2 && pF
2e60: 32 2d 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31 20  2->pNextTo!=pF1 
2e70: 29 7b 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78  ){ pF2=pF2->pNex
2e80: 74 54 6f 3b 20 7d 0a 20 20 20 20 20 20 69 66 28  tTo; }.      if(
2e90: 20 70 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20   pF2 ){.        
2ea0: 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70  pF2->pNextTo = p
2eb0: 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20  F1->pNextTo;.   
2ec0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2ed0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
2ee0: 62 6c 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ble(db, p);.}../
2ef0: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 74  *.** Construct t
2f00: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 75 73 65  he name of a use
2f10: 72 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  r table or index
2f20: 20 66 72 6f 6d 20 61 20 74 6f 6b 65 6e 2e 0a 2a   from a token..*
2f30: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
2f40: 6c 64 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6f  ld the name is o
2f50: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
2f60: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
2f70: 6d 75 73 74 0a 2a 2a 20 62 65 20 66 72 65 65 64  must.** be freed
2f80: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
2f90: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61  function..*/.cha
2fa0: 72 20 2a 73 71 6c 69 74 65 33 54 61 62 6c 65 4e  r *sqlite3TableN
2fb0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b  ameFromToken(Tok
2fc0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68  en *pName){.  ch
2fd0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ar *zName = sqli
2fe0: 74 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d  teStrNDup(pName-
2ff0: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20  >z, pName->n);. 
3000: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
3010: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
3020: 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zName;.}../*.**
3030: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
3040: 6f 20 6f 70 65 6e 20 74 68 65 20 61 70 70 72 6f  o open the appro
3050: 70 72 69 61 74 65 20 6d 61 73 74 65 72 20 74 61  priate master ta
3060: 62 6c 65 2e 20 20 54 68 65 20 74 61 62 6c 65 0a  ble.  The table.
3070: 2a 2a 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62  ** opened will b
3080: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
3090: 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 74  for persistent t
30a0: 61 62 6c 65 73 20 61 6e 64 20 0a 2a 2a 20 53 51  ables and .** SQ
30b0: 4c 49 54 45 5f 54 45 4d 50 5f 4d 41 53 54 45 52  LITE_TEMP_MASTER
30c0: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74   for temporary t
30d0: 61 62 6c 65 73 2e 20 20 54 68 65 20 74 61 62 6c  ables.  The tabl
30e0: 65 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f  e is opened.** o
30f0: 6e 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76  n cursor 0..*/.v
3100: 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d  oid sqlite3OpenM
3110: 61 73 74 65 72 54 61 62 6c 65 28 56 64 62 65 20  asterTable(Vdbe 
3120: 2a 76 2c 20 69 6e 74 20 69 73 54 65 6d 70 29 7b  *v, int isTemp){
3130: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3140: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
3150: 72 2c 20 69 73 54 65 6d 70 2c 20 30 29 3b 0a 20  r, isTemp, 0);. 
3160: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3170: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  p(v, OP_OpenWrit
3180: 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  e, 0, MASTER_ROO
3190: 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  T);.  sqlite3Vdb
31a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
31b0: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35  NumColumns, 0, 5
31c0: 29 3b 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73  ); /* sqlite_mas
31d0: 74 65 72 20 68 61 73 20 35 20 63 6f 6c 75 6d 6e  ter has 5 column
31e0: 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  s */.}../*.** Be
31f0: 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  gin constructing
3200: 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70   a new table rep
3210: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d  resentation in m
3220: 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a  emory.  This is.
3230: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  ** the first of 
3240: 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72  several action r
3250: 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74  outines that get
3260: 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f   called in respo
3270: 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41  nse.** to a CREA
3280: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
3290: 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c  nt.  In particul
32a0: 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ar, this routine
32b0: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66   is called.** af
32c0: 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e  ter seeing token
32d0: 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22  s "CREATE" and "
32e0: 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74  TABLE" and the t
32f0: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a  able name.  The.
3300: 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b 65 6e 20  ** pStart token 
3310: 69 73 20 74 68 65 20 43 52 45 41 54 45 20 61 6e  is the CREATE an
3320: 64 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 74  d pName is the t
3330: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
3340: 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69  isTemp.** flag i
3350: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61  s true if the ta
3360: 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74  ble should be st
3370: 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69  ored in the auxi
3380: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a  liary database.*
3390: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
33a0: 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  f in the main da
33b0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
33c0: 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74  is is normally t
33d0: 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20  he case.** when 
33e0: 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54  the "TEMP" or "T
33f0: 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72  EMPORARY" keywor
3400: 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  d occurs in betw
3410: 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e  een.** CREATE an
3420: 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54  d TABLE..**.** T
3430: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
3440: 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ord is initializ
3450: 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50  ed and put in pP
3460: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e  arse->pNewTable.
3470: 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74  .** As more of t
3480: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
3490: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
34a0: 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  sed, additional 
34b0: 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e  action.** routin
34c0: 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  es will be calle
34d0: 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e  d to add more in
34e0: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69  formation to thi
34f0: 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20  s record..** At 
3500: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
3510: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
3520: 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74  ement, the sqlit
3530: 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75  e3EndTable() rou
3540: 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
3550: 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  d to complete th
3560: 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f  e construction o
3570: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
3580: 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20  record..*/.void 
3590: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
35a0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
35b0: 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20  se,   /* Parser 
35c0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
35d0: 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a  en *pStart,   /*
35e0: 20 54 68 65 20 22 43 52 45 41 54 45 22 20 74 6f   The "CREATE" to
35f0: 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ken */.  Token *
3600: 70 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d  pName,    /* Nam
3610: 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20 76 69  e of table or vi
3620: 65 77 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  ew to create */.
3630: 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20    int isTemp,   
3640: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
3650: 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61 62  is is a TEMP tab
3660: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  le */.  int isVi
3670: 65 77 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ew       /* True
3680: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49   if this is a VI
3690: 45 57 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  EW */.){.  Table
36a0: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49 6e 64 65   *pTable;.  Inde
36b0: 78 20 2a 70 49 64 78 3b 0a 20 20 63 68 61 72 20  x *pIdx;.  char 
36c0: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  *zName;.  sqlite
36d0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
36e0: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
36f0: 69 6e 74 20 69 44 62 3b 0a 0a 20 20 70 50 61 72  int iDb;..  pPar
3700: 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 20  se->sFirstToken 
3710: 3d 20 2a 70 53 74 61 72 74 3b 0a 20 20 7a 4e 61  = *pStart;.  zNa
3720: 6d 65 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c  me = sqlite3Tabl
3730: 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  eNameFromToken(p
3740: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
3750: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
3760: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69    if( db->init.i
3770: 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d  Db==1 ) isTemp =
3780: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
3790: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
37a0: 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20  ATION.  assert( 
37b0: 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73  (isTemp & 1)==is
37c0: 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20  Temp );.  {.    
37d0: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 68  int code;.    ch
37e0: 61 72 20 2a 7a 44 62 20 3d 20 69 73 54 65 6d 70  ar *zDb = isTemp
37f0: 20 3f 20 22 74 65 6d 70 22 20 3a 20 22 6d 61 69   ? "temp" : "mai
3800: 6e 22 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  n";.    if( sqli
3810: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
3820: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
3830: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
3840: 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62  (isTemp), 0, zDb
3850: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
3860: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
3870: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
3880: 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
3890: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
38a0: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
38b0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
38c0: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  EATE_TEMP_VIEW;.
38d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
38e0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
38f0: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a  TE_CREATE_VIEW;.
3900: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
3910: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54  e{.      if( isT
3920: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63  emp ){.        c
3930: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
3940: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ATE_TEMP_TABLE;.
3950: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3960: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
3970: 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b  TE_CREATE_TABLE;
3980: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3990: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
39a0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
39b0: 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20  code, zName, 0, 
39c0: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71  zDb) ){.      sq
39d0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
39e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
39f0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
3a00: 20 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74   ..  /* Before t
3a10: 72 79 69 6e 67 20 74 6f 20 63 72 65 61 74 65 20  rying to create 
3a20: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
3a30: 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  e, make sure the
3a40: 20 42 74 72 65 65 20 66 6f 72 0a 20 20 2a 2a 20   Btree for.  ** 
3a50: 68 6f 6c 64 69 6e 67 20 74 65 6d 70 6f 72 61 72  holding temporar
3a60: 79 20 74 61 62 6c 65 73 20 69 73 20 6f 70 65 6e  y tables is open
3a70: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54  ..  */.  if( isT
3a80: 65 6d 70 20 26 26 20 64 62 2d 3e 61 44 62 5b 31  emp && db->aDb[1
3a90: 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61  ].pBt==0 && !pPa
3aa0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
3ab0: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
3ac0: 69 74 65 33 42 74 72 65 65 46 61 63 74 6f 72 79  ite3BtreeFactory
3ad0: 28 64 62 2c 20 30 2c 20 30 2c 20 4d 41 58 5f 50  (db, 0, 0, MAX_P
3ae0: 41 47 45 53 2c 20 26 64 62 2d 3e 61 44 62 5b 31  AGES, &db->aDb[1
3af0: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  ].pBt);.    if( 
3b00: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
3b10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
3b20: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3b30: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61  unable to open a
3b40: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
3b50: 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66  ase ".        "f
3b60: 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ile for storing 
3b70: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
3b80: 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ");.      pParse
3b90: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
3ba0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
3bb0: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
3bc0: 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  & SQLITE_InTrans
3bd0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
3be0: 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
3bf0: 54 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d  Trans(db->aDb[1]
3c00: 2e 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28  .pBt);.      if(
3c10: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
3c20: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3c30: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3c40: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74  , "unable to get
3c50: 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e   a write lock on
3c60: 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 74 68   ".          "th
3c70: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  e temporary data
3c80: 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20 20 20  base file");.   
3c90: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
3ca0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
3cb0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
3cc0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d  he new table nam
3cd0: 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69  e does not colli
3ce0: 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74  de with an exist
3cf0: 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  ing.  ** index o
3d00: 72 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 49  r table name.  I
3d10: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
3d20: 73 73 61 67 65 20 69 66 20 69 74 20 64 6f 65 73  ssage if it does
3d30: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ..  **.  ** If w
3d40: 65 20 61 72 65 20 72 65 2d 72 65 61 64 69 6e 67  e are re-reading
3d50: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
3d60: 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65  er table because
3d70: 20 6f 66 20 61 20 73 63 68 65 6d 61 0a 20 20 2a   of a schema.  *
3d80: 2a 20 63 68 61 6e 67 65 20 61 6e 64 20 61 20 6e  * change and a n
3d90: 65 77 20 70 65 72 6d 61 6e 65 6e 74 20 74 61 62  ew permanent tab
3da0: 6c 65 20 69 73 20 66 6f 75 6e 64 20 77 68 6f 73  le is found whos
3db0: 65 20 6e 61 6d 65 20 63 6f 6c 6c 69 64 65 73 20  e name collides 
3dc0: 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 65 78 69  with.  ** an exi
3dd0: 73 74 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20  sting temporary 
3de0: 74 61 62 6c 65 2c 20 74 68 61 74 20 69 73 20 6e  table, that is n
3df0: 6f 74 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a  ot an error..  *
3e00: 2f 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  /.  pTable = sql
3e10: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
3e20: 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69  , zName, 0);.  i
3e30: 44 62 20 3d 20 69 73 54 65 6d 70 20 3f 20 31 20  Db = isTemp ? 1 
3e40: 3a 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a  : db->init.iDb;.
3e50: 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20    if( pTable!=0 
3e60: 26 26 20 28 70 54 61 62 6c 65 2d 3e 69 44 62 3d  && (pTable->iDb=
3e70: 3d 69 44 62 20 7c 7c 20 21 64 62 2d 3e 69 6e 69  =iDb || !db->ini
3e80: 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 73  t.busy) ){.    s
3e90: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3ea0: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54  Parse, "table %T
3eb0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
3ec0: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  , pName);.    sq
3ed0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
3ee0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
3ef0: 0a 20 20 69 66 28 20 28 70 49 64 78 20 3d 20 73  .  if( (pIdx = s
3f00: 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
3f10: 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d  db, zName, 0))!=
3f20: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 28  0 &&.          (
3f30: 70 49 64 78 2d 3e 69 44 62 3d 3d 30 20 7c 7c 20  pIdx->iDb==0 || 
3f40: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20  !db->init.busy) 
3f50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
3f60: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3f70: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
3f80: 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20   an index named 
3f90: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
3fa0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
3fb0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
3fc0: 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73    }.  pTable = s
3fd0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
3fe0: 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
3ff0: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b  if( pTable==0 ){
4000: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
4010: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
4020: 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  rn;.  }.  pTable
4030: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
4040: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  .  pTable->nCol 
4050: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61  = 0;.  pTable->a
4060: 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  Col = 0;.  pTabl
4070: 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  e->iPKey = -1;. 
4080: 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20   pTable->pIndex 
4090: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69  = 0;.  pTable->i
40a0: 44 62 20 3d 20 69 44 62 3b 0a 20 20 69 66 28 20  Db = iDb;.  if( 
40b0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
40c0: 65 20 29 20 73 71 6c 69 74 65 33 44 65 6c 65 74  e ) sqlite3Delet
40d0: 65 54 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73  eTable(db, pPars
40e0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20  e->pNewTable);. 
40f0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
4100: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20  le = pTable;..  
4110: 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
4120: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
4130: 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68  t will insert th
4140: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  e table record i
4150: 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c  nto.  ** the SQL
4160: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
4170: 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69  .  Note in parti
4180: 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75  cular that we mu
4190: 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a  st go ahead.  **
41a0: 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68   and allocate th
41b0: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
41c0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e  for the table en
41d0: 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65  try now.  Before
41e0: 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52   any.  ** PRIMAR
41f0: 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
4200: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61 72  keywords are par
4210: 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77  sed.  Those keyw
4220: 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a  ords will cause.
4230: 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
4240: 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 74  be created and t
4250: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
4260: 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65  must come before
4270: 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63   the .  ** indic
4280: 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20  es.  Hence, the 
4290: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
42a0: 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74  r the table must
42b0: 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20   be allocated.  
42c0: 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69  ** now..  */.  i
42d0: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
42e0: 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65  y && (v = sqlite
42f0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
4300: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
4310: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
4320: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
4330: 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 69  , isTemp);.    i
4340: 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20  f( !isTemp ){.  
4350: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4360: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
4370: 65 72 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72  er, db->file_for
4380: 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  mat, 0);.      s
4390: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
43a0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
43b0: 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 1);.    }.  
43c0: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73    sqlite3OpenMas
43d0: 74 65 72 54 61 62 6c 65 28 76 2c 20 69 73 54 65  terTable(v, isTe
43e0: 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mp);.    sqlite3
43f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4400: 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b  NewRecno, 0, 0);
4410: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4420: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
4430: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
4440: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4450: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
4460: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4470: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
4480: 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20  IntKey, 0, 0);. 
4490: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
44a0: 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20  a new column to 
44b0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
44c0: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
44d0: 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ucted..**.** The
44e0: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
44f0: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20  is routine once 
4500: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
4510: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69  declaration.** i
4520: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
4530: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c   statement.  sql
4540: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29  ite3StartTable()
4550: 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20   gets called.** 
4560: 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69  first to get thi
4570: 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e  ngs going.  Then
4580: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
4590: 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68   called for each
45a0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76  .** column..*/.v
45b0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
45c0: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
45d0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
45e0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
45f0: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
4600: 7a 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20  z = 0;.  Column 
4610: 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20  *pCol;.  if( (p 
4620: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
4630: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
4640: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53  ;.  sqlite3SetNS
4650: 74 72 69 6e 67 28 26 7a 2c 20 70 4e 61 6d 65 2d  tring(&z, pName-
4660: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29  >z, pName->n, 0)
4670: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
4680: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
4690: 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f  Dequote(z);.  fo
46a0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
46b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
46c0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
46d0: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  , p->aCol[i].zNa
46e0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
46f0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4700: 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61  pParse, "duplica
4710: 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  te column name: 
4720: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73  %s", z);.      s
4730: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
4740: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
4750: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  }.  }.  if( (p->
4760: 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29  nCol & 0x7)==0 )
4770: 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e  {.    Column *aN
4780: 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73  ew;.    aNew = s
4790: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d  qliteRealloc( p-
47a0: 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b  >aCol, (p->nCol+
47b0: 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  8)*sizeof(p->aCo
47c0: 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  l[0]));.    if( 
47d0: 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  aNew==0 ) return
47e0: 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20  ;.    p->aCol = 
47f0: 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c  aNew;.  }.  pCol
4800: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
4810: 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  Col];.  memset(p
4820: 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  Col, 0, sizeof(p
4830: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70  ->aCol[0]));.  p
4840: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a  Col->zName = z;.
4850: 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20   .  /* If there 
4860: 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69  is no type speci
4870: 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61  fied, columns ha
4880: 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 61  ve the default a
4890: 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 55  ffinity.  ** 'NU
48a0: 4d 45 52 49 43 27 2e 20 49 66 20 74 68 65 72 65  MERIC'. If there
48b0: 20 69 73 20 61 20 74 79 70 65 20 73 70 65 63 69   is a type speci
48c0: 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74  fied, then sqlit
48d0: 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  e3AddColumnType(
48e0: 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63  ).  ** will be c
48f0: 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65  alled next to se
4900: 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  t pCol->affinity
4910: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f   correctly..  */
4920: 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  .  pCol->affinit
4930: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  y = SQLITE_AFF_N
4940: 55 4d 45 52 49 43 3b 0a 20 20 70 43 6f 6c 2d 3e  UMERIC;.  pCol->
4950: 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
4960: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
4970: 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f   p->nCol++;.}../
4980: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4990: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
49a0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
49b0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
49c0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
49d0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
49e0: 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55  ment.  A "NOT NU
49f0: 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68  LL" constraint h
4a00: 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20  as.** been seen 
4a10: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  on a column.  Th
4a20: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
4a30: 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67  the notNull flag
4a40: 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   on.** the colum
4a50: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
4a60: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
4a70: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
4a80: 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20  ddNotNull(Parse 
4a90: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45  *pParse, int onE
4aa0: 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a  rror){.  Table *
4ab0: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  p;.  int i;.  if
4ac0: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
4ad0: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
4ae0: 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e  eturn;.  i = p->
4af0: 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e  nCol-1;.  if( i>
4b00: 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  =0 ) p->aCol[i].
4b10: 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f  notNull = onErro
4b20: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  r;.}../*.** This
4b30: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
4b40: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
4b50: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
4b60: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
4b70: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
4b80: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  E statement.  Th
4b90: 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69  e pFirst token i
4ba0: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74  s the first.** t
4bb0: 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75  oken in the sequ
4bc0: 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74  ence of tokens t
4bd0: 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65  hat describe the
4be0: 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20   type of the.** 
4bf0: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
4c00: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
4c10: 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20  ion.   pLast is 
4c20: 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a  the last token.*
4c30: 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63  * in the sequenc
4c40: 65 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66  e.  Use this inf
4c50: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73  ormation to cons
4c60: 74 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a  truct a string.*
4c70: 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  * that contains 
4c80: 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20  the typename of 
4c90: 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73  the column and s
4ca0: 74 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67  tore that string
4cb0: 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f  .** in zType..*/
4cc0: 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64   .void sqlite3Ad
4cd0: 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73  dColumnType(Pars
4ce0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
4cf0: 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e 20   *pFirst, Token 
4d00: 2a 70 4c 61 73 74 29 7b 0a 20 20 54 61 62 6c 65  *pLast){.  Table
4d10: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b   *p;.  int i, j;
4d20: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72  .  int n;.  char
4d30: 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20 20 43 6f 6c   *z, **pz;.  Col
4d40: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28  umn *pCol;.  if(
4d50: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
4d60: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
4d70: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
4d80: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30  Col-1;.  if( i<0
4d90: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f   ) return;.  pCo
4da0: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b  l = &p->aCol[i];
4db0: 0a 20 20 70 7a 20 3d 20 26 70 43 6f 6c 2d 3e 7a  .  pz = &pCol->z
4dc0: 54 79 70 65 3b 0a 20 20 6e 20 3d 20 70 4c 61 73  Type;.  n = pLas
4dd0: 74 2d 3e 6e 20 2b 20 41 64 64 72 28 70 4c 61 73  t->n + Addr(pLas
4de0: 74 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 46 69  t->z) - Addr(pFi
4df0: 72 73 74 2d 3e 7a 29 3b 0a 20 20 73 71 6c 69 74  rst->z);.  sqlit
4e00: 65 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c  e3SetNString(pz,
4e10: 20 70 46 69 72 73 74 2d 3e 7a 2c 20 6e 2c 20 30   pFirst->z, n, 0
4e20: 29 3b 0a 20 20 7a 20 3d 20 2a 70 7a 3b 0a 20 20  );.  z = *pz;.  
4e30: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
4e40: 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  n;.  for(i=j=0; 
4e50: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
4e60: 69 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20  int c = z[i];.  
4e70: 20 20 69 66 28 20 69 73 73 70 61 63 65 28 63 29    if( isspace(c)
4e80: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
4e90: 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d   z[j++] = c;.  }
4ea0: 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 2f 2f 20  .  z[j] = 0;.// 
4eb0: 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72   pCol->sortOrder
4ec0: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 74   = sqlite3Collat
4ed0: 65 54 79 70 65 28 7a 2c 20 6e 29 3b 0a 20 20 70  eType(z, n);.  p
4ee0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
4ef0: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
4f00: 79 70 65 28 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a  ype(z, n);.}../*
4f10: 0a 2a 2a 20 54 68 65 20 67 69 76 65 6e 20 74 6f  .** The given to
4f20: 6b 65 6e 20 69 73 20 74 68 65 20 64 65 66 61 75  ken is the defau
4f30: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
4f40: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64   last column add
4f50: 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62  ed to.** the tab
4f60: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
4f70: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
4f80: 20 20 49 66 20 22 6d 69 6e 75 73 46 6c 61 67 22    If "minusFlag"
4f90: 20 69 73 20 74 72 75 65 2c 20 69 74 0a 2a 2a 20   is true, it.** 
4fa0: 6d 65 61 6e 73 20 74 68 65 20 76 61 6c 75 65 20  means the value 
4fb0: 74 6f 6b 65 6e 20 77 61 73 20 70 72 65 63 65 64  token was preced
4fc0: 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69  ed by a minus si
4fd0: 67 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  gn..**.** This r
4fe0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
4ff0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
5000: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
5010: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
5020: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
5030: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
5040: 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66  id sqlite3AddDef
5050: 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20  aultValue(Parse 
5060: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
5070: 70 56 61 6c 2c 20 69 6e 74 20 6d 69 6e 75 73 46  pVal, int minusF
5080: 6c 61 67 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  lag){.  Table *p
5090: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
50a0: 72 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20 28 70  r **pz;.  if( (p
50b0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
50c0: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
50d0: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
50e0: 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20  -1;.  if( i<0 ) 
50f0: 72 65 74 75 72 6e 3b 0a 20 20 70 7a 20 3d 20 26  return;.  pz = &
5100: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74  p->aCol[i].zDflt
5110: 3b 0a 20 20 69 66 28 20 6d 69 6e 75 73 46 6c 61  ;.  if( minusFla
5120: 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
5130: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 22  SetNString(pz, "
5140: 2d 22 2c 20 31 2c 20 70 56 61 6c 2d 3e 7a 2c 20  -", 1, pVal->z, 
5150: 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d  pVal->n, 0);.  }
5160: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
5170: 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20  3SetNString(pz, 
5180: 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e  pVal->z, pVal->n
5190: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
51a0: 74 65 33 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b  te3Dequote(*pz);
51b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e  .}../*.** Design
51c0: 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20  ate the PRIMARY 
51d0: 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c  KEY for the tabl
51e0: 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c  e.  pList is a l
51f0: 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a  ist of names .**
5200: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   of columns that
5210: 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72   form the primar
5220: 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74  y key.  If pList
5230: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
5240: 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e  he.** most recen
5250: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
5260: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   of the table is
5270: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
5280: 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20  ..**.** A table 
5290: 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74  can have at most
52a0: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
52b0: 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  .  If the table 
52c0: 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61  already has.** a
52d0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e   primary key (an
52e0: 64 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65  d this is the se
52f0: 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79  cond primary key
5300: 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e  ) then create an
5310: 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a  .** error..**.**
5320: 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   If the PRIMARY 
5330: 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67  KEY is on a sing
5340: 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20  le column whose 
5350: 64 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45  datatype is INTE
5360: 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20  GER,.** then we 
5370: 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20  will try to use 
5380: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74  that column as t
5390: 68 65 20 72 6f 77 20 69 64 2e 20 20 28 45 78 63  he row id.  (Exc
53a0: 65 70 74 69 6f 6e 3a 0a 2a 2a 20 46 6f 72 20 62  eption:.** For b
53b0: 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
53c0: 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65  bility with olde
53d0: 72 20 64 61 74 61 62 61 73 65 73 2c 20 64 6f 20  r databases, do 
53e0: 6e 6f 74 20 64 6f 20 74 68 69 73 0a 2a 2a 20 69  not do this.** i
53f0: 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  f the file forma
5400: 74 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  t version number
5410: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2e   is less than 1.
5420: 29 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65  )  Set the Table
5430: 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20  .iPKey.** field 
5440: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  of the table und
5450: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
5460: 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20  to be the index 
5470: 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  of the.** INTEGE
5480: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
5490: 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b  lumn.  Table.iPK
54a0: 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20  ey is set to -1 
54b0: 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  if there is.** n
54c0: 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  o INTEGER PRIMAR
54d0: 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Y KEY..**.** If 
54e0: 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61  the key is not a
54f0: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
5500: 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61  Y KEY, then crea
5510: 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69  te a unique.** i
5520: 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79  ndex for the key
5530: 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63  .  No index is c
5540: 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47  reated for INTEG
5550: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e  ER PRIMARY KEYs.
5560: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5570: 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 50 61  AddPrimaryKey(Pa
5580: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 64 4c  rse *pParse, IdL
5590: 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20  ist *pList, int 
55a0: 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c  onError){.  Tabl
55b0: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
55c0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63  ->pNewTable;.  c
55d0: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  har *zType = 0;.
55e0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c    int iCol = -1,
55f0: 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   i;.  if( pTab==
5600: 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79  0 ) goto primary
5610: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28  _key_exit;.  if(
5620: 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65   pTab->hasPrimKe
5630: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
5640: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5650: 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c   .      "table \
5660: 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74  "%s\" has more t
5670: 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  han one primary 
5680: 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  key", pTab->zNam
5690: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69  e);.    goto pri
56a0: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
56b0: 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73 50 72   }.  pTab->hasPr
56c0: 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66 28  imKey = 1;.  if(
56d0: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
56e0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43   iCol = pTab->nC
56f0: 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62  ol - 1;.    pTab
5700: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50  ->aCol[iCol].isP
5710: 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65  rimKey = 1;.  }e
5720: 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
5730: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
5740: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  i++){.      for(
5750: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
5760: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
5770: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
5780: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
5790: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
57a0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
57b0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
57c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
57d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
57e0: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
57f0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 20 70 54 61  pTab->nCol ) pTa
5800: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73  b->aCol[iCol].is
5810: 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20  PrimKey = 1;.   
5820: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74   }.    if( pList
5830: 2d 3e 6e 49 64 3e 31 20 29 20 69 43 6f 6c 20 3d  ->nId>1 ) iCol =
5840: 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69   -1;.  }.  if( i
5850: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
5860: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
5870: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
5880: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
5890: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65  .  }.  if( zType
58a0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
58b0: 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47  mp(zType, "INTEG
58c0: 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ER")==0 ){.    p
58d0: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f  Tab->iPKey = iCo
58e0: 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79  l;.    pTab->key
58f0: 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  Conf = onError;.
5900: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
5910: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
5920: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 70 4c  pParse, 0, 0, pL
5930: 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ist, onError, 0,
5940: 20 30 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d   0);.    pList =
5950: 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79   0;.  }..primary
5960: 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c  _key_exit:.  sql
5970: 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
5980: 28 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  (pList);.  retur
5990: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  n;.}../*.** Retu
59a0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
59b0: 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 20 74 68  CollSeq given th
59c0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 6c  e name of a coll
59d0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
59e0: 2a 2a 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74  ** If the collat
59f0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 64 69 64  ing sequence did
5a00: 20 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20   not previously 
5a10: 65 78 69 73 74 2c 20 63 72 65 61 74 65 20 69 74  exist, create it
5a20: 20 62 75 74 0a 2a 2a 20 61 73 73 69 67 6e 20 69   but.** assign i
5a30: 74 20 61 6e 20 4e 55 4c 4c 20 63 6f 6d 70 61 72  t an NULL compar
5a40: 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ison function..*
5a50: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
5a60: 65 33 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61  e3CollateType(Pa
5a70: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
5a80: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20  st char *zType, 
5a90: 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20 43 6f  int nType){.  Co
5aa0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
5ab0: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
5ac0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 70 43 6f 6c  rse->db;..  pCol
5ad0: 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  l = sqlite3HashF
5ae0: 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ind(&db->aCollSe
5af0: 71 2c 20 7a 54 79 70 65 2c 20 6e 54 79 70 65 29  q, zType, nType)
5b00: 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30  ;.  if( pColl==0
5b10: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
5b20: 68 61 6e 67 65 43 6f 6c 6c 61 74 69 6e 67 46 75  hangeCollatingFu
5b30: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 54 79 70 65  nction(db, zType
5b40: 2c 20 6e 54 79 70 65 2c 20 30 2c 20 30 29 3b 0a  , nType, 0, 0);.
5b50: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
5b60: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
5b70: 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 54 79 70 65  >aCollSeq, zType
5b80: 2c 20 6e 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20  , nType);.  }.  
5b90: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
5ba0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
5bb0: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
5bc0: 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
5bd0: 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61  cently parsed ta
5be0: 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f  ble column.** to
5bf0: 20 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76   the CollSeq giv
5c00: 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  en..*/.void sqli
5c10: 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70  te3AddCollateTyp
5c20: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
5c30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
5c40: 70 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a  pe, int nType){.
5c50: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f    Table *p;.  Co
5c60: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
5c70: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
5c80: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
5c90: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
5ca0: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
5cb0: 75 72 6e 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73  urn;.  pColl = s
5cc0: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
5cd0: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 54  db->aCollSeq, zT
5ce0: 79 70 65 2c 20 6e 54 79 70 65 29 3b 0a 20 20 69  ype, nType);.  i
5cf0: 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20  f( pColl==0 ){. 
5d00: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
5d10: 65 33 43 68 61 6e 67 65 43 6f 6c 6c 61 74 69 6e  e3ChangeCollatin
5d20: 67 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 54  gFunction(db, zT
5d30: 79 70 65 2c 20 6e 54 79 70 65 2c 20 30 2c 20 30  ype, nType, 0, 0
5d40: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 6f  );.  }.  if( pCo
5d50: 6c 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 43 6f  ll ){.    p->aCo
5d60: 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 70 43 6f  l[p->nCol-1].pCo
5d70: 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 7d 0a  ll = pColl;.  }.
5d80: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
5d90: 6f 72 20 6d 6f 64 69 66 79 20 61 20 63 6f 6c 6c  or modify a coll
5da0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 65  ating sequence e
5db0: 6e 74 72 79 20 69 6e 20 74 68 65 20 73 71 6c 69  ntry in the sqli
5dc0: 74 65 2e 61 43 6f 6c 6c 53 65 71 0a 2a 2a 20 74  te.aCollSeq.** t
5dd0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  able..**.** Once
5de0: 20 61 6e 20 65 6e 74 72 79 20 69 73 20 61 64 64   an entry is add
5df0: 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  ed to the sqlite
5e00: 2e 61 43 6f 6c 6c 53 65 71 20 74 61 62 6c 65 2c  .aCollSeq table,
5e10: 20 69 74 20 63 61 6e 20 6e 65 76 65 72 0a 2a 2a   it can never.**
5e20: 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 74 68 6f   be removed, tho
5e30: 75 67 68 20 69 73 20 63 6f 6d 70 61 72 69 73 6f  ugh is compariso
5e40: 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 75 73  n function or us
5e50: 65 72 20 64 61 74 61 20 63 61 6e 20 62 65 20 63  er data can be c
5e60: 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  hanged..**.** Re
5e70: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
5e80: 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  o the collating 
5e90: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 77 61  function that wa
5ea0: 73 20 63 72 65 61 74 65 64 20 6f 72 20 6d 6f 64  s created or mod
5eb0: 69 66 69 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65  ified..*/.CollSe
5ec0: 71 20 2a 73 71 6c 69 74 65 33 43 68 61 6e 67 65  q *sqlite3Change
5ed0: 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 74 69 6f  CollatingFunctio
5ee0: 6e 28 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 2c  n(.  sqlite *db,
5ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5f00: 44 61 74 61 62 61 73 65 20 69 6e 74 6f 20 77 68  Database into wh
5f10: 69 63 68 20 74 6f 20 69 6e 73 65 72 74 20 74 68  ich to insert th
5f20: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 2a 2f 0a 20  e collation */. 
5f30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
5f40: 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  me,      /* Name
5f50: 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   of the collatio
5f60: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  n */.  int nName
5f70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
5f80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
5f90: 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20  acters in zName 
5fa0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72  */.  void *pUser
5fb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
5fc0: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
5fd0: 6f 20 78 43 6d 70 20 2a 2f 0a 20 20 69 6e 74 20  o xCmp */.  int 
5fe0: 28 2a 78 43 6d 70 29 28 76 6f 69 64 2a 2c 69 6e  (*xCmp)(void*,in
5ff0: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
6000: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 20 2f  t,const void*) /
6010: 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  * Comparison fun
6020: 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 43 6f  ction */.){.  Co
6030: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20  llSeq *pColl;.. 
6040: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
6050: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43  HashFind(&db->aC
6060: 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e  ollSeq, zName, n
6070: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 43 6f  Name);.  if( pCo
6080: 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f  ll==0 ){.    pCo
6090: 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ll = sqliteMallo
60a0: 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 43  cRaw( sizeof(*pC
60b0: 6f 6c 6c 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31  oll) + nName + 1
60c0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c   );.    if( pCol
60d0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  l==0 ){.      re
60e0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
60f0: 20 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3d    pColl->zName =
6100: 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 5b 31   (char*)&pColl[1
6110: 5d 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 72 65  ];.    pColl->re
6120: 76 65 72 73 65 4f 72 64 65 72 20 3d 20 30 3b 0a  verseOrder = 0;.
6130: 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c      memcpy(pColl
6140: 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ->zName, zName, 
6150: 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 73 71  nName+1);.    sq
6160: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
6170: 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 70  &db->aCollSeq, p
6180: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 4e 61  Coll->zName, nNa
6190: 6d 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a  me, pColl);.  }.
61a0: 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d    pColl->pUser =
61b0: 20 70 55 73 65 72 3b 0a 20 20 70 43 6f 6c 6c 2d   pUser;.  pColl-
61c0: 3e 78 43 6d 70 20 3d 20 78 43 6d 70 3b 0a 20 20  >xCmp = xCmp;.  
61d0: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
61e0: 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20  ./*.** Scan the 
61f0: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65  column type name
6200: 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e   zType (length n
6210: 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e  Type) and return
6220: 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   the.** associat
6230: 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65  ed affinity type
6240: 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
6250: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f  3AffinityType(co
6260: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c  nst char *zType,
6270: 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20 69   int nType){.  i
6280: 6e 74 20 6e 2c 20 69 3b 0a 20 20 73 74 72 75 63  nt n, i;.  struc
6290: 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
62a0: 61 72 20 2a 7a 53 75 62 3b 20 20 2f 2a 20 4b 65  ar *zSub;  /* Ke
62b0: 79 77 6f 72 64 73 20 73 75 62 73 74 72 69 6e 67  ywords substring
62c0: 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a   to search for *
62d0: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 3b 20  /.    int nSub; 
62e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67           /* leng
62f0: 74 68 20 6f 66 20 7a 53 75 62 20 2a 2f 0a 20 20  th of zSub */.  
6300: 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b    char affinity;
6310: 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
6320: 20 74 6f 20 72 65 74 75 72 6e 20 69 66 20 69 74   to return if it
6330: 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 7d 20   matches */.  } 
6340: 73 75 62 73 74 72 69 6e 67 73 5b 5d 20 3d 20 7b  substrings[] = {
6350: 0a 20 20 20 20 7b 22 49 4e 54 22 2c 20 20 33 2c  .    {"INT",  3,
6360: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
6370: 47 45 52 7d 2c 0a 20 20 20 20 7b 22 43 48 41 52  GER},.    {"CHAR
6380: 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46  ", 4, SQLITE_AFF
6390: 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22 43 4c  _TEXT},.    {"CL
63a0: 4f 42 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41  OB", 4, SQLITE_A
63b0: 46 46 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22  FF_TEXT},.    {"
63c0: 54 45 58 54 22 2c 20 34 2c 20 53 51 4c 49 54 45  TEXT", 4, SQLITE
63d0: 5f 41 46 46 5f 54 45 58 54 7d 2c 0a 20 20 20 20  _AFF_TEXT},.    
63e0: 7b 22 42 4c 4f 42 22 2c 20 34 2c 20 53 51 4c 49  {"BLOB", 4, SQLI
63f0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 7d 2c 0a 20 20  TE_AFF_NONE},.  
6400: 7d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  };..  for(i=0; i
6410: 3c 73 69 7a 65 6f 66 28 73 75 62 73 74 72 69 6e  <sizeof(substrin
6420: 67 73 29 2f 73 69 7a 65 6f 66 28 73 75 62 73 74  gs)/sizeof(subst
6430: 72 69 6e 67 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b  rings[0]); i++){
6440: 0a 20 20 20 20 69 6e 74 20 63 31 20 3d 20 73 75  .    int c1 = su
6450: 62 73 74 72 69 6e 67 73 5b 69 5d 2e 7a 53 75 62  bstrings[i].zSub
6460: 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20 63 32 20  [0];.    int c2 
6470: 3d 20 74 6f 6c 6f 77 65 72 28 63 31 29 3b 0a 20  = tolower(c1);. 
6480: 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 6e     int limit = n
6490: 54 79 70 65 20 2d 20 73 75 62 73 74 72 69 6e 67  Type - substring
64a0: 73 5b 69 5d 2e 6e 53 75 62 3b 0a 20 20 20 20 63  s[i].nSub;.    c
64b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73  onst char *z = s
64c0: 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 7a 53 75  ubstrings[i].zSu
64d0: 62 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20  b;.    for(n=0; 
64e0: 6e 3c 3d 6c 69 6d 69 74 3b 20 6e 2b 2b 29 7b 0a  n<=limit; n++){.
64f0: 20 20 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 54        int c = zT
6500: 79 70 65 5b 6e 5d 3b 0a 20 20 20 20 20 20 69 66  ype[n];.      if
6510: 28 20 28 63 3d 3d 63 31 20 7c 7c 20 63 3d 3d 63  ( (c==c1 || c==c
6520: 32 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2).             
6530: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
6540: 4e 49 43 6d 70 28 26 7a 54 79 70 65 5b 6e 5d 2c  NICmp(&zType[n],
6550: 20 7a 2c 20 73 75 62 73 74 72 69 6e 67 73 5b 69   z, substrings[i
6560: 5d 2e 6e 53 75 62 29 20 29 7b 0a 20 20 20 20 20  ].nSub) ){.     
6570: 20 20 20 72 65 74 75 72 6e 20 73 75 62 73 74 72     return substr
6580: 69 6e 67 73 5b 69 5d 2e 61 66 66 69 6e 69 74 79  ings[i].affinity
6590: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
65a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
65b0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
65c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 65 20 75  .}../*.** Come u
65d0: 70 20 77 69 74 68 20 61 20 6e 65 77 20 72 61 6e  p with a new ran
65e0: 64 6f 6d 20 76 61 6c 75 65 20 66 6f 72 20 74 68  dom value for th
65f0: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
6600: 20 20 4d 61 6b 65 20 73 75 72 65 0a 2a 2a 20 74    Make sure.** t
6610: 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20  he new value is 
6620: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
6630: 68 65 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  he old..**.** Th
6640: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
6650: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
6660: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
6670: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
6680: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
6690: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
66a0: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
66b0: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
66c0: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
66d0: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
66e0: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
66f0: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
6700: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
6710: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
6720: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
6730: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
6740: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
6750: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
6760: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
6770: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
6780: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
6790: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
67a0: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
67b0: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
67c0: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
67d0: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
67e0: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
67f0: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
6800: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
6810: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
6820: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
6830: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
6840: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
6850: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
6860: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
6870: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
6880: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
6890: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
68a0: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
68b0: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
68c0: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f  fe enough..*/.vo
68d0: 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  id sqlite3Change
68e0: 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 20 2a 64  Cookie(sqlite *d
68f0: 62 2c 20 56 64 62 65 20 2a 76 29 7b 0a 20 20 69  b, Vdbe *v){.  i
6900: 66 28 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b  f( db->next_cook
6910: 69 65 3d 3d 64 62 2d 3e 61 44 62 5b 30 5d 2e 73  ie==db->aDb[0].s
6920: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 29 7b 0a  chema_cookie ){.
6930: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
6940: 72 20 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r r;.    sqlite3
6950: 52 61 6e 64 6f 6d 6e 65 73 73 28 31 2c 20 26 72  Randomness(1, &r
6960: 29 3b 0a 20 20 20 20 64 62 2d 3e 6e 65 78 74 5f  );.    db->next_
6970: 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 61 44 62  cookie = db->aDb
6980: 5b 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  [0].schema_cooki
6990: 65 20 2b 20 72 20 2b 20 31 3b 0a 20 20 20 20 64  e + r + 1;.    d
69a0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
69b0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
69c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
69d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
69e0: 65 67 65 72 2c 20 64 62 2d 3e 6e 65 78 74 5f 63  eger, db->next_c
69f0: 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 73  ookie, 0);.    s
6a00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6a10: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
6a20: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   0, 0);.  }.}../
6a30: 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65  *.** Measure the
6a40: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   number of chara
6a50: 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20  cters needed to 
6a60: 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  output the given
6a70: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20  .** identifier. 
6a80: 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   The number retu
6a90: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e  rned includes an
6aa0: 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a  y quotes used.**
6ab0: 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e   but does not in
6ac0: 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74  clude the null t
6ad0: 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74  erminator..*/.st
6ae0: 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65  atic int identLe
6af0: 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  ngth(const char 
6b00: 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *z){.  int n;.  
6b10: 69 6e 74 20 6e 65 65 64 51 75 6f 74 65 20 3d 20  int needQuote = 
6b20: 30 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a  0;.  for(n=0; *z
6b30: 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20  ; n++, z++){.   
6b40: 20 69 66 28 20 2a 7a 3d 3d 27 5c 27 27 20 29 7b   if( *z=='\'' ){
6b50: 20 6e 2b 2b 3b 20 6e 65 65 64 51 75 6f 74 65 3d   n++; needQuote=
6b60: 31 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72  1; }.  }.  retur
6b70: 6e 20 6e 20 2b 20 6e 65 65 64 51 75 6f 74 65 2a  n n + needQuote*
6b80: 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  2;.}../*.** Writ
6b90: 65 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20  e an identifier 
6ba0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
6bb0: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
6bc0: 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20  .  Add.** quote 
6bd0: 63 68 61 72 61 63 74 65 72 73 20 61 73 20 6e 65  characters as ne
6be0: 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
6bf0: 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68  void identPut(ch
6c00: 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78  ar *z, int *pIdx
6c10: 2c 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 29 7b  , char *zIdent){
6c20: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65  .  int i, j, nee
6c30: 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70  dQuote;.  i = *p
6c40: 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  Idx;.  for(j=0; 
6c50: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
6c60: 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75  .    if( !isalnu
6c70: 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20  m(zIdent[j]) && 
6c80: 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29  zIdent[j]!='_' )
6c90: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65   break;.  }.  ne
6ca0: 65 64 51 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e  edQuote =  zIden
6cb0: 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67  t[j]!=0 || isdig
6cc0: 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20  it(zIdent[0]).  
6cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ce0: 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72  || sqlite3Keywor
6cf0: 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29  dCode(zIdent, j)
6d00: 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e  !=TK_ID;.  if( n
6d10: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
6d20: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 66 6f 72 28  ] = '\'';.  for(
6d30: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
6d40: 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d  j++){.    z[i++]
6d50: 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20   = zIdent[j];.  
6d60: 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d    if( zIdent[j]=
6d70: 3d 27 5c 27 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d  ='\'' ) z[i++] =
6d80: 20 27 5c 27 27 3b 0a 20 20 7d 0a 20 20 69 66 28   '\'';.  }.  if(
6d90: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69   needQuote ) z[i
6da0: 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7a 5b  ++] = '\'';.  z[
6db0: 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20  i] = 0;.  *pIdx 
6dc0: 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = i;.}../*.** Ge
6dd0: 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20  nerate a CREATE 
6de0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
6df0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
6e00: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62  the given.** tab
6e10: 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68  le.  Memory to h
6e20: 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20  old the text of 
6e30: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
6e40: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
6e50: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
6e60: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
6e70: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
6e80: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
6e90: 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61  tatic char *crea
6ea0: 74 65 54 61 62 6c 65 53 74 6d 74 28 54 61 62 6c  teTableStmt(Tabl
6eb0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  e *p){.  int i, 
6ec0: 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53  k, n;.  char *zS
6ed0: 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65  tmt;.  char *zSe
6ee0: 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64  p, *zSep2, *zEnd
6ef0: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72  ;.  n = 0;.  for
6f00: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
6f10: 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20   i++){.    n += 
6f20: 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 61  identLength(p->a
6f30: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  Col[i].zName);. 
6f40: 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c   }.  n += identL
6f50: 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b  ength(p->zName);
6f60: 0a 20 20 69 66 28 20 6e 3c 34 30 20 29 7b 0a 20  .  if( n<40 ){. 
6f70: 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20     zSep = "";.  
6f80: 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20    zSep2 = ",";. 
6f90: 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20     zEnd = ")";. 
6fa0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70   }else{.    zSep
6fb0: 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a   = "\n  ";.    z
6fc0: 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a  Sep2 = ",\n  ";.
6fd0: 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22      zEnd = "\n)"
6fe0: 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20  ;.  }.  n += 35 
6ff0: 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a  + 6*p->nCol;.  z
7000: 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Stmt = sqliteMal
7010: 6c 6f 63 52 61 77 28 20 6e 20 29 3b 0a 20 20 69  locRaw( n );.  i
7020: 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65  f( zStmt==0 ) re
7030: 74 75 72 6e 20 30 3b 0a 20 20 73 74 72 63 70 79  turn 0;.  strcpy
7040: 28 7a 53 74 6d 74 2c 20 70 2d 3e 69 44 62 3d 3d  (zStmt, p->iDb==
7050: 31 20 3f 20 22 43 52 45 41 54 45 20 54 45 4d 50  1 ? "CREATE TEMP
7060: 20 54 41 42 4c 45 20 22 20 3a 20 22 43 52 45 41   TABLE " : "CREA
7070: 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b  TE TABLE ");.  k
7080: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29   = strlen(zStmt)
7090: 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74  ;.  identPut(zSt
70a0: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65  mt, &k, p->zName
70b0: 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20  );.  zStmt[k++] 
70c0: 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 69 3d 30  = '(';.  for(i=0
70d0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
70e0: 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a  ){.    strcpy(&z
70f0: 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a  Stmt[k], zSep);.
7100: 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28      k += strlen(
7110: 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20  &zStmt[k]);.    
7120: 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20  zSep = zSep2;.  
7130: 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74    identPut(zStmt
7140: 2c 20 26 6b 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d  , &k, p->aCol[i]
7150: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  .zName);.  }.  s
7160: 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c  trcpy(&zStmt[k],
7170: 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e   zEnd);.  return
7180: 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zStmt;.}../*.**
7190: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
71a0: 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72   called to repor
71b0: 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20  t the final ")" 
71c0: 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a  that terminates.
71d0: 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ** a CREATE TABL
71e0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
71f0: 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72  ** The table str
7200: 75 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65  ucture that othe
7210: 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65  r action routine
7220: 73 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c  s have been buil
7230: 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64  ding.** is added
7240: 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   to the internal
7250: 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73   hash tables, as
7260: 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73  suming no errors
7270: 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65   have.** occurre
7280: 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72  d..**.** An entr
7290: 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  y for the table 
72a0: 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d  is made in the m
72b0: 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64  aster table on d
72c0: 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74  isk, unless.** t
72d0: 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61  his is a tempora
72e0: 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e  ry table or db->
72f0: 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57  init.busy==1.  W
7300: 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  hen db->init.bus
7310: 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73  y==1.** it means
7320: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
7330: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
7340: 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20  r table because 
7350: 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65  we just.** conne
7360: 63 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  cted to the data
7370: 62 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20  base or because 
7380: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
7390: 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72  r table has.** r
73a0: 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 2c  ecently changes,
73b0: 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f   so the entry fo
73c0: 72 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72  r this table alr
73d0: 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a  eady exists in.*
73e0: 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  * the sqlite_mas
73f0: 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64  ter table.  We d
7400: 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72  o not want to cr
7410: 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a  eate it again..*
7420: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c  *.** If the pSel
7430: 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ect argument is 
7440: 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61  not NULL, it mea
7450: 6e 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75  ns that this rou
7460: 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c  tine.** was call
7470: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74  ed to create a t
7480: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66  able generated f
7490: 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54  rom a .** "CREAT
74a0: 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53  E TABLE ... AS S
74b0: 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65  ELECT ..." state
74c0: 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d  ment.  The colum
74d0: 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  n names of.** th
74e0: 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c  e new table will
74f0: 20 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c   match the resul
7500: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
7510: 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ECT..*/.void sql
7520: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 50 61 72  ite3EndTable(Par
7530: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
7540: 6e 20 2a 70 45 6e 64 2c 20 53 65 6c 65 63 74 20  n *pEnd, Select 
7550: 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62  *pSelect){.  Tab
7560: 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 20  le *p;.  sqlite 
7570: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
7580: 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d 3d  ;..  if( (pEnd==
7590: 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 29  0 && pSelect==0)
75a0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
75b0: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
75c0: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
75d0: 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  rn;.  p = pParse
75e0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
75f0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
7600: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74  ;..  /* If the t
7610: 61 62 6c 65 20 69 73 20 67 65 6e 65 72 61 74 65  able is generate
7620: 64 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 2c  d from a SELECT,
7630: 20 74 68 65 6e 20 63 6f 6e 73 74 72 75 63 74 20   then construct 
7640: 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 20 6f 66  the.  ** list of
7650: 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65   columns and the
7660: 20 74 65 78 74 20 6f 66 20 74 68 65 20 74 61 62   text of the tab
7670: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
7680: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 54 61  Select ){.    Ta
7690: 62 6c 65 20 2a 70 53 65 6c 54 61 62 20 3d 20 73  ble *pSelTab = s
76a0: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
76b0: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
76c0: 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  0, pSelect);.   
76d0: 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20   if( pSelTab==0 
76e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 61 73  ) return;.    as
76f0: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30  sert( p->aCol==0
7700: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 20   );.    p->nCol 
7710: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
7720: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70  .    p->aCol = p
7730: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
7740: 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
7750: 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  = 0;.    pSelTab
7760: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
7770: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
7780: 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a  le(0, pSelTab);.
7790: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
77a0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
77b0: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
77c0: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
77d0: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
77e0: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
77f0: 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70   or "sqlite_temp
7800: 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f  _master" table o
7810: 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a  n the disk..  **
7820: 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65   So do not write
7830: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61   to the disk aga
7840: 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
7850: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
7860: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74  r.  ** for the t
7870: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62  able from the db
7880: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66  ->init.newTnum f
7890: 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65  ield.  (The page
78a0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f   number.  ** sho
78b0: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75  uld have been pu
78c0: 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73  t there by the s
78d0: 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74  qliteOpenCb rout
78e0: 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ine.).  */.  if(
78f0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
7900: 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20  {.    p->tnum = 
7910: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
7920: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
7930: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c  ot initializing,
7940: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72   then create a r
7950: 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65  ecord for the ne
7960: 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20  w table.  ** in 
7970: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
7980: 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64  R table of the d
7990: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72 65  atabase.  The re
79a0: 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  cord number.  **
79b0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
79c0: 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64 20  le entry should 
79d0: 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74 68  already be on th
79e0: 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  e stack..  **.  
79f0: 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
7a00: 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c  TEMPORARY table,
7a10: 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79   write the entry
7a20: 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69   into the auxili
7a30: 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  ary.  ** file in
7a40: 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68  stead of into th
7a50: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
7a60: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
7a70: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
7a80: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
7a90: 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20    Vdbe *v;..    
7aa0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
7ab0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
7ac0: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
7ad0: 6e 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53  n;.    if( p->pS
7ae0: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
7af0: 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74    /* A regular t
7b00: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  able */.      sq
7b10: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
7b20: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20  OP_CreateTable, 
7b30: 30 2c 20 70 2d 3e 69 44 62 2c 20 28 63 68 61 72  0, p->iDb, (char
7b40: 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50  *)&p->tnum, P3_P
7b50: 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d 65 6c  OINTER);.    }el
7b60: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76  se{.      /* A v
7b70: 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  iew */.      sql
7b80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
7b90: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
7ba0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  0);.    }.    p-
7bb0: 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 73  >tnum = 0;.    s
7bc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
7bd0: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30  v, OP_Pull, 1, 0
7be0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7bf0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69  beOp3(v, OP_Stri
7c00: 6e 67 2c 20 30 2c 20 30 2c 20 70 2d 3e 70 53 65  ng, 0, 0, p->pSe
7c10: 6c 65 63 74 3d 3d 30 3f 22 74 61 62 6c 65 22 3a  lect==0?"table":
7c20: 22 76 69 65 77 22 2c 20 50 33 5f 53 54 41 54 49  "view", P3_STATI
7c30: 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  C);.    sqlite3V
7c40: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72  dbeOp3(v, OP_Str
7c50: 69 6e 67 2c 20 30 2c 20 30 2c 20 70 2d 3e 7a 4e  ing, 0, 0, p->zN
7c60: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ame, 0);.    sql
7c70: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
7c80: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20  P_String, 0, 0, 
7c90: 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  p->zName, 0);.  
7ca0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7cb0: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 34 2c  Op(v, OP_Dup, 4,
7cc0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
7cd0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7ce0: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
7cf0: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
7d00: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20  {.      char *z 
7d10: 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d  = createTableStm
7d20: 74 28 70 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  t(p);.      n = 
7d30: 7a 20 3f 20 73 74 72 6c 65 6e 28 7a 29 20 3a 20  z ? strlen(z) : 
7d40: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
7d50: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
7d60: 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  -1, z, n);.     
7d70: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a   sqliteFree(z);.
7d80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7d90: 20 61 73 73 65 72 74 28 20 70 45 6e 64 21 3d 30   assert( pEnd!=0
7da0: 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 41 64   );.      n = Ad
7db0: 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64  dr(pEnd->z) - Ad
7dc0: 64 72 28 70 50 61 72 73 65 2d 3e 73 46 69 72 73  dr(pParse->sFirs
7dd0: 74 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a 20  tToken.z) + 1;. 
7de0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7df0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
7e00: 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54 6f  pParse->sFirstTo
7e10: 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d  ken.z, n);.    }
7e20: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7e30: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
7e40: 63 6f 72 64 2c 20 35 2c 20 30 2c 20 22 74 74 74  cord, 5, 0, "ttt
7e50: 69 74 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  it", P3_STATIC);
7e60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7e70: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49  AddOp(v, OP_PutI
7e80: 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20  ntKey, 0, 0);.  
7e90: 20 20 69 66 28 20 21 70 2d 3e 69 44 62 20 29 7b    if( !p->iDb ){
7ea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
7eb0: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
7ec0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
7ed0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
7ee0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
7ef0: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  ;.    if( pSelec
7f00: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
7f10: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
7f20: 50 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e 69 44  P_Integer, p->iD
7f30: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  b, 0);.      sql
7f40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
7f50: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31   OP_OpenWrite, 1
7f60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
7f70: 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20  se->nTab = 2;.  
7f80: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
7f90: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
7fa0: 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c  t, SRT_Table, 1,
7fb0: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
7fc0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
7fd0: 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  ndWriteOperation
7fe0: 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20  (pParse);.  }.. 
7ff0: 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c   /* Add the tabl
8000: 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e to the in-memo
8010: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
8020: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
8030: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
8040: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30  arse->explain==0
8050: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
8060: 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  ==0 ){.    Table
8070: 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65 79   *pOld;.    FKey
8080: 20 2a 70 46 4b 65 79 3b 0a 20 20 20 20 70 4f 6c   *pFKey;.    pOl
8090: 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  d = sqlite3HashI
80a0: 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70  nsert(&db->aDb[p
80b0: 2d 3e 69 44 62 5d 2e 74 62 6c 48 61 73 68 2c 20  ->iDb].tblHash, 
80c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
80d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
80e0: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d  zName, strlen(p-
80f0: 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20  >zName)+1, p);. 
8100: 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20     if( pOld ){. 
8110: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
8120: 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  pOld );  /* Mall
8130: 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
8140: 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49  led inside HashI
8150: 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20  nsert() */.     
8160: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
8170: 20 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e     for(pFKey=p->
8180: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46  pFKey; pFKey; pF
8190: 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74  Key=pFKey->pNext
81a0: 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74  From){.      int
81b0: 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46   nTo = strlen(pF
81c0: 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20  Key->zTo) + 1;. 
81d0: 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78       pFKey->pNex
81e0: 74 54 6f 20 3d 20 73 71 6c 69 74 65 33 48 61 73  tTo = sqlite3Has
81f0: 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70  hFind(&db->aDb[p
8200: 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 20 70 46  ->iDb].aFKey, pF
8210: 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a  Key->zTo, nTo);.
8220: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73        sqlite3Has
8230: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
8240: 5b 70 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 20  [p->iDb].aFKey, 
8250: 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c  pFKey->zTo, nTo,
8260: 20 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20   pFKey);.    }. 
8270: 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
8280: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
8290: 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20  ->nTable++;.    
82a0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
82b0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
82c0: 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s;.  }.}../*.** 
82d0: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
82e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e   this routine in
82f0: 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
8300: 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76   a new VIEW.*/.v
8310: 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
8320: 65 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a  eView(.  Parse *
8330: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54  pParse,     /* T
8340: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
8350: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
8360: 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68  Begin,     /* Th
8370: 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
8380: 68 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73  hat begins the s
8390: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
83a0: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20  ken *pName,     
83b0: 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68   /* The token th
83c0: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  at holds the nam
83d0: 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f  e of the view */
83e0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
83f0: 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43  ct,   /* A SELEC
8400: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
8410: 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
8420: 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69   new view */.  i
8430: 6e 74 20 69 73 54 65 6d 70 20 20 20 20 20 20 20  nt isTemp       
8440: 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20    /* TRUE for a 
8450: 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a  TEMPORARY view *
8460: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
8470: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73  .  int n;.  cons
8480: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b  t char *z;.  Tok
8490: 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78  en sEnd;.  DbFix
84a0: 65 72 20 73 46 69 78 3b 0a 0a 20 20 73 71 6c 69  er sFix;..  sqli
84b0: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
84c0: 61 72 73 65 2c 20 70 42 65 67 69 6e 2c 20 70 4e  arse, pBegin, pN
84d0: 61 6d 65 2c 20 69 73 54 65 6d 70 2c 20 31 29 3b  ame, isTemp, 1);
84e0: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
84f0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
8500: 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
8510: 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  nErr ){.    sqli
8520: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
8530: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
8540: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
8550: 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
8560: 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 70 2d  sFix, pParse, p-
8570: 3e 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e  >iDb, "view", pN
8580: 61 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69  ame).    && sqli
8590: 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46  te3FixSelect(&sF
85a0: 69 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29  ix, pSelect).  )
85b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
85c0: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
85d0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
85e0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61    }..  /* Make a
85f0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74   copy of the ent
8600: 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ire SELECT state
8610: 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
8620: 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a  s the view..  **
8630: 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65   This will force
8640: 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f   all the Expr.to
8650: 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20  ken.z values to 
8660: 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  be dynamically. 
8670: 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61   ** allocated ra
8680: 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20  ther than point 
8690: 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  to the input str
86a0: 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e  ing - which mean
86b0: 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79  s that.  ** they
86c0: 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66   will persist af
86d0: 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ter the current 
86e0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63  sqlite3_exec() c
86f0: 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a  all returns..  *
8700: 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d  /.  p->pSelect =
8710: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
8720: 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  p(pSelect);.  sq
8730: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
8740: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66  e(pSelect);.  if
8750: 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69  ( !pParse->db->i
8760: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
8770: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
8780: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
8790: 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , p);.  }..  /* 
87a0: 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f  Locate the end o
87b0: 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45  f the CREATE VIE
87c0: 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61  W statement.  Ma
87d0: 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f  ke sEnd point to
87e0: 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20  .  ** the end.. 
87f0: 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61   */.  sEnd = pPa
8800: 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b  rse->sLastToken;
8810: 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d  .  if( sEnd.z[0]
8820: 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d  !=0 && sEnd.z[0]
8830: 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e  !=';' ){.    sEn
8840: 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20  d.z += sEnd.n;. 
8850: 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b   }.  sEnd.n = 0;
8860: 0a 20 20 6e 20 3d 20 28 28 69 6e 74 29 73 45 6e  .  n = ((int)sEn
8870: 64 2e 7a 29 20 2d 20 28 69 6e 74 29 70 42 65 67  d.z) - (int)pBeg
8880: 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 70 42 65  in->z;.  z = pBe
8890: 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28  gin->z;.  while(
88a0: 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d   n>0 && (z[n-1]=
88b0: 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28  =';' || isspace(
88c0: 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b  z[n-1])) ){ n--;
88d0: 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a   }.  sEnd.z = &z
88e0: 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20  [n-1];.  sEnd.n 
88f0: 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73  = 1;..  /* Use s
8900: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
8910: 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77   to add the view
8920: 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   to the SQLITE_M
8930: 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20  ASTER table */. 
8940: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
8950: 28 70 50 61 72 73 65 2c 20 26 73 45 6e 64 2c 20  (pParse, &sEnd, 
8960: 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  0);.  return;.}.
8970: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  ./*.** The Table
8980: 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c   structure pTabl
8990: 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49  e is really a VI
89a0: 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  EW.  Fill in the
89b0: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
89c0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
89d0: 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62  view in the pTab
89e0: 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  le structure.  R
89f0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
8a00: 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  .** of errors.  
8a10: 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73  If an error is s
8a20: 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72  een leave an err
8a30: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
8a40: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
8a50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65  /.int sqlite3Vie
8a60: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
8a70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
8a80: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
8a90: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
8aa0: 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  t;.  Select *pSe
8ab0: 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c  l;.  Table *pSel
8ac0: 54 61 62 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20  Tab;.  int nErr 
8ad0: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
8ae0: 70 54 61 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20  pTable );..  /* 
8af0: 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20  A positive nCol 
8b00: 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e  means the column
8b10: 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73  s names for this
8b20: 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61   view are.  ** a
8b30: 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20  lready known..  
8b40: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
8b50: 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e  >nCol>0 ) return
8b60: 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61   0;..  /* A nega
8b70: 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73  tive nCol is a s
8b80: 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65  pecial marker me
8b90: 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72  aning that we ar
8ba0: 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a  e currently.  **
8bb0: 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75   trying to compu
8bc0: 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  te the column na
8bd0: 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65  mes.  If we ente
8be0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  r this routine w
8bf0: 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74  ith.  ** a negat
8c00: 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61  ive nCol, it mea
8c10: 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76  ns two or more v
8c20: 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70  iews form a loop
8c30: 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a  , like this:.  *
8c40: 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  *.  **     CREAT
8c50: 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45  E VIEW one AS SE
8c60: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b  LECT * FROM two;
8c70: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
8c80: 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c   VIEW two AS SEL
8c90: 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a  ECT * FROM one;.
8ca0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
8cb0: 6c 79 2c 20 74 68 69 73 20 65 72 72 6f 72 20 69  ly, this error i
8cc0: 73 20 63 61 75 67 68 74 20 70 72 65 76 69 6f 75  s caught previou
8cd0: 73 6c 79 20 61 6e 64 20 73 6f 20 74 68 65 20 66  sly and so the f
8ce0: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a 20 20  ollowing test.  
8cf0: 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  ** should always
8d00: 20 66 61 69 6c 2e 20 20 42 75 74 20 77 65 20 77   fail.  But we w
8d10: 69 6c 6c 20 6c 65 61 76 65 20 69 74 20 69 6e 20  ill leave it in 
8d20: 70 6c 61 63 65 20 6a 75 73 74 20 74 6f 20 62 65  place just to be
8d30: 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   safe..  */.  if
8d40: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30  ( pTable->nCol<0
8d50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
8d60: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8d70: 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63  "view %s is circ
8d80: 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c  ularly defined",
8d90: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
8da0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
8db0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67   }..  /* If we g
8dc0: 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
8dd0: 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f  means we need to
8de0: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62   compute the tab
8df0: 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20  le names..  */. 
8e00: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
8e10: 3e 70 53 65 6c 65 63 74 20 29 3b 20 2f 2a 20 49  >pSelect ); /* I
8e20: 66 20 6e 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20  f nCol==0, then 
8e30: 70 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61  pTable must be a
8e40: 20 56 49 45 57 20 2a 2f 0a 20 20 70 53 65 6c 20   VIEW */.  pSel 
8e50: 3d 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  = pTable->pSelec
8e60: 74 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68  t;..  /* Note th
8e70: 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  at the call to s
8e80: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
8e90: 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65  fSelect() will e
8ea0: 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22  xpand any.  ** "
8eb0: 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  *" elements in t
8ec0: 68 69 73 20 6c 69 73 74 2e 20 20 42 75 74 20 77  his list.  But w
8ed0: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 72  e will need to r
8ee0: 65 73 74 6f 72 65 20 74 68 65 20 6c 69 73 74 0a  estore the list.
8ef0: 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74 73    ** back to its
8f00: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67   original config
8f10: 75 72 61 74 69 6f 6e 20 61 66 74 65 72 77 61 72  uration afterwar
8f20: 64 73 2c 20 73 6f 20 77 65 20 73 61 76 65 20 61  ds, so we save a
8f30: 20 63 6f 70 79 20 6f 66 0a 20 20 2a 2a 20 74 68   copy of.  ** th
8f40: 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 20 70 45  e original in pE
8f50: 4c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 45 4c  List..  */.  pEL
8f60: 69 73 74 20 3d 20 70 53 65 6c 2d 3e 70 45 4c 69  ist = pSel->pELi
8f70: 73 74 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69  st;.  pSel->pELi
8f80: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
8f90: 4c 69 73 74 44 75 70 28 70 45 4c 69 73 74 29 3b  ListDup(pEList);
8fa0: 0a 20 20 69 66 28 20 70 53 65 6c 2d 3e 70 45 4c  .  if( pSel->pEL
8fb0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 53  ist==0 ){.    pS
8fc0: 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c  el->pEList = pEL
8fd0: 69 73 74 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ist;.    return 
8fe0: 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61  1;  /* Malloc fa
8ff0: 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 54  iled */.  }.  pT
9000: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b  able->nCol = -1;
9010: 0a 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c  .  pSelTab = sql
9020: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
9030: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c  elect(pParse, 0,
9040: 20 70 53 65 6c 29 3b 0a 20 20 69 66 28 20 70 53   pSel);.  if( pS
9050: 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73  elTab ){.    ass
9060: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f  ert( pTable->aCo
9070: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62  l==0 );.    pTab
9080: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54  le->nCol = pSelT
9090: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 54  ab->nCol;.    pT
90a0: 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65  able->aCol = pSe
90b0: 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
90c0: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
90d0: 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  0;.    pSelTab->
90e0: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71  aCol = 0;.    sq
90f0: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
9100: 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  (0, pSelTab);.  
9110: 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28    DbSetProperty(
9120: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
9130: 6c 65 2d 3e 69 44 62 2c 20 44 42 5f 55 6e 72 65  le->iDb, DB_Unre
9140: 73 65 74 56 69 65 77 73 29 3b 0a 20 20 7d 65 6c  setViews);.  }el
9150: 73 65 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e  se{.    pTable->
9160: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 6e 45  nCol = 0;.    nE
9170: 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rr++;.  }.  sqli
9180: 74 65 33 53 65 6c 65 63 74 55 6e 62 69 6e 64 28  te3SelectUnbind(
9190: 70 53 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  pSel);.  sqlite3
91a0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
91b0: 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sel->pEList);.  
91c0: 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70  pSel->pEList = p
91d0: 45 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e 20  EList;.  return 
91e0: 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  nErr;  .}../*.**
91f0: 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
9200: 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68 65  n names from the
9210: 20 56 49 45 57 20 70 54 61 62 6c 65 2e 0a 2a 2a   VIEW pTable..**
9220: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9230: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
9240: 76 65 72 20 61 6e 79 20 6f 74 68 65 72 20 74 61  ver any other ta
9250: 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 6d  ble or view is m
9260: 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 54 68 65 20  odified..** The 
9270: 76 69 65 77 20 70 61 73 73 65 64 20 69 6e 74 6f  view passed into
9280: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
9290: 67 68 74 20 64 65 70 65 6e 64 20 64 69 72 65 63  ght depend direc
92a0: 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c  tly or indirectl
92b0: 79 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 64 69  y.** on the modi
92c0: 66 69 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  fied or deleted 
92d0: 74 61 62 6c 65 20 73 6f 20 77 65 20 6e 65 65 64  table so we need
92e0: 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 6f 6c   to clear the ol
92f0: 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d 65  d column.** name
9300: 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 77  s so that they w
9310: 69 6c 6c 20 62 65 20 72 65 63 6f 6d 70 75 74 65  ill be recompute
9320: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
9330: 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
9340: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62  tColumnNames(Tab
9350: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69  le *pTable){.  i
9360: 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  nt i;.  Column *
9370: 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  pCol;.  assert( 
9380: 70 54 61 62 6c 65 21 3d 30 20 26 26 20 70 54 61  pTable!=0 && pTa
9390: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20  ble->pSelect!=0 
93a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  );.  for(i=0, pC
93b0: 6f 6c 3d 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b  ol=pTable->aCol;
93c0: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
93d0: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
93e0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43     sqliteFree(pC
93f0: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
9400: 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d  sqliteFree(pCol-
9410: 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c  >zDflt);.    sql
9420: 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54  iteFree(pCol->zT
9430: 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ype);.  }.  sqli
9440: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
9450: 43 6f 6c 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Col);.  pTable->
9460: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  aCol = 0;.  pTab
9470: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a  le->nCol = 0;.}.
9480: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
9490: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72   column names fr
94a0: 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e  om every VIEW in
94b0: 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a   database idx..*
94c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
94d0: 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
94e0: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 69 6e 74  (sqlite *db, int
94f0: 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65   idx){.  HashEle
9500: 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21 44 62 48  m *i;.  if( !DbH
9510: 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  asProperty(db, i
9520: 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
9530: 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ews) ) return;. 
9540: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
9550: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b  hFirst(&db->aDb[
9560: 69 64 78 5d 2e 74 62 6c 48 61 73 68 29 3b 20 69  idx].tblHash); i
9570: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
9580: 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c  xt(i)){.    Tabl
9590: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
95a0: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
95b0: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
95c0: 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
95d0: 74 65 56 69 65 77 52 65 73 65 74 43 6f 6c 75 6d  teViewResetColum
95e0: 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20  nNames(pTab);.  
95f0: 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61    }.  }.  DbClea
9600: 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  rProperty(db, id
9610: 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
9620: 77 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  ws);.}../*.** Gi
9630: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f  ven a token, loo
9640: 6b 20 75 70 20 61 20 74 61 62 6c 65 20 77 69 74  k up a table wit
9650: 68 20 74 68 61 74 20 6e 61 6d 65 2e 20 20 49 66  h that name.  If
9660: 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 65 61 76   not found, leav
9670: 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 66 6f  e.** an error fo
9680: 72 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  r the parser to 
9690: 66 69 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20  find and return 
96a0: 4e 55 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  NULL..*/.Table *
96b0: 73 71 6c 69 74 65 33 54 61 62 6c 65 46 72 6f 6d  sqlite3TableFrom
96c0: 54 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61  Token(Parse *pPa
96d0: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  rse, Token *pTok
96e0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
96f0: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
9700: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
9710: 65 33 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  e3TableNameFromT
9720: 6f 6b 65 6e 28 70 54 6f 6b 29 3b 0a 20 20 69 66  oken(pTok);.  if
9730: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
9740: 75 72 6e 20 30 3b 0a 20 20 70 54 61 62 20 3d 20  urn 0;.  pTab = 
9750: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
9760: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
9770: 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  me, 0);.  sqlite
9780: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69  Free(zName);.  i
9790: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
97a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
97b0: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
97c0: 63 68 20 74 61 62 6c 65 3a 20 25 54 22 2c 20 70  ch table: %T", p
97d0: 54 6f 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Tok);.  }.  retu
97e0: 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
97f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9800: 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74  s called to do t
9810: 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f  he work of a DRO
9820: 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  P TABLE statemen
9830: 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74  t..** pName is t
9840: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
9850: 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70  able to be dropp
9860: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
9870: 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72  te3DropTable(Par
9880: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
9890: 6e 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73  n *pName, int is
98a0: 56 69 65 77 29 7b 0a 20 20 54 61 62 6c 65 20 2a  View){.  Table *
98b0: 70 54 61 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a  pTable;.  Vdbe *
98c0: 76 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20  v;.  int base;. 
98d0: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
98e0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
98f0: 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  iDb;..  if( pPar
9900: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
9910: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
9920: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54  d ) return;.  pT
9930: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 54 61  able = sqlite3Ta
9940: 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  bleFromToken(pPa
9950: 72 73 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  rse, pName);.  i
9960: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72  f( pTable==0 ) r
9970: 65 74 75 72 6e 3b 0a 20 20 69 44 62 20 3d 20 70  eturn;.  iDb = p
9980: 54 61 62 6c 65 2d 3e 69 44 62 3b 0a 20 20 61 73  Table->iDb;.  as
9990: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
99a0: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 23  iDb<db->nDb );.#
99b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
99c0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
99d0: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
99e0: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
99f0: 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
9a00: 5f 54 41 42 4c 45 28 70 54 61 62 6c 65 2d 3e 69  _TABLE(pTable->i
9a10: 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  Db);.    const c
9a20: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
9a30: 44 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62 5d 2e  Db[pTable->iDb].
9a40: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73  zName;.    if( s
9a50: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
9a60: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
9a70: 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
9a80: 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 72 65 74  zDb)){.      ret
9a90: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
9aa0: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
9ab0: 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b     if( iDb==1 ){
9ac0: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
9ad0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
9ae0: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
9af0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
9b00: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
9b10: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
9b20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
9b30: 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  ( iDb==1 ){.    
9b40: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
9b50: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
9b60: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
9b70: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
9b80: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
9b90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9ba0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
9bb0: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
9bc0: 20 63 6f 64 65 2c 20 70 54 61 62 6c 65 2d 3e 7a   code, pTable->z
9bd0: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
9be0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
9bf0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
9c00: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
9c10: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
9c20: 45 54 45 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  ETE, pTable->zNa
9c30: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
9c40: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
9c50: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
9c60: 69 66 28 20 70 54 61 62 6c 65 2d 3e 72 65 61 64  if( pTable->read
9c70: 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  Only ){.    sqli
9c80: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
9c90: 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
9ca0: 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  y not be dropped
9cb0: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
9cc0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
9cd0: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
9ce0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 56  n;.  }.  if( isV
9cf0: 69 65 77 20 26 26 20 70 54 61 62 6c 65 2d 3e 70  iew && pTable->p
9d00: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
9d10: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9d20: 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
9d30: 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65  OP TABLE to dele
9d40: 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54  te table %s", pT
9d50: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
9d60: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
9d70: 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70  if( !isView && p
9d80: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29  Table->pSelect )
9d90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
9da0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
9db0: 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20  se DROP VIEW to 
9dc0: 64 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c  delete view %s",
9dd0: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
9de0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
9df0: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
9e00: 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
9e10: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
9e20: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20  e master table. 
9e30: 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a   ** on disk..  *
9e40: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
9e50: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
9e60: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
9e70: 74 61 74 69 63 20 56 64 62 65 4f 70 4c 69 73 74  tatic VdbeOpList
9e80: 20 64 72 6f 70 54 61 62 6c 65 5b 5d 20 3d 20 7b   dropTable[] = {
9e90: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69  .      { OP_Rewi
9ea0: 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28  nd,     0, ADDR(
9eb0: 31 30 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b  10), 0},.      {
9ec0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20   OP_String,     
9ed0: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
9ee0: 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 1 */.      {
9ef0: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20   OP_MemStore,   
9f00: 31 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 1,        0},
9f10: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c  .      { OP_MemL
9f20: 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20  oad,    1, 0,   
9f30: 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f       0}, /* 3 */
9f40: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
9f50: 6d 6e 2c 20 20 20 20 20 30 2c 20 32 2c 20 20 20  mn,     0, 2,   
9f60: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
9f70: 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20   OP_Ne,         
9f80: 30 2c 20 41 44 44 52 28 39 29 2c 20 20 30 7d 2c  0, ADDR(9),  0},
9f90: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65  .      { OP_Dele
9fa0: 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  te,     0, 0,   
9fb0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
9fc0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20   OP_Rewind,     
9fd0: 30 2c 20 41 44 44 52 28 31 30 29 2c 20 30 7d 2c  0, ADDR(10), 0},
9fe0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f  .      { OP_Goto
9ff0: 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28  ,       0, ADDR(
a000: 33 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b  3),  0},.      {
a010: 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20   OP_Next,       
a020: 30 2c 20 41 44 44 52 28 33 29 2c 20 20 30 7d 2c  0, ADDR(3),  0},
a030: 20 2f 2a 20 39 20 2a 2f 0a 20 20 20 20 7d 3b 0a   /* 9 */.    };.
a040: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
a050: 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54  .    Trigger *pT
a060: 72 69 67 67 65 72 3b 0a 20 20 20 20 73 71 6c 69  rigger;.    sqli
a070: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
a080: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
a090: 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a  , pTable->iDb);.
a0a0: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  .    /* Drop all
a0b0: 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69   triggers associ
a0c0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
a0d0: 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
a0e0: 64 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65  d */.    pTrigge
a0f0: 72 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54 72 69  r = pTable->pTri
a100: 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28  gger;.    while(
a110: 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
a120: 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
a130: 67 65 72 2d 3e 69 44 62 3d 3d 70 54 61 62 6c 65  ger->iDb==pTable
a140: 2d 3e 69 44 62 20 7c 7c 20 70 54 72 69 67 67 65  ->iDb || pTrigge
a150: 72 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20  r->iDb==1 );.   
a160: 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72     sqlite3DropTr
a170: 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c  iggerPtr(pParse,
a180: 20 70 54 72 69 67 67 65 72 2c 20 31 29 3b 0a 20   pTrigger, 1);. 
a190: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
a1a0: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
a1b0: 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
a1c0: 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a  Trigger->pNext;.
a1d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a1e0: 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20       pTrigger = 
a1f0: 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72  pTable->pTrigger
a200: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a210: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  .    /* Drop all
a220: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 65   SQLITE_MASTER e
a230: 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65  ntries that refe
a240: 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a  r to the table *
a250: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  /.    sqlite3Ope
a260: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20  nMasterTable(v, 
a270: 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 20 20  pTable->iDb);.  
a280: 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33    base = sqlite3
a290: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
a2a0: 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70 54   ArraySize(dropT
a2b0: 61 62 6c 65 29 2c 20 64 72 6f 70 54 61 62 6c 65  able), dropTable
a2c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a2d0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61  beChangeP3(v, ba
a2e0: 73 65 2b 31 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  se+1, pTable->zN
a2f0: 61 6d 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  ame, 0);..    /*
a300: 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45   Drop all SQLITE
a310: 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20 65 6e 74  _TEMP_MASTER ent
a320: 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20  ries that refer 
a330: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  to the table */.
a340: 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e      if( pTable->
a350: 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb!=1 ){.      
a360: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
a370: 72 54 61 62 6c 65 28 76 2c 20 31 29 3b 0a 20 20  rTable(v, 1);.  
a380: 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74      base = sqlit
a390: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
a3a0: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f  v, ArraySize(dro
a3b0: 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54 61 62  pTable), dropTab
a3c0: 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  le);.      sqlit
a3d0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
a3e0: 2c 20 62 61 73 65 2b 31 2c 20 70 54 61 62 6c 65  , base+1, pTable
a3f0: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
a400: 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 54 61 62   }..    if( pTab
a410: 6c 65 2d 3e 69 44 62 3d 3d 30 20 29 7b 0a 20 20  le->iDb==0 ){.  
a420: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
a430: 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a  eCookie(db, v);.
a440: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
a450: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a460: 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20  _Close, 0, 0);. 
a470: 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29     if( !isView )
a480: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
a490: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
a4a0: 65 73 74 72 6f 79 2c 20 70 54 61 62 6c 65 2d 3e  estroy, pTable->
a4b0: 74 6e 75 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 44  tnum, pTable->iD
a4c0: 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49  b);.      for(pI
a4d0: 64 78 3d 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  dx=pTable->pInde
a4e0: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
a4f0: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
a500: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a510: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72  ddOp(v, OP_Destr
a520: 6f 79 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  oy, pIdx->tnum, 
a530: 70 49 64 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20  pIdx->iDb);.    
a540: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
a550: 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65  lite3EndWriteOpe
a560: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a  ration(pParse);.
a570: 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
a580: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   the in-memory d
a590: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
a5a0: 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  e table..  **.  
a5b0: 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 69 66  ** Exception: if
a5c0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
a5d0: 6e 74 20 62 65 67 61 6e 20 77 69 74 68 20 74 68  nt began with th
a5e0: 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72  e EXPLAIN keywor
a5f0: 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6e 6f 20  d,.  ** then no 
a600: 63 68 61 6e 67 65 73 20 73 68 6f 75 6c 64 20 62  changes should b
a610: 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69  e made..  */.  i
a620: 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  f( !pParse->expl
a630: 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ain ){.    sqlit
a640: 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  eUnlinkAndDelete
a650: 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 6c 65  Table(db, pTable
a660: 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  );.    db->flags
a670: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
a680: 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 20 20  nChanges;.  }.  
a690: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
a6a0: 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a  ll(db, iDb);.}..
a6b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
a6c0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
a6d0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72  create a new for
a6e0: 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  eign key on the 
a6f0: 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74  table.** current
a700: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
a710: 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c  ction.  pFromCol
a720: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
a730: 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  h columns.** in 
a740: 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
a750: 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  e point to the f
a760: 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20  oreign key.  If 
a770: 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e  pFromCol==0 then
a780: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20  .** connect the 
a790: 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20  key to the last 
a7a0: 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e  column inserted.
a7b0: 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d    pTo is the nam
a7c0: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  e of.** the tabl
a7d0: 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20  e referred to.  
a7e0: 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74  pToCol is a list
a7f0: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
a800: 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74  e other.** pTo t
a810: 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f  able that the fo
a820: 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73  reign key points
a830: 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74   to.  flags cont
a840: 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f  ains all.** info
a850: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
a860: 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  e conflict resol
a870: 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
a880: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e   specified.** in
a890: 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20   the ON DELETE, 
a8a0: 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e  ON UPDATE and ON
a8b0: 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e   INSERT clauses.
a8c0: 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73  .**.** An FKey s
a8d0: 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
a8e0: 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f  ted and added to
a8f0: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
a900: 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f  ntly.** under co
a910: 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
a920: 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
a930: 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65 20  ble field.  The 
a940: 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e  new FKey.** is n
a950: 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64  ot linked into d
a960: 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69 73  b->aFKey at this
a970: 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64 6f   point - that do
a980: 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a  es not happen.**
a990: 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 45 6e   until sqlite3En
a9a0: 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  dTable()..**.** 
a9b0: 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  The foreign key 
a9c0: 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44  is set for IMMED
a9d0: 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e  IATE processing.
a9e0: 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63    A subsequent c
a9f0: 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  all.** to sqlite
aa00: 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
aa10: 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  () might change 
aa20: 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44  this to DEFERRED
aa30: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
aa40: 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65  3CreateForeignKe
aa50: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
aa60: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
aa70: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
aa80: 20 20 49 64 4c 69 73 74 20 2a 70 46 72 6f 6d 43    IdList *pFromC
aa90: 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol,    /* Column
aaa0: 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20  s in this table 
aab0: 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74  that point to ot
aac0: 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54  her table */.  T
aad0: 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20  oken *pTo,      
aae0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
aaf0: 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
ab00: 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 54 6f 43  /.  IdList *pToC
ab10: 6f 6c 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75  ol,      /* Colu
ab20: 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  mns in the other
ab30: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
ab40: 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
ab50: 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73   /* Conflict res
ab60: 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
ab70: 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ms. */.){.  Tabl
ab80: 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *p = pParse->p
ab90: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20  NewTable;.  int 
aba0: 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  nByte;.  int i;.
abb0: 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68    int nCol;.  ch
abc0: 61 72 20 2a 7a 3b 0a 20 20 46 4b 65 79 20 2a 70  ar *z;.  FKey *p
abd0: 46 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 61 73 73  FKey = 0;..  ass
abe0: 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20  ert( pTo!=0 );. 
abf0: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
ac00: 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
ac10: 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70   fk_end;.  if( p
ac20: 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
ac30: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
ac40: 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  nCol-1;.    if( 
ac50: 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b  iCol<0 ) goto fk
ac60: 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54  _end;.    if( pT
ac70: 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
ac80: 6e 49 64 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  nId!=1 ){.      
ac90: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
aca0: 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e  pParse, "foreign
acb0: 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20   key on %s".    
acc0: 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65       " should re
acd0: 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65  ference only one
ace0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
acf0: 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70   %T",.         p
ad00: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
ad10: 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20  me, pTo);.      
ad20: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
ad30: 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b   }.    nCol = 1;
ad40: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f  .  }else if( pTo
ad50: 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
ad60: 49 64 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 49  Id!=pFromCol->nI
ad70: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
ad80: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
ad90: 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72  .        "number
ada0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66   of columns in f
adb0: 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20  oreign key does 
adc0: 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75  not match the nu
add0: 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20  mber of ".      
ade0: 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68    "columns in th
adf0: 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
ae00: 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66  le");.    goto f
ae10: 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  k_end;.  }else{.
ae20: 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d      nCol = pFrom
ae30: 43 6f 6c 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 20 20  Col->nId;.  }.  
ae40: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
ae50: 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69  pFKey) + nCol*si
ae60: 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
ae70: 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
ae80: 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
ae90: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
aea0: 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 49 64 3b 20 69  i<pToCol->nId; i
aeb0: 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  ++){.      nByte
aec0: 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f   += strlen(pToCo
aed0: 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b  l->a[i].zName) +
aee0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
aef0: 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d 61  pFKey = sqliteMa
af00: 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20  lloc( nByte );. 
af10: 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 20   if( pFKey==0 ) 
af20: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 70  goto fk_end;.  p
af30: 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b  FKey->pFrom = p;
af40: 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  .  pFKey->pNextF
af50: 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a  rom = p->pFKey;.
af60: 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46    z = (char*)&pF
af70: 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d  Key[1];.  pFKey-
af80: 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75 63 74 20  >aCol = (struct 
af90: 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20  sColMap*)z;.  z 
afa0: 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  += sizeof(struct
afb0: 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a   sColMap)*nCol;.
afc0: 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a    pFKey->zTo = z
afd0: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54  ;.  memcpy(z, pT
afe0: 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20  o->z, pTo->n);. 
aff0: 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a   z[pTo->n] = 0;.
b000: 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b    z += pTo->n+1;
b010: 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54  .  pFKey->pNextT
b020: 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e  o = 0;.  pFKey->
b030: 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69  nCol = nCol;.  i
b040: 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
b050: 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f  {.    pFKey->aCo
b060: 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e  l[0].iFrom = p->
b070: 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  nCol-1;.  }else{
b080: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
b090: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
b0a0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
b0b0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f  or(j=0; j<p->nCo
b0c0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
b0d0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
b0e0: 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  Cmp(p->aCol[j].z
b0f0: 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Name, pFromCol->
b100: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  a[i].zName)==0 )
b110: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65  {.          pFKe
b120: 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d  y->aCol[i].iFrom
b130: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
b140: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
b150: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b160: 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b  f( j>=p->nCol ){
b170: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b180: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
b190: 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b   .          "unk
b1a0: 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73  nown column \"%s
b1b0: 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  \" in foreign ke
b1c0: 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a  y definition", .
b1d0: 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43            pFromC
b1e0: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
b1f0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  .        goto fk
b200: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
b210: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54    }.  }.  if( pT
b220: 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28  oCol ){.    for(
b230: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
b240: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
b250: 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e   strlen(pToCol->
b260: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
b270: 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69     pFKey->aCol[i
b280: 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20  ].zCol = z;.    
b290: 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43    memcpy(z, pToC
b2a0: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  ol->a[i].zName, 
b2b0: 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d  n);.      z[n] =
b2c0: 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e   0;.      z += n
b2d0: 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  +1;.    }.  }.  
b2e0: 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
b2f0: 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e  d = 0;.  pFKey->
b300: 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61  deleteConf = fla
b310: 67 73 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b  gs & 0xff;.  pFK
b320: 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d  ey->updateConf =
b330: 20 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26   (flags >> 8 ) &
b340: 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e   0xff;.  pFKey->
b350: 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c  insertConf = (fl
b360: 61 67 73 20 3e 3e 20 31 36 20 29 20 26 20 30 78  ags >> 16 ) & 0x
b370: 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74  ff;..  /* Link t
b380: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74  he foreign key t
b390: 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74  o the table as t
b3a0: 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20  he last step..  
b3b0: 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20  */.  p->pFKey = 
b3c0: 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d  pFKey;.  pFKey =
b3d0: 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73   0;..fk_end:.  s
b3e0: 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79 29  qliteFree(pFKey)
b3f0: 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73  ;.  sqlite3IdLis
b400: 74 44 65 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c  tDelete(pFromCol
b410: 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69  );.  sqlite3IdLi
b420: 73 74 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29  stDelete(pToCol)
b430: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
b440: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
b450: 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41  d when an INITIA
b460: 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72  LLY IMMEDIATE or
b470: 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
b480: 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73  RED.** clause is
b490: 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66   seen as part of
b4a0: 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64   a foreign key d
b4b0: 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20  efinition.  The 
b4c0: 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61  isDeferred.** pa
b4d0: 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72  rameter is 1 for
b4e0: 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
b4f0: 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e  RED and 0 for IN
b500: 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
b510: 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69  E..** The behavi
b520: 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  or of the most r
b530: 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20  ecently created 
b540: 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61  foreign key is a
b550: 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72  djusted.** accor
b560: 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  dingly..*/.void 
b570: 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
b580: 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50  ignKey(Parse *pP
b590: 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65  arse, int isDefe
b5a0: 72 72 65 64 29 7b 0a 20 20 54 61 62 6c 65 20 2a  rred){.  Table *
b5b0: 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46  pTab;.  FKey *pF
b5c0: 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62  Key;.  if( (pTab
b5d0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
b5e0: 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b  able)==0 || (pFK
b5f0: 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79  ey = pTab->pFKey
b600: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
b610: 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
b620: 65 64 20 3d 20 69 73 44 65 66 65 72 72 65 64 3b  ed = isDeferred;
b630: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
b640: 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72   a new index for
b650: 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20   an SQL table.  
b660: 70 49 6e 64 65 78 20 69 73 20 74 68 65 20 6e 61  pIndex is the na
b670: 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
b680: 0a 2a 2a 20 61 6e 64 20 70 54 61 62 6c 65 20 69  .** and pTable i
b690: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
b6a0: 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
b6b0: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
b6c0: 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65  Both will .** be
b6d0: 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d   NULL for a prim
b6e0: 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e  ary key or an in
b6f0: 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61  dex that is crea
b700: 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61  ted to satisfy a
b710: 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  .** UNIQUE const
b720: 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c  raint.  If pTabl
b730: 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65  e and pIndex are
b740: 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73   NULL, use pPars
b750: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20  e->pNewTable.** 
b760: 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  as the table to 
b770: 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61  be indexed.  pPa
b780: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
b790: 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  s a table that i
b7a0: 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62  s.** currently b
b7b0: 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
b7c0: 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42   by a CREATE TAB
b7d0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
b7e0: 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c  .** pList is a l
b7f0: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
b800: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
b810: 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  List will be NUL
b820: 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  L if this.** is 
b830: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
b840: 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69   unique-constrai
b850: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
b860: 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64  ecent column add
b870: 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62  ed.** to the tab
b880: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
b890: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
b8a0: 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74    .*/.void sqlit
b8b0: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20  e3CreateIndex(. 
b8c0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
b8d0: 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61    /* All informa
b8e0: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20  tion about this 
b8f0: 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  parse */.  Token
b900: 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e   *pName,    /* N
b910: 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
b920: 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
b930: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
b940: 62 6c 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ble, /* Name of 
b950: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 69 6e 64  the table to ind
b960: 65 78 2e 20 20 55 73 65 20 70 50 61 72 73 65 2d  ex.  Use pParse-
b970: 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20  >pNewTable if 0 
b980: 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 4c 69  */.  IdList *pLi
b990: 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20  st,   /* A list 
b9a0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
b9b0: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
b9c0: 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 2f  t onError,     /
b9d0: 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49  * OE_Abort, OE_I
b9e0: 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63  gnore, OE_Replac
b9f0: 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f  e, or OE_None */
ba00: 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  .  Token *pStart
ba10: 2c 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54  ,   /* The CREAT
ba20: 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
ba30: 69 6e 73 20 61 20 43 52 45 41 54 45 20 54 41 42  ins a CREATE TAB
ba40: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  LE statement */.
ba50: 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20    Token *pEnd   
ba60: 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68     /* The ")" th
ba70: 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52  at closes the CR
ba80: 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
ba90: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ment */.){.  Tab
baa0: 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a  le *pTab;     /*
bab0: 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   Table to be ind
bac0: 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  exed */.  Index 
bad0: 2a 70 49 6e 64 65 78 3b 20 20 20 2f 2a 20 54 68  *pIndex;   /* Th
bae0: 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72  e index to be cr
baf0: 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  eated */.  char 
bb00: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e  *zName = 0;.  in
bb10: 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20  t i, j;.  Token 
bb20: 6e 75 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61  nullId;    /* Fa
bb30: 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20  ke token for an 
bb40: 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f  empty ID list */
bb50: 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b  .  DbFixer sFix;
bb60: 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67      /* For assig
bb70: 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61  ning database na
bb80: 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f  mes to pTable */
bb90: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 3b 20 20  .  int isTemp;  
bba0: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
bbb0: 61 20 74 65 6d 70 6f 72 61 72 79 20 69 6e 64 65  a temporary inde
bbc0: 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64  x */.  sqlite *d
bbd0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
bbe0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
bbf0: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
bc00: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67  alloc_failed ) g
bc10: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
bc20: 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 64 62 2d  index;.  if( db-
bc30: 3e 69 6e 69 74 2e 62 75 73 79 20 0a 20 20 20 20  >init.busy .    
bc40: 20 26 26 20 73 71 6c 69 74 65 33 46 69 78 49 6e   && sqlite3FixIn
bc50: 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
bc60: 2c 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 2c 20  , db->init.iDb, 
bc70: 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 0a  "index", pName).
bc80: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 46       && sqlite3F
bc90: 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c  ixSrcList(&sFix,
bca0: 20 70 54 61 62 6c 65 29 0a 20 20 29 7b 0a 20 20   pTable).  ){.  
bcb0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
bcc0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20  te_index;.  }.. 
bcd0: 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
bce0: 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
bcf0: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
bd00: 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20  Return early if 
bd10: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a  not found..  */.
bd20: 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20    if( pTable!=0 
bd30: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
bd40: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 61  Name!=0 );.    a
bd50: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e  ssert( pTable->n
bd60: 53 72 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54  Src==1 );.    pT
bd70: 61 62 20 3d 20 20 73 71 6c 69 74 65 33 53 72 63  ab =  sqlite3Src
bd80: 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73  ListLookup(pPars
bd90: 65 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65  e, pTable);.  }e
bda0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
bdb0: 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20   pName==0 );.   
bdc0: 20 70 54 61 62 20 3d 20 20 70 50 61 72 73 65 2d   pTab =  pParse-
bdd0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a  >pNewTable;.  }.
bde0: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c    if( pTab==0 ||
bdf0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
be00: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
be10: 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54  _index;.  if( pT
be20: 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  ab->readOnly ){.
be30: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
be40: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
be50: 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65  le %s may not be
be60: 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d   indexed", pTab-
be70: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
be80: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
be90: 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dex;.  }.  if( p
bea0: 54 61 62 2d 3e 69 44 62 3e 3d 32 20 26 26 20 64  Tab->iDb>=2 && d
beb0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
bec0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
bed0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
bee0: 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
bef0: 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 64   have indices ad
bf00: 64 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ded", pTab->zNam
bf10: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
bf20: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
bf30: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e    }.  if( pTab->
bf40: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
bf50: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
bf60: 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61  Parse, "views ma
bf70: 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
bf80: 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ");.    goto exi
bf90: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
bfa0: 20 20 7d 0a 20 20 69 73 54 65 6d 70 20 3d 20 70    }.  isTemp = p
bfb0: 54 61 62 2d 3e 69 44 62 3d 3d 31 3b 0a 0a 20 20  Tab->iDb==1;..  
bfc0: 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
bfd0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
bfe0: 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  ex.  Make sure t
bff0: 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  here is not alre
c000: 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a  ady another.  **
c010: 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
c020: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
c030: 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  me.  .  **.  ** 
c040: 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77  Exception:  If w
c050: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
c060: 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61  e names of perma
c070: 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f  nent indices fro
c080: 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  m the.  ** sqlit
c090: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28  e_master table (
c0a0: 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68  because some oth
c0b0: 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67  er process chang
c0c0: 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61  ed the schema) a
c0d0: 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74  nd.  ** one of t
c0e0: 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63  he index names c
c0f0: 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65  ollides with the
c100: 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f   name of a tempo
c110: 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20  rary table or.  
c120: 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77  ** index, then w
c130: 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
c140: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20  to process this 
c150: 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
c160: 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20   If pName==0 it 
c170: 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72  means that we ar
c180: 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77  e.  ** dealing w
c190: 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65  ith a primary ke
c1a0: 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  y or UNIQUE cons
c1b0: 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65  traint.  We have
c1c0: 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20   to invent our. 
c1d0: 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20   ** own name..  
c1e0: 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 26  */.  if( pName &
c1f0: 26 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  & !db->init.busy
c200: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
c210: 49 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a  ISameName;    /*
c220: 20 41 6e 6f 74 68 65 72 20 69 6e 64 65 78 20 77   Another index w
c230: 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
c240: 65 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a  e */.    Table *
c250: 70 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f  pTSameName;    /
c260: 2a 20 41 20 74 61 62 6c 65 20 77 69 74 68 20 73  * A table with s
c270: 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
c280: 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7a 4e 61  index */.    zNa
c290: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  me = sqliteStrND
c2a0: 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  up(pName->z, pNa
c2b0: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20  me->n);.    if( 
c2c0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
c2d0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
c2e0: 78 3b 0a 20 20 20 20 69 66 28 20 28 70 49 53 61  x;.    if( (pISa
c2f0: 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  meName = sqlite3
c300: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
c310: 61 6d 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20  ame, 0))!=0 ){. 
c320: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
c330: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
c340: 64 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65  dex %s already e
c350: 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  xists", zName);.
c360: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
c370: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
c380: 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 54 53    }.    if( (pTS
c390: 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ameName = sqlite
c3a0: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
c3b0: 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a  Name, 0))!=0 ){.
c3c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
c3d0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
c3e0: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
c3f0: 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73  a table named %s
c400: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
c410: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
c420: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
c430: 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65   }else if( pName
c440: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
c450: 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e  zBuf[30];.    in
c460: 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  t n;.    Index *
c470: 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70  pLoop;.    for(p
c480: 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65  Loop=pTab->pInde
c490: 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70  x, n=1; pLoop; p
c4a0: 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78  Loop=pLoop->pNex
c4b0: 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70  t, n++){}.    sp
c4c0: 72 69 6e 74 66 28 7a 42 75 66 2c 22 25 64 29 22  rintf(zBuf,"%d)"
c4d0: 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  ,n);.    zName =
c4e0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   0;.    sqlite3S
c4f0: 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c  etString(&zName,
c500: 20 22 28 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   "(", pTab->zNam
c510: 65 2c 20 22 20 61 75 74 6f 69 6e 64 65 78 20 22  e, " autoindex "
c520: 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30  , zBuf, (char*)0
c530: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
c540: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
c550: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
c560: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65  }else{.    zName
c570: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
c580: 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65  (pName->z, pName
c590: 2d 3e 6e 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ->n);.  }..  /* 
c5a0: 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72  Check for author
c5b0: 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74  ization to creat
c5c0: 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f  e an index..  */
c5d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c5e0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
c5f0: 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ON.  {.    const
c600: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
c610: 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e  >aDb[pTab->iDb].
c620: 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 61 73 73 65  zName;..    asse
c630: 72 74 28 20 70 54 61 62 2d 3e 69 44 62 3d 3d 64  rt( pTab->iDb==d
c640: 62 2d 3e 69 6e 69 74 2e 69 44 62 20 7c 7c 20 69  b->init.iDb || i
c650: 73 54 65 6d 70 20 29 3b 0a 20 20 20 20 69 66 28  sTemp );.    if(
c660: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
c670: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
c680: 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f  _INSERT, SCHEMA_
c690: 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30  TABLE(isTemp), 0
c6a0: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
c6b0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
c6c0: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
c6d0: 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45    i = SQLITE_CRE
c6e0: 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  ATE_INDEX;.    i
c6f0: 66 28 20 69 73 54 65 6d 70 20 29 20 69 20 3d 20  f( isTemp ) i = 
c700: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
c710: 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  MP_INDEX;.    if
c720: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
c730: 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e  ck(pParse, i, zN
c740: 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
c750: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
c760: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
c770: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
c780: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
c790: 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d  f pList==0, it m
c7a0: 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e  eans this routin
c7b0: 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  e was called to 
c7c0: 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20  make a primary. 
c7d0: 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74   ** key out of t
c7e0: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61  he last column a
c7f0: 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
c800: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
c810: 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72  tion..  ** So cr
c820: 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74  eate a fake list
c830: 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69   to simulate thi
c840: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  s..  */.  if( pL
c850: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75  ist==0 ){.    nu
c860: 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d 3e 61  llId.z = pTab->a
c870: 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31  Col[pTab->nCol-1
c880: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c  ].zName;.    nul
c890: 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 6e  lId.n = strlen(n
c8a0: 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c  ullId.z);.    pL
c8b0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  ist = sqlite3IdL
c8c0: 69 73 74 41 70 70 65 6e 64 28 30 2c 20 26 6e 75  istAppend(0, &nu
c8d0: 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20 70  llId);.    if( p
c8e0: 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65  List==0 ) goto e
c8f0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
c900: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ;.  }..  /* .  *
c910: 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  * Allocate the i
c920: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
c930: 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20 3d  .  */.  pIndex =
c940: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
c950: 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 73  izeof(Index) + s
c960: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31  trlen(zName) + 1
c970: 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   +.             
c980: 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
c990: 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66  of(int) + sizeof
c9a0: 28 43 6f 6c 6c 53 65 71 2a 29 29 2a 70 4c 69 73  (CollSeq*))*pLis
c9b0: 74 2d 3e 6e 49 64 20 29 3b 0a 20 20 69 66 28 20  t->nId );.  if( 
c9c0: 70 49 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f  pIndex==0 ) goto
c9d0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
c9e0: 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69  ex;.  pIndex->ai
c9f0: 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26  Column = (int*)&
ca00: 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e  pIndex->keyInfo.
ca10: 61 43 6f 6c 6c 5b 70 4c 69 73 74 2d 3e 6e 49 64  aColl[pList->nId
ca20: 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  ];.  pIndex->zNa
ca30: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e  me = (char*)&pIn
ca40: 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c  dex->aiColumn[pL
ca50: 69 73 74 2d 3e 6e 49 64 5d 3b 0a 20 20 73 74 72  ist->nId];.  str
ca60: 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  cpy(pIndex->zNam
ca70: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e  e, zName);.  pIn
ca80: 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  dex->pTable = pT
ca90: 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43  ab;.  pIndex->nC
caa0: 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  olumn = pList->n
cab0: 49 64 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e  Id;.  pIndex->on
cac0: 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b  Error = onError;
cad0: 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49  .  pIndex->autoI
cae0: 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b  ndex = pName==0;
caf0: 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 3d  .  pIndex->iDb =
cb00: 20 69 73 54 65 6d 70 20 3f 20 31 20 3a 20 64 62   isTemp ? 1 : db
cb10: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 0a 20 20 2f  ->init.iDb;..  /
cb20: 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73  * Scan the names
cb30: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
cb40: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
cb50: 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20  be indexed and. 
cb60: 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c   ** load the col
cb70: 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f  umn indices into
cb80: 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63   the Index struc
cb90: 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e  ture.  Report an
cba0: 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61   error.  ** if a
cbb0: 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74  ny column is not
cbc0: 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66   found..  */.  f
cbd0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
cbe0: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
cbf0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
cc00: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
cc10: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
cc20: 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
cc30: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  ].zName, pTab->a
cc40: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  Col[j].zName)==0
cc50: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
cc60: 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d      if( j>=pTab-
cc70: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  >nCol ){.      s
cc80: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
cc90: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
cca0: 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e   has no column n
ccb0: 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20  amed %s",.      
ccc0: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70    pTab->zName, p
ccd0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
cce0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
ccf0: 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20  ree(pIndex);.   
cd00: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
cd10: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
cd20: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  .    pIndex->aiC
cd30: 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20  olumn[i] = j;.  
cd40: 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66    pIndex->keyInf
cd50: 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 54 61  o.aColl[i] = pTa
cd60: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c  b->aCol[j].pColl
cd70: 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 2d 3e  ;.  }.  pIndex->
cd80: 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d  keyInfo.nField =
cd90: 20 70 4c 69 73 74 2d 3e 6e 49 64 3b 0a 0a 20 20   pList->nId;..  
cda0: 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20  /* Link the new 
cdb0: 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
cdc0: 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64  to its table and
cdd0: 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20   to the other.  
cde0: 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
cdf0: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73  abase structures
ce00: 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  . .  */.  if( !p
ce10: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
ce20: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a  {.    Index *p;.
ce30: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
ce40: 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61  ashInsert(&db->a
ce50: 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e  Db[pIndex->iDb].
ce60: 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20  idxHash, .      
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce80: 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
ce90: 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d  , strlen(pIndex-
cea0: 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65  >zName)+1, pInde
ceb0: 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  x);.    if( p ){
cec0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
ced0: 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20  ==pIndex );  /* 
cee0: 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
cef0: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
cf00: 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64   sqliteFree(pInd
cf10: 65 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ex);.      goto 
cf20: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
cf30: 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  x;.    }.    db-
cf40: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
cf50: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
cf60: 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61    }..  /* When a
cf70: 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74  dding an index t
cf80: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
cf90: 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c  dices for a tabl
cfa0: 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  e, make.  ** sur
cfb0: 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61  e all indices la
cfc0: 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65  beled OE_Replace
cfd0: 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20   come after all 
cfe0: 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20  those labeled.  
cff0: 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54  ** OE_Ignore.  T
d000: 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
d010: 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74   for the correct
d020: 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50   operation of UP
d030: 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e  DATE.  ** and IN
d040: 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  SERT..  */.  if(
d050: 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70   onError!=OE_Rep
d060: 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49  lace || pTab->pI
d070: 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 7c  ndex==0.       |
d080: 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e  | pTab->pIndex->
d090: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c  onError==OE_Repl
d0a0: 61 63 65 29 7b 0a 20 20 20 20 70 49 6e 64 65 78  ace){.    pIndex
d0b0: 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e  ->pNext = pTab->
d0c0: 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62  pIndex;.    pTab
d0d0: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
d0e0: 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  x;.  }else{.    
d0f0: 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20  Index *pOther = 
d100: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
d110: 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d    while( pOther-
d120: 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72  >pNext && pOther
d130: 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72  ->pNext->onError
d140: 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a  !=OE_Replace ){.
d150: 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70        pOther = p
d160: 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
d170: 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
d180: 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e  pNext = pOther->
d190: 70 4e 65 78 74 3b 0a 20 20 20 20 70 4f 74 68 65  pNext;.    pOthe
d1a0: 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  r->pNext = pInde
d1b0: 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  x;.  }..  /* If 
d1c0: 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  the db->init.bus
d1d0: 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20  y is 1 it means 
d1e0: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
d1f0: 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20  he SQL off the. 
d200: 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74   ** "sqlite_mast
d210: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
d220: 20 64 69 73 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f   disk.  So do no
d230: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  t write to the d
d240: 69 73 6b 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20  isk.  ** again. 
d250: 20 45 78 74 72 61 63 74 20 74 68 65 20 74 61 62   Extract the tab
d260: 6c 65 20 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74  le number from t
d270: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  he db->init.newT
d280: 6e 75 6d 20 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a  num field..  */.
d290: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
d2a0: 75 73 79 20 26 26 20 70 54 61 62 6c 65 21 3d 30  usy && pTable!=0
d2b0: 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e   ){.    pIndex->
d2c0: 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
d2d0: 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20  newTnum;.  }..  
d2e0: 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
d2f0: 69 74 2e 62 75 73 79 20 69 73 20 30 20 74 68 65  it.busy is 0 the
d300: 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64  n create the ind
d310: 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69  ex on disk.  Thi
d320: 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20  s.  ** involves 
d330: 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65  writing the inde
d340: 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65  x into the maste
d350: 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c  r table and fill
d360: 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ing in the.  ** 
d370: 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63  index with the c
d380: 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e  urrent table con
d390: 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tents..  **.  **
d3a0: 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   The db->init.bu
d3b0: 73 79 20 69 73 20 30 20 77 68 65 6e 20 74 68 65  sy is 0 when the
d3c0: 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65   user first ente
d3d0: 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45  rs a CREATE INDE
d3e0: 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e  X .  ** command.
d3f0: 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20    db->init.busy 
d400: 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61  is 1 when a data
d410: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61  base is opened a
d420: 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20  nd .  ** CREATE 
d430: 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73  INDEX statements
d440: 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66   are read out of
d450: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
d460: 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20  e.  In.  ** the 
d470: 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20  latter case the 
d480: 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
d490: 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68  ists on disk, wh
d4a0: 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20  ich is why.  ** 
d4b0: 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  we don't want to
d4c0: 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20   recreate it..  
d4d0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 61 62 6c  **.  ** If pTabl
d4e0: 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
d4f0: 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65  is index is gene
d500: 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61  rated as a prima
d510: 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55  ry key.  ** or U
d520: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
d530: 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42   of a CREATE TAB
d540: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  LE statement.  S
d550: 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20  ince the table. 
d560: 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65   ** has just bee
d570: 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f  n created, it co
d580: 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61  ntains no data a
d590: 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69  nd the index ini
d5a0: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
d5b0: 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69   step can be ski
d5c0: 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
d5d0: 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62  e if( db->init.b
d5e0: 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  usy==0 ){.    in
d5f0: 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  t n;.    Vdbe *v
d600: 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31 2c 20  ;.    int lbl1, 
d610: 6c 62 6c 32 3b 0a 20 20 20 20 69 6e 74 20 69 3b  lbl2;.    int i;
d620: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a  .    int addr;..
d630: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
d640: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
d650: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67      if( v==0 ) g
d660: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
d670: 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  index;.    if( p
d680: 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20  Table!=0 ){.    
d690: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
d6a0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
d6b0: 72 73 65 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b  rse, 0, isTemp);
d6c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
d6d0: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c  enMasterTable(v,
d6e0: 20 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a   isTemp);.    }.
d6f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d700: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65  ddOp(v, OP_NewRe
d710: 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  cno, 0, 0);.    
d720: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
d730: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
d740: 30 2c 20 22 69 6e 64 65 78 22 2c 20 50 33 5f 53  0, "index", P3_S
d750: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
d760: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
d770: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20 70  _String, 0, 0, p
d780: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Index->zName, 0)
d790: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
d7a0: 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e  eOp3(v, OP_Strin
d7b0: 67 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  g, 0, 0, pTab->z
d7c0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  Name, 0);.    sq
d7d0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
d7e0: 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20  OP_CreateIndex, 
d7f0: 30 2c 20 69 73 54 65 6d 70 2c 28 63 68 61 72 2a  0, isTemp,(char*
d800: 29 26 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 50  )&pIndex->tnum,P
d810: 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20  3_POINTER);.    
d820: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 30  pIndex->tnum = 0
d830: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  ;.    if( pTable
d840: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d850: 33 56 64 62 65 43 6f 64 65 28 76 2c 0a 20 20 20  3VdbeCode(v,.   
d860: 20 20 20 20 20 20 20 4f 50 5f 44 75 70 2c 20 20         OP_Dup,  
d870: 20 20 20 20 20 30 2c 20 20 20 20 20 20 30 2c 0a       0,      0,.
d880: 20 20 20 20 20 20 20 20 20 20 4f 50 5f 49 6e 74            OP_Int
d890: 65 67 65 72 2c 20 20 20 69 73 54 65 6d 70 2c 20  eger,   isTemp, 
d8a0: 30 2c 0a 20 20 20 20 20 20 30 29 3b 0a 20 20 20  0,.      0);.   
d8b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
d8c0: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  3(v, OP_OpenWrit
d8d0: 65 2c 20 31 2c 20 30 2c 0a 20 20 20 20 20 20 20  e, 1, 0,.       
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
d8f0: 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65  har*)&pIndex->ke
d900: 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46  yInfo, P3_KEYINF
d910: 4f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64  O);.    }.    ad
d920: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
d930: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
d940: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  ng, 0, 0);.    i
d950: 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e  f( pStart && pEn
d960: 64 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 41  d ){.      n = A
d970: 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41  ddr(pEnd->z) - A
d980: 64 64 72 28 70 53 74 61 72 74 2d 3e 7a 29 20 2b  ddr(pStart->z) +
d990: 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
d9a0: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
d9b0: 20 61 64 64 72 2c 20 70 53 74 61 72 74 2d 3e 7a   addr, pStart->z
d9c0: 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
d9d0: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
d9e0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
d9f0: 20 35 2c 20 30 2c 20 22 74 74 74 69 74 22 2c 20   5, 0, "tttit", 
da00: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
da10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
da20: 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79  (v, OP_PutIntKey
da30: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
da40: 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20   pTable ){.     
da50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
da60: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
da70: 20 70 54 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a   pTab->iDb, 0);.
da80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
da90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
daa0: 6e 52 65 61 64 2c 20 32 2c 20 70 54 61 62 2d 3e  nRead, 2, pTab->
dab0: 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20  tnum);.      /* 
dac0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
dad0: 22 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  "%s", pTab->zNam
dae0: 65 29 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71  e)); */.      sq
daf0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
db00: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
db10: 6e 73 2c 20 32 2c 20 70 54 61 62 2d 3e 6e 43 6f  ns, 2, pTab->nCo
db20: 6c 29 3b 0a 20 20 20 20 20 20 6c 62 6c 32 20 3d  l);.      lbl2 =
db30: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
db40: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
db50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
db60: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 32  (v, OP_Rewind, 2
db70: 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 6c  , lbl2);.      l
db80: 62 6c 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  bl1 = sqlite3Vdb
db90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63  eAddOp(v, OP_Rec
dba0: 6e 6f 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20  no, 2, 0);.     
dbb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64   for(i=0; i<pInd
dbc0: 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ex->nColumn; i++
dbd0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
dbe0: 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69  Col = pIndex->ai
dbf0: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
dc00: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b     if( pTab->iPK
dc10: 65 79 3d 3d 69 43 6f 6c 20 29 7b 0a 20 20 20 20  ey==iCol ){.    
dc20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dc30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
dc40: 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , i, 0);.       
dc50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
dc60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
dc70: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  Op(v, OP_Column,
dc80: 20 32 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20   2, iCol);.     
dc90: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
dca0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
dcb0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 49 64  dOp(v, OP_MakeId
dcc0: 78 4b 65 79 2c 20 70 49 6e 64 65 78 2d 3e 6e 43  xKey, pIndex->nC
dcd0: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
dce0: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
dcf0: 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 6e 64  inityStr(v, pInd
dd00: 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ex);.      sqlit
dd10: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
dd20: 49 64 78 50 75 74 2c 20 31 2c 20 70 49 6e 64 65  IdxPut, 1, pInde
dd30: 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
dd40: 6f 6e 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  one,.           
dd50: 20 20 20 20 20 20 20 20 20 20 20 22 69 6e 64 65             "inde
dd60: 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  xed columns are 
dd70: 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33 5f  not unique", P3_
dd80: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73  STATIC);.      s
dd90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
dda0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c  v, OP_Next, 2, l
ddb0: 62 6c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  bl1);.      sqli
ddc0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
ddd0: 62 65 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20  bel(v, lbl2);.  
dde0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ddf0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
de00: 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 2, 0);.      s
de10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
de20: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20  v, OP_Close, 1, 
de30: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
de40: 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20  ( pTable!=0 ){. 
de50: 20 20 20 20 20 69 66 28 20 21 69 73 54 65 6d 70       if( !isTemp
de60: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
de70: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
de80: 64 62 2c 20 76 29 3b 0a 20 20 20 20 20 20 7d 0a  db, v);.      }.
de90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dea0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
deb0: 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  se, 0, 0);.     
dec0: 20 73 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65   sqlite3EndWrite
ded0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
dee0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
def0: 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f  /* Clean up befo
df00: 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78  re exiting */.ex
df10: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a  it_create_index:
df20: 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  .  sqlite3IdList
df30: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
df40: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
df50: 65 6c 65 74 65 28 70 54 61 62 6c 65 29 3b 0a 20  elete(pTable);. 
df60: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
df70: 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
df80: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
df90: 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e  ine will drop an
dfa0: 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20   existing named 
dfb0: 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75  index.  This rou
dfc0: 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tine.** implemen
dfd0: 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45  ts the DROP INDE
dfe0: 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  X statement..*/.
dff0: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
e000: 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
e010: 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e  rse, SrcList *pN
e020: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
e030: 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76  Index;.  Vdbe *v
e040: 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
e050: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
e060: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
e070: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
e080: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
e090: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  rn;.  assert( pN
e0a0: 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
e0b0: 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
e0c0: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
e0d0: 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
e0e0: 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
e0f0: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
e100: 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20   pIndex==0 ){.  
e110: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
e120: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
e130: 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70  ch index: %S", p
e140: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 67 6f  Name, 0);.    go
e150: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
e160: 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  ex;.  }.  if( pI
e170: 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20  ndex->autoIndex 
e180: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
e190: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
e1a0: 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
e1b0: 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20   with UNIQUE ". 
e1c0: 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59       "or PRIMARY
e1d0: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
e1e0: 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  cannot be droppe
e1f0: 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f  d", 0);.    goto
e200: 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
e210: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64  ;.  }.  if( pInd
e220: 65 78 2d 3e 69 44 62 3e 31 20 29 7b 0a 20 20 20  ex->iDb>1 ){.   
e230: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
e240: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
e250: 20 61 6c 74 65 72 20 73 63 68 65 6d 61 20 6f 66   alter schema of
e260: 20 61 74 74 61 63 68 65 64 20 22 0a 20 20 20 20   attached ".    
e270: 20 20 20 22 64 61 74 61 62 61 73 65 73 22 2c 20     "databases", 
e280: 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  0);.    goto exi
e290: 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
e2a0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
e2b0: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
e2c0: 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ION.  {.    int 
e2d0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
e2e0: 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61  OP_INDEX;.    Ta
e2f0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
e300: 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20  ex->pTable;.    
e310: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
e320: 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78  = db->aDb[pIndex
e330: 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->iDb].zName;.  
e340: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
e350: 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
e360: 45 28 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a  E(pIndex->iDb);.
e370: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
e380: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
e390: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
e3a0: 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b  zTab, 0, zDb) ){
e3b0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
e3c0: 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20  _drop_index;.   
e3d0: 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65   }.    if( pInde
e3e0: 78 2d 3e 69 44 62 20 29 20 63 6f 64 65 20 3d 20  x->iDb ) code = 
e3f0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
e400: 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
e410: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
e420: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
e430: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54  Index->zName, pT
e440: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  ab->zName, zDb) 
e450: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
e460: 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
e470: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
e480: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
e490: 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
e4a0: 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d  e index and from
e4b0: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
e4c0: 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74  e */.  v = sqlit
e4d0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
e4e0: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
e4f0: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 4c    static VdbeOpL
e500: 69 73 74 20 64 72 6f 70 49 6e 64 65 78 5b 5d 20  ist dropIndex[] 
e510: 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52  = {.      { OP_R
e520: 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44  ewind,     0, AD
e530: 44 52 28 39 29 2c 20 30 7d 2c 20 0a 20 20 20 20  DR(9), 0}, .    
e540: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20    { OP_String,  
e550: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30     0, 0,       0
e560: 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20  }, /* 1 */.     
e570: 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20   { OP_MemStore, 
e580: 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20 30 7d    1, 1,       0}
e590: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d  ,.      { OP_Mem
e5a0: 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c 20 20  Load,    1, 0,  
e5b0: 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f       0}, /* 3 */
e5c0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
e5d0: 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20  mn,     0, 1,   
e5e0: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
e5f0: 4f 50 5f 45 71 2c 20 20 20 20 20 20 20 20 20 30  OP_Eq,         0
e600: 2c 20 41 44 44 52 28 38 29 2c 20 30 7d 2c 0a 20  , ADDR(8), 0},. 
e610: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20       { OP_Next, 
e620: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 33 29        0, ADDR(3)
e630: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
e640: 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c 20  _Goto,       0, 
e650: 41 44 44 52 28 39 29 2c 20 30 7d 2c 0a 20 20 20  ADDR(9), 0},.   
e660: 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20     { OP_Delete, 
e670: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
e680: 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20  0}, /* 8 */.    
e690: 7d 3b 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b  };.    int base;
e6a0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ..    sqlite3Beg
e6b0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
e6c0: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 49 6e 64  (pParse, 0, pInd
e6d0: 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71  ex->iDb);.    sq
e6e0: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
e6f0: 61 62 6c 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e  able(v, pIndex->
e700: 69 44 62 29 3b 0a 20 20 20 20 62 61 73 65 20 3d  iDb);.    base =
e710: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e720: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
e730: 7a 65 28 64 72 6f 70 49 6e 64 65 78 29 2c 20 64  ze(dropIndex), d
e740: 72 6f 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73  ropIndex);.    s
e750: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
e760: 50 33 28 76 2c 20 62 61 73 65 2b 31 2c 20 70 49  P3(v, base+1, pI
e770: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  ndex->zName, 0);
e780: 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d  .    if( pIndex-
e790: 3e 69 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >iDb==0 ){.     
e7a0: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
e7b0: 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a 20 20 20  okie(db, v);.   
e7c0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
e7d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
e7e0: 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ose, 0, 0);.    
e7f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e800: 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20  (v, OP_Destroy, 
e810: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 70 49  pIndex->tnum, pI
e820: 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20  ndex->iDb);.    
e830: 73 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f  sqlite3EndWriteO
e840: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
e850: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
e860: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
e870: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
e880: 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2f  this index..  */
e890: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
e8a0: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73  explain ){.    s
e8b0: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
e8c0: 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70  eleteIndex(db, p
e8d0: 49 6e 64 65 78 29 3b 0a 20 20 20 20 64 62 2d 3e  Index);.    db->
e8e0: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
e8f0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
e900: 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e   }..exit_drop_in
e910: 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72  dex:.  sqlite3Sr
e920: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d  cListDelete(pNam
e930: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  e);.}../*.** App
e940: 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  end a new elemen
e950: 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49  t to the given I
e960: 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  dList.  Create a
e970: 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a   new IdList if.*
e980: 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a  * need be..**.**
e990: 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73   A new IdList is
e9a0: 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
e9b0: 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66  LL if malloc() f
e9c0: 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20  ails..*/.IdList 
e9d0: 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70  *sqlite3IdListAp
e9e0: 70 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69  pend(IdList *pLi
e9f0: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
ea00: 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  n){.  if( pList=
ea10: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
ea20: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
ea30: 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29  sizeof(IdList) )
ea40: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
ea50: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
ea60: 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
ea70: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
ea80: 70 4c 69 73 74 2d 3e 6e 49 64 3e 3d 70 4c 69 73  pList->nId>=pLis
ea90: 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  t->nAlloc ){.   
eaa0: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
eab0: 74 65 6d 20 2a 61 3b 0a 20 20 20 20 70 4c 69 73  tem *a;.    pLis
eac0: 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4c 69 73  t->nAlloc = pLis
ead0: 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b  t->nAlloc*2 + 5;
eae0: 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52  .    a = sqliteR
eaf0: 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c  ealloc(pList->a,
eb00: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73   pList->nAlloc*s
eb10: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
eb20: 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 3d  ]) );.    if( a=
eb30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
eb40: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
eb50: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
eb60: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
eb70: 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a    pList->a = a;.
eb80: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c    }.  memset(&pL
eb90: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49  ist->a[pList->nI
eba0: 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c  d], 0, sizeof(pL
ebb0: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69  ist->a[0]));.  i
ebc0: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
ebd0: 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c   char **pz = &pL
ebe0: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49  ist->a[pList->nI
ebf0: 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71  d].zName;.    sq
ec00: 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28  lite3SetNString(
ec10: 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70  pz, pToken->z, p
ec20: 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20  Token->n, 0);.  
ec30: 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a    if( *pz==0 ){.
ec40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c        sqlite3IdL
ec50: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
ec60: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
ec70: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ec80: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
ec90: 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  e(*pz);.    }.  
eca0: 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b  }.  pList->nId++
ecb0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
ecc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
ecd0: 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  d a new table na
ece0: 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  me to the given 
ecf0: 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65  SrcList.  Create
ed00: 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   a new SrcList i
ed10: 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41  f.** need be.  A
ed20: 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72   new entry is cr
ed30: 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63  eated in the Src
ed40: 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f  List even if pTo
ed50: 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  ken is NULL..**.
ed60: 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74  ** A new SrcList
ed70: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
ed80: 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
ed90: 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49  ) fails..**.** I
eda0: 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e  f pDatabase is n
edb0: 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e  ot null, it mean
edc0: 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  s that the table
edd0: 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   has an optional
ede0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d  .** database nam
edf0: 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20  e prefix.  Like 
ee00: 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65  this:  "database
ee10: 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44  .table".  The pD
ee20: 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74  atabase.** point
ee30: 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e  s to the table n
ee40: 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62  ame and the pTab
ee50: 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  le points to the
ee60: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a   database name..
ee70: 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61  ** The SrcList.a
ee80: 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69  [].zName field i
ee90: 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
eea0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69  e table name whi
eeb0: 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65  ch might.** come
eec0: 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66   from pTable (if
eed0: 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55   pDatabase is NU
eee0: 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74  LL) or from pDat
eef0: 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c  abase.  .** SrcL
ef00: 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73  ist.a[].zDatabas
ef10: 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  e is filled with
ef20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
ef30: 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a  me from pTable,.
ef40: 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20  ** or with NULL 
ef50: 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69  if no database i
ef60: 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  s specified..**.
ef70: 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
ef80: 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20  s, if call like 
ef90: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
efa0: 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
efb0: 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b  stAppend(A,B,0);
efc0: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73  .**.** Then B is
efd0: 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e   a table name an
efe0: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  d the database n
eff0: 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69  ame is unspecifi
f000: 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a  ed.  If called.*
f010: 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  * like this:.**.
f020: 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
f030: 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
f040: 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,C);.**.** Th
f050: 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c  en C is the tabl
f060: 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20  e name and B is 
f070: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
f080: 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  e..*/.SrcList *s
f090: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
f0a0: 65 6e 64 28 53 72 63 4c 69 73 74 20 2a 70 4c 69  end(SrcList *pLi
f0b0: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  st, Token *pTabl
f0c0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62  e, Token *pDatab
f0d0: 61 73 65 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ase){.  if( pLis
f0e0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
f0f0: 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
f100: 28 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74  ( sizeof(SrcList
f110: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
f120: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
f130: 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
f140: 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  loc = 1;.  }.  i
f150: 66 28 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d  f( pList->nSrc>=
f160: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  pList->nAlloc ){
f170: 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  .    SrcList *pN
f180: 65 77 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e  ew;.    pList->n
f190: 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20  Alloc *= 2;.    
f1a0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61  pNew = sqliteRea
f1b0: 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a 20 20 20 20  lloc(pList,.    
f1c0: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
f1d0: 66 28 2a 70 4c 69 73 74 29 20 2b 20 28 70 4c 69  f(*pList) + (pLi
f1e0: 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69  st->nAlloc-1)*si
f1f0: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
f200: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ) );.    if( pNe
f210: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  w==0 ){.      sq
f220: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
f230: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  te(pList);.     
f240: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
f250: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65  .    pList = pNe
f260: 77 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  w;.  }.  memset(
f270: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
f280: 3e 6e 53 72 63 5d 2c 20 30 2c 20 73 69 7a 65 6f  >nSrc], 0, sizeo
f290: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
f2a0: 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
f2b0: 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a   && pDatabase->z
f2c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61  ==0 ){.    pData
f2d0: 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  base = 0;.  }.  
f2e0: 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26  if( pDatabase &&
f2f0: 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54   pTable ){.    T
f300: 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44  oken *pTemp = pD
f310: 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61  atabase;.    pDa
f320: 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b  tabase = pTable;
f330: 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54  .    pTable = pT
f340: 65 6d 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  emp;.  }.  if( p
f350: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 63 68 61  Table ){.    cha
f360: 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d  r **pz = &pList-
f370: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e  >a[pList->nSrc].
f380: 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74  zName;.    sqlit
f390: 65 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c  e3SetNString(pz,
f3a0: 20 70 54 61 62 6c 65 2d 3e 7a 2c 20 70 54 61 62   pTable->z, pTab
f3b0: 6c 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69  le->n, 0);.    i
f3c0: 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20  f( *pz==0 ){.   
f3d0: 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
f3e0: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
f3f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
f400: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f410: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
f420: 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  *pz);.    }.  }.
f430: 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
f440: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a  ){.    char **pz
f450: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
f460: 73 74 2d 3e 6e 53 72 63 5d 2e 7a 44 61 74 61 62  st->nSrc].zDatab
f470: 61 73 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ase;.    sqlite3
f480: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70  SetNString(pz, p
f490: 44 61 74 61 62 61 73 65 2d 3e 7a 2c 20 70 44 61  Database->z, pDa
f4a0: 74 61 62 61 73 65 2d 3e 6e 2c 20 30 29 3b 0a 20  tabase->n, 0);. 
f4b0: 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b     if( *pz==0 ){
f4c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72  .      sqlite3Sr
f4d0: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  cListDelete(pLis
f4e0: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
f4f0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
f500: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
f510: 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a  ote(*pz);.    }.
f520: 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 70    }.  pList->a[p
f530: 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 69 43 75 72  List->nSrc].iCur
f540: 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 4c 69 73  sor = -1;.  pLis
f550: 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74  t->nSrc++;.  ret
f560: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
f570: 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75 72 73 6f  .** Assign curso
f580: 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73  rs to all tables
f590: 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f   in a SrcList.*/
f5a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
f5b0: 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
f5c0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
f5d0: 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29   SrcList *pList)
f5e0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
f5f0: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
f600: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Src; i++){.    i
f610: 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  f( pList->a[i].i
f620: 43 75 72 73 6f 72 3c 30 20 29 7b 0a 20 20 20 20  Cursor<0 ){.    
f630: 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43    pList->a[i].iC
f640: 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
f650: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nTab++;.    }.  
f660: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
f670: 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20 6c  n alias to the l
f680: 61 73 74 20 69 64 65 6e 74 69 66 69 65 72 20 6f  ast identifier o
f690: 6e 20 74 68 65 20 67 69 76 65 6e 20 69 64 65 6e  n the given iden
f6a0: 74 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a  tifier list..*/.
f6b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
f6c0: 69 73 74 41 64 64 41 6c 69 61 73 28 53 72 63 4c  istAddAlias(SrcL
f6d0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
f6e0: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
f6f0: 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74  ( pList && pList
f700: 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ->nSrc>0 ){.    
f710: 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e  int i = pList->n
f720: 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 73 71 6c  Src - 1;.    sql
f730: 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 26  ite3SetNString(&
f740: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69  pList->a[i].zAli
f750: 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70  as, pToken->z, p
f760: 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20  Token->n, 0);.  
f770: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
f780: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  (pList->a[i].zAl
f790: 69 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ias);.  }.}../*.
f7a0: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c  ** Delete an IdL
f7b0: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
f7c0: 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
f7d0: 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  (IdList *pList){
f7e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
f7f0: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
f800: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
f810: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
f820: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
f830: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
f840: 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
f850: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b  eFree(pList->a);
f860: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
f870: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ist);.}../*.** R
f880: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
f890: 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20  in pList of the 
f8a0: 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64  identifier named
f8b0: 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31   zId.  Return -1
f8c0: 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  .** if not found
f8d0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f8e0: 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69  IdListIndex(IdLi
f8f0: 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74  st *pList, const
f900: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
f910: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
f920: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
f930: 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  -1;.  for(i=0; i
f940: 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
f950: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
f960: 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  e3StrICmp(pList-
f970: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  >a[i].zName, zNa
f980: 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  me)==0 ) return 
f990: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
f9a0: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  -1;.}../*.** Del
f9b0: 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72  ete an entire Sr
f9c0: 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20  cList including 
f9d0: 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63  all its substruc
f9e0: 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
f9f0: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
fa00: 74 65 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  te(SrcList *pLis
fa10: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
fa20: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
fa30: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
fa40: 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20   i<pList->nSrc; 
fa50: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
fa60: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Free(pList->a[i]
fa70: 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
fa80: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
fa90: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
faa0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
fab0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61  List->a[i].zAlia
fac0: 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  s);.    if( pLis
fad0: 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 26 26 20  t->a[i].pTab && 
fae0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  pList->a[i].pTab
faf0: 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b  ->isTransient ){
fb00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
fb10: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 4c 69  leteTable(0, pLi
fb20: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 3b 0a  st->a[i].pTab);.
fb30: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
fb40: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 4c  3SelectDelete(pL
fb50: 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  ist->a[i].pSelec
fb60: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
fb70: 78 70 72 44 65 6c 65 74 65 28 70 4c 69 73 74 2d  xprDelete(pList-
fb80: 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20  >a[i].pOn);.    
fb90: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
fba0: 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ete(pList->a[i].
fbb0: 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73  pUsing);.  }.  s
fbc0: 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 29  qliteFree(pList)
fbd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
fbe0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
fbf0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
fc00: 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ginTransaction(P
fc10: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
fc20: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 73 71  t onError){.  sq
fc30: 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69 66 28  lite *db;..  if(
fc40: 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
fc50: 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
fc60: 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
fc70: 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
fc80: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
fc90: 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
fca0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
fcb0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
fcc0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
fcd0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
fce0: 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22  SACTION, "BEGIN"
fcf0: 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
fd00: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67  ;.  if( db->flag
fd10: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
fd20: 6e 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ns ){.    sqlite
fd30: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
fd40: 2c 20 22 63 61 6e 6e 6f 74 20 73 74 61 72 74 20  , "cannot start 
fd50: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  a transaction wi
fd60: 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
fd70: 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  on");.    return
fd80: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
fd90: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
fda0: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29  on(pParse, 0, 0)
fdb0: 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  ;.  if( !pParse-
fdc0: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
fdd0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
fde0: 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 20  ITE_InTrans;.   
fdf0: 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f   db->onError = o
fe00: 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 7d 0a 0a 2f  nError;.  }.}../
fe10: 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72  *.** Commit a tr
fe20: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
fe30: 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54  d sqlite3CommitT
fe40: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
fe50: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
fe60: 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  ite *db;..  if( 
fe70: 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
fe80: 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
fe90: 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
fea0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
feb0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
fec0: 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
fed0: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
fee0: 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
fef0: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
ff00: 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
ff10: 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22  ACTION, "COMMIT"
ff20: 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
ff30: 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61  ;.  if( (db->fla
ff40: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72  gs & SQLITE_InTr
ff50: 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ans)==0 ){.    s
ff60: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
ff70: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63  Parse, "cannot c
ff80: 6f 6d 6d 69 74 20 2d 20 6e 6f 20 74 72 61 6e 73  ommit - no trans
ff90: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
ffa0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
ffb0: 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 72 73    }.  if( !pPars
ffc0: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
ffd0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
ffe0: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a  SQLITE_InTrans;.
fff0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64    }.  sqlite3End
10000 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
10010 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 70  Parse);.  if( !p
10020 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
10030 7b 0a 20 20 20 20 64 62 2d 3e 6f 6e 45 72 72 6f  {.    db->onErro
10040 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a  r = OE_Default;.
10050 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c    }.}../*.** Rol
10060 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74  lback a transact
10070 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
10080 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73  te3RollbackTrans
10090 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
100a0 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20  arse){.  sqlite 
100b0 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
100c0 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
100d0 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
100e0 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44  db)==0 || db->aD
100f0 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  b[0].pBt==0 ) re
10100 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
10110 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
10120 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
10130 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
10140 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
10150 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
10160 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
10170 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29  ROLLBACK", 0, 0)
10180 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
10190 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
101a0 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30  LITE_InTrans)==0
101b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
101c0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
101d0 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b  "cannot rollback
101e0 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f   - no transactio
101f0 6e 20 69 73 20 61 63 74 69 76 65 22 29 3b 0a 20  n is active");. 
10200 20 20 20 72 65 74 75 72 6e 3b 20 0a 20 20 7d 0a     return; .  }.
10210 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
10220 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
10230 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
10240 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10250 20 4f 50 5f 52 6f 6c 6c 62 61 63 6b 2c 20 30 2c   OP_Rollback, 0,
10260 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21   0);.  }.  if( !
10270 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
10280 29 7b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  ){.    db->flags
10290 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72   &= ~SQLITE_InTr
102a0 61 6e 73 3b 0a 20 20 20 20 64 62 2d 3e 6f 6e 45  ans;.    db->onE
102b0 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c  rror = OE_Defaul
102c0 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t;.  }.}../*.** 
102d0 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
102e0 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72  de that will ver
102f0 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63  ify the schema c
10300 6f 6f 6b 69 65 20 66 6f 72 20 61 6c 6c 0a 2a 2a  ookie for all.**
10310 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
10320 66 69 6c 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  files..*/.void s
10330 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
10340 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50  Schema(Parse *pP
10350 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
10360 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
10370 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
10380 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
10390 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
103a0 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
103b0 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
103c0 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
103d0 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20  aDb[iDb].pBt!=0 
103e0 29 3b 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20  );.  if( iDb!=1 
103f0 26 26 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  && !DbHasPropert
10400 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 43 6f  y(db, iDb, DB_Co
10410 6f 6b 69 65 29 20 29 7b 0a 20 20 20 20 73 71 6c  okie) ){.    sql
10420 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10430 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65   OP_VerifyCookie
10440 2c 20 69 44 62 2c 20 64 62 2d 3e 61 44 62 5b 69  , iDb, db->aDb[i
10450 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  Db].schema_cooki
10460 65 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f  e);.    DbSetPro
10470 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20 44  perty(db, iDb, D
10480 42 5f 43 6f 6f 6b 69 65 29 3b 0a 20 20 7d 0a 7d  B_Cookie);.  }.}
10490 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
104a0 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
104b0 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69  prepares for doi
104c0 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  ng an operation 
104d0 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68  that.** might ch
104e0 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73  ange the databas
104f0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
10500 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e  utine starts a n
10510 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ew transaction i
10520 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72  f we are not alr
10530 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61  eady within.** a
10540 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
10550 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
10560 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
10570 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68  ction, then a ch
10580 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73  eckpoint.** is s
10590 65 74 20 69 66 20 74 68 65 20 73 65 74 43 68 65  et if the setChe
105a0 63 6b 70 6f 69 6e 74 20 70 61 72 61 6d 65 74 65  ckpoint paramete
105b0 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68  r is true.  A ch
105c0 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a  eckpoint should.
105d0 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70  ** be set for op
105e0 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69  erations that mi
105f0 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f  ght fail (due to
10600 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70   a constraint) p
10610 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61  art of.** the wa
10620 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68  y through and wh
10630 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  ich will need to
10640 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65   undo some write
10650 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  s without having
10660 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20   to.** rollback 
10670 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61  the whole transa
10680 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72  ction.  For oper
10690 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c  ations where all
106a0 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
106b0 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62  can be checked b
106c0 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
106d0 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  s are made to th
106e0 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69  e database, it i
106f0 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73  s never.** neces
10700 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77  sary to undo a w
10710 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65  rite and the che
10720 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e  ckpoint should n
10730 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  ot be set..**.**
10740 20 4f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 69   Only database i
10750 44 62 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20  Db and the temp 
10760 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 64  database are mad
10770 65 20 77 72 69 74 61 62 6c 65 20 62 79 20 74 68  e writable by th
10780 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69  is call..** If i
10790 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  Db==0, then the 
107a0 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70 20 64 61  main and temp da
107b0 74 61 62 61 73 65 73 20 61 72 65 20 6d 61 64 65  tabases are made
107c0 20 77 72 69 74 61 62 6c 65 2e 20 20 20 49 66 0a   writable.   If.
107d0 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e 20 6f  ** iDb==1 then o
107e0 6e 6c 79 20 74 68 65 20 74 65 6d 70 20 64 61 74  nly the temp dat
107f0 61 62 61 73 65 20 69 73 20 6d 61 64 65 20 77 72  abase is made wr
10800 69 74 61 62 6c 65 2e 20 20 49 66 20 69 44 62 3e  itable.  If iDb>
10810 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73 70  1 then the.** sp
10820 65 63 69 66 69 65 64 20 61 75 78 69 6c 69 61 72  ecified auxiliar
10830 79 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  y database and t
10840 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
10850 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62   are made writab
10860 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
10870 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
10880 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  ration(Parse *pP
10890 61 72 73 65 2c 20 69 6e 74 20 73 65 74 43 68 65  arse, int setChe
108a0 63 6b 70 6f 69 6e 74 2c 20 69 6e 74 20 69 44 62  ckpoint, int iDb
108b0 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
108c0 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
108d0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 44  rse->db;.  if( D
108e0 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
108f0 20 69 44 62 2c 20 44 42 5f 4c 6f 63 6b 65 64 29   iDb, DB_Locked)
10900 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 20 3d   ) return;.  v =
10910 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
10920 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
10930 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
10940 69 66 28 20 21 64 62 2d 3e 61 44 62 5b 69 44 62  if( !db->aDb[iDb
10950 5d 2e 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20  ].inTrans ){.   
10960 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10970 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74  p(v, OP_Transact
10980 69 6f 6e 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20  ion, iDb, 0);.  
10990 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28    DbSetProperty(
109a0 64 62 2c 20 69 44 62 2c 20 44 42 5f 4c 6f 63 6b  db, iDb, DB_Lock
109b0 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ed);.    sqlite3
109c0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
109d0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
109e0 20 20 20 69 66 28 20 69 44 62 21 3d 31 20 29 7b     if( iDb!=1 ){
109f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
10a00 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
10a10 6e 28 70 50 61 72 73 65 2c 20 73 65 74 43 68 65  n(pParse, setChe
10a20 63 6b 70 6f 69 6e 74 2c 20 31 29 3b 0a 20 20 20  ckpoint, 1);.   
10a30 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73   }.  }else if( s
10a40 65 74 43 68 65 63 6b 70 6f 69 6e 74 20 29 7b 0a  etCheckpoint ){.
10a50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10a60 64 64 4f 70 28 76 2c 20 4f 50 5f 43 68 65 63 6b  ddOp(v, OP_Check
10a70 70 6f 69 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a  point, iDb, 0);.
10a80 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74      DbSetPropert
10a90 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 4c 6f  y(db, iDb, DB_Lo
10aa0 63 6b 65 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  cked);.  }.}../*
10ab0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
10ac0 65 20 74 68 61 74 20 63 6f 6e 63 6c 75 64 65 73  e that concludes
10ad0 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68   an operation th
10ae0 61 74 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e  at may have chan
10af0 67 65 64 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ged.** the datab
10b00 61 73 65 2e 20 20 49 66 20 61 20 73 74 61 74 65  ase.  If a state
10b10 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
10b20 20 77 61 73 20 73 74 61 72 74 65 64 2c 20 74 68   was started, th
10b30 65 6e 20 65 6d 69 74 0a 2a 2a 20 61 6e 20 4f 50  en emit.** an OP
10b40 5f 43 6f 6d 6d 69 74 20 74 68 61 74 20 77 69 6c  _Commit that wil
10b50 6c 20 63 61 75 73 65 20 74 68 65 20 63 68 61 6e  l cause the chan
10b60 67 65 73 20 74 6f 20 62 65 20 63 6f 6d 6d 69 74  ges to be commit
10b70 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ted to disk..**.
10b80 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 63 68 65  ** Note that che
10b90 63 6b 70 6f 69 6e 74 73 20 61 72 65 20 61 75 74  ckpoints are aut
10ba0 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6d 6d 69  omatically commi
10bb0 74 74 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  tted at the end 
10bc0 6f 66 0a 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e  of.** a statemen
10bd0 74 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  t.  Note also th
10be0 61 74 20 74 68 65 72 65 20 63 61 6e 20 62 65 20  at there can be 
10bf0 6d 75 6c 74 69 70 6c 65 20 63 61 6c 6c 73 20 74  multiple calls t
10c00 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 42 65 67  o .** sqlite3Beg
10c10 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
10c20 28 29 20 62 75 74 20 74 68 65 72 65 20 73 68 6f  () but there sho
10c30 75 6c 64 20 6f 6e 6c 79 20 62 65 20 61 20 73 69  uld only be a si
10c40 6e 67 6c 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  ngle.** call to 
10c50 73 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f  sqlite3EndWriteO
10c60 70 65 72 61 74 69 6f 6e 28 29 20 61 74 20 74 68  peration() at th
10c70 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
10c80 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  the statement..*
10c90 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e  /.void sqlite3En
10ca0 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
10cb0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
10cc0 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
10cd0 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
10ce0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72  ->db;.  if( pPar
10cf0 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 20  se->trigStack ) 
10d00 72 65 74 75 72 6e 3b 20 2f 2a 20 69 66 20 74 68  return; /* if th
10d10 69 73 20 69 73 20 69 6e 20 61 20 74 72 69 67 67  is is in a trigg
10d20 65 72 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  er */.  v = sqli
10d30 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
10d40 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
10d50 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 64   return;.  if( d
10d60 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
10d70 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20  E_InTrans ){.   
10d80 20 2f 2a 20 41 20 42 45 47 49 4e 20 68 61 73 20   /* A BEGIN has 
10d90 65 78 65 63 75 74 65 64 2e 20 20 44 6f 20 6e 6f  executed.  Do no
10da0 74 20 63 6f 6d 6d 69 74 20 75 6e 74 69 6c 20 77  t commit until w
10db0 65 20 73 65 65 20 61 6e 20 65 78 70 6c 69 63 69  e see an explici
10dc0 74 0a 20 20 20 20 2a 2a 20 43 4f 4d 4d 49 54 20  t.    ** COMMIT 
10dd0 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20  statement. */.  
10de0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
10df0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10e00 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b  P_Commit, 0, 0);
10e10 0a 20 20 7d 0a 7d 0a                             .  }.}.