/ Hex Artifact Content
Login

Artifact 60ec4b38c0f158c9f2e4778ef6af13d19af7bfcd:


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 37 20 32 30 30 34 2f 30 35 2f 32 38 20 31  197 2004/05/28 1
0300: 36 3a 30 30 3a 32 32 20 64 72 68 20 45 78 70 20  6:00:22 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 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65   Open the sqlite
3040: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73 74  _master table st
3050: 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73 65  ored in database
3060: 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a   number iDb for.
3070: 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20  ** writing. The 
3080: 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  table is opened 
3090: 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a  using cursor 0..
30a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f  */.void sqlite3O
30b0: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 56  penMasterTable(V
30c0: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 44 62 29  dbe *v, int iDb)
30d0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
30e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
30f0: 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 73  er, iDb, 0);.  s
3100: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3110: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
3120: 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 29   0, MASTER_ROOT)
3130: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3140: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
3150: 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35 29 3b  mColumns, 0, 5);
3160: 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   /* sqlite_maste
3170: 72 20 68 61 73 20 35 20 63 6f 6c 75 6d 6e 73 20  r has 5 columns 
3180: 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  */.}../*.** The 
3190: 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e  token *pName con
31a0: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f  tains the name o
31b0: 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69  f a database (ei
31c0: 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a  ther "main" or.*
31d0: 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  * "temp" or the 
31e0: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
31f0: 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f  hed db). This ro
3200: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
3210: 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68  e.** index of th
3220: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
3230: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
3240: 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  r -1 if the name
3250: 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d db .** does no
3260: 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  t exist..*/.int 
3270: 66 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a  findDb(sqlite3 *
3280: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
3290: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
32a0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
32b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
32c0: 70 4e 61 6d 65 2d 3e 6e 3d 3d 73 74 72 6c 65 6e  pName->n==strlen
32d0: 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d  (db->aDb[i].zNam
32e0: 65 29 20 26 26 20 0a 20 20 20 20 20 20 20 20 30  e) && .        0
32f0: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
3300: 70 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61  p(db->aDb[i].zNa
3310: 6d 65 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  me, pName->z, pN
3320: 61 6d 65 2d 3e 6e 29 20 29 7b 0a 20 20 20 20 20  ame->n) ){.     
3330: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d   return i;.    }
3340: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
3350: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
3360: 72 65 73 6f 6c 76 65 53 63 68 65 6d 61 4e 61 6d  resolveSchemaNam
3370: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
3380: 73 65 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  se, .  Token *pN
3390: 61 6d 65 31 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a  ame1, .  Token *
33a0: 70 4e 61 6d 65 32 2c 20 0a 20 20 54 6f 6b 65 6e  pName2, .  Token
33b0: 20 2a 2a 70 55 6e 71 75 61 6c 0a 29 7b 0a 20 20   **pUnqual.){.  
33c0: 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74  int iDb;.  sqlit
33d0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
33e0: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 4e 61 6d  >db;..  if( pNam
33f0: 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e  e2 && pName2->n>
3400: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
3410: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
3420: 29 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20  );.    *pUnqual 
3430: 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44  = pName2;.    iD
3440: 62 20 3d 20 66 69 6e 64 44 62 28 64 62 2c 20 70  b = findDb(db, p
3450: 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20  Name1);.    if( 
3460: 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73  iDb<0 ){.      s
3470: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3480: 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
3490: 64 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e  database %T", pN
34a0: 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70 50 61  ame1);.      pPa
34b0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
34c0: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
34d0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
34e0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69   assert( db->ini
34f0: 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e  t.iDb==0 || db->
3500: 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20  init.busy );.   
3510: 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e   iDb = db->init.
3520: 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61  iDb;.    *pUnqua
3530: 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a  l = pName1;.  }.
3540: 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a    return iDb;.}.
3550: 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e  ./*.** Begin con
3560: 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20  structing a new 
3570: 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61  table representa
3580: 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  tion in memory. 
3590: 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20   This is.** the 
35a0: 66 69 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c  first of several
35b0: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
35c0: 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64   that get called
35d0: 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20   in response.** 
35e0: 74 6f 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  to a CREATE TABL
35f0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e  E statement.  In
3600: 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69   particular, thi
3610: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
3620: 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65  led.** after see
3630: 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41  ing tokens "CREA
3640: 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20  TE" and "TABLE" 
3650: 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61  and the table na
3660: 6d 65 2e 20 20 54 68 65 0a 2a 2a 20 70 53 74 61  me.  The.** pSta
3670: 72 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20  rt token is the 
3680: 43 52 45 41 54 45 20 61 6e 64 20 70 4e 61 6d 65  CREATE and pName
3690: 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61   is the table na
36a0: 6d 65 2e 20 20 54 68 65 20 69 73 54 65 6d 70 0a  me.  The isTemp.
36b0: 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 20  ** flag is true 
36c0: 69 66 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f  if the table sho
36d0: 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e  uld be stored in
36e0: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64   the auxiliary d
36f0: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
3700: 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68  instead of in th
3710: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
3720: 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e  file.  This is n
3730: 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65  ormally the case
3740: 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45  .** when the "TE
3750: 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52  MP" or "TEMPORAR
3760: 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72  Y" keyword occur
3770: 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20  s in between.** 
3780: 43 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45  CREATE and TABLE
3790: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
37a0: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20  table record is 
37b0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20  initialized and 
37c0: 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70  put in pParse->p
37d0: 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20  NewTable..** As 
37e0: 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45 41  more of the CREA
37f0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
3800: 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20 61 64  nt is parsed, ad
3810: 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a  ditional action.
3820: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c  ** routines will
3830: 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64   be called to ad
3840: 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69  d more informati
3850: 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72  on to this recor
3860: 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  d..** At the end
3870: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
3880: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  ABLE statement, 
3890: 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61  the sqlite3EndTa
38a0: 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  ble() routine.**
38b0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f   is called to co
38c0: 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74  mplete the const
38d0: 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  ruction of the n
38e0: 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e  ew table record.
38f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3900: 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61  StartTable(.  Pa
3910: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
3920: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
3930: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
3940: 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 22 43  art,   /* The "C
3950: 52 45 41 54 45 22 20 74 6f 6b 65 6e 20 2a 2f 0a  REATE" token */.
3960: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
3970: 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
3980: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
3990: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
39a0: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
39b0: 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e  ame2,   /* Secon
39c0: 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  d part of the na
39d0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
39e0: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  or view */.  int
39f0: 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a   isTemp,      /*
3a00: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
3a10: 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f   a TEMP table */
3a20: 0a 20 20 69 6e 74 20 69 73 56 69 65 77 20 20 20  .  int isView   
3a30: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
3a40: 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f  his is a VIEW */
3a50: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
3a60: 62 6c 65 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ble;.  Index *pI
3a70: 64 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  dx;.  char *zNam
3a80: 65 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  e;.  sqlite *db 
3a90: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
3aa0: 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
3ab0: 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  Db;         /* D
3ac0: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 74  atabase number t
3ad0: 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62  o create the tab
3ae0: 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  le in */.  Token
3af0: 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55   *pName;    /* U
3b00: 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
3b10: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
3b20: 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20  create */..  /* 
3b30: 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  The table or vie
3b40: 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61 74 65  w name to create
3b50: 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
3b60: 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74  is routine via t
3b70: 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65  okens.  ** pName
3b80: 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66  1 and pName2. If
3b90: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
3ba0: 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  was fully qualif
3bb0: 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ied, for example
3bc0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41  :.  **.  ** CREA
3bd0: 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79  TE TABLE xxx.yyy
3be0: 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20   (...);.  ** .  
3bf0: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
3c00: 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61  s set to "xxx" a
3c10: 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e  nd pName2 "yyy".
3c20: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
3c30: 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 74  nd if.  ** the t
3c40: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
3c50: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
3c60: 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a  , i.e.:.  **.  *
3c70: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79  * CREATE TABLE y
3c80: 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20  yy(...);.  **.  
3c90: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
3ca0: 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61  s set to "yyy" a
3cb0: 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e  nd pName2 is "".
3cc0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
3cd0: 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73 20 74  all below sets t
3ce0: 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72  he pName pointer
3cf0: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
3d00: 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f   token (pName1 o
3d10: 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74  r.  ** pName2) t
3d20: 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75  hat stores the u
3d30: 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65  nqualified table
3d40: 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72 69 61   name. The varia
3d50: 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a 2a 20  ble iDb is.  ** 
3d60: 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
3d70: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
3d80: 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
3d90: 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20 62 65  or view is to be
3da0: 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e  .  ** created in
3db0: 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20 72  ..  */.  iDb = r
3dc0: 65 73 6f 6c 76 65 53 63 68 65 6d 61 4e 61 6d 65  esolveSchemaName
3dd0: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
3de0: 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
3df0: 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20  ;.  if( iDb<0 ) 
3e00: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 69 73  return;.  if( is
3e10: 54 65 6d 70 20 26 26 20 69 44 62 3e 31 20 29 7b  Temp && iDb>1 ){
3e20: 0a 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74  .    /* If creat
3e30: 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65  ing a temp table
3e40: 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e  , the name may n
3e50: 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65 64 20  ot be qualified 
3e60: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  */.    sqlite3Er
3e70: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3e80: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
3e90: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71  name must be unq
3ea0: 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20  ualified");.    
3eb0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
3ec0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
3ed0: 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 20 69    if( isTemp ) i
3ee0: 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73  Db = 1;..  pPars
3ef0: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20  e->sNameToken = 
3f00: 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20  *pName;.  zName 
3f10: 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4e 61  = sqlite3TableNa
3f20: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
3f30: 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  e);.  if( zName=
3f40: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
3f50: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  f( db->init.iDb=
3f60: 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b  =1 ) isTemp = 1;
3f70: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3f80: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
3f90: 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  ON.  assert( (is
3fa0: 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d  Temp & 1)==isTem
3fb0: 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74  p );.  {.    int
3fc0: 20 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20   code;.    char 
3fd0: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
3fe0: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  Db].zName;.    i
3ff0: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
4000: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
4010: 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
4020: 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c  A_TABLE(isTemp),
4030: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
4040: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
4050: 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
4060: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
4070: 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20   isView ){.     
4080: 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20   if( isTemp ){. 
4090: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
40a0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
40b0: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
40c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
40d0: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
40e0: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20  _VIEW;.      }. 
40f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4100: 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20  if( isTemp ){.  
4110: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
4120: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
4130: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  TABLE;.      }el
4140: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
4150: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
4160: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a  _TABLE;.      }.
4170: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
4180: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
4190: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61  Parse, code, zNa
41a0: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
41b0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
41c0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
41d0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
41e0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66  #endif..  /* Bef
41f0: 6f 72 65 20 74 72 79 69 6e 67 20 74 6f 20 63 72  ore trying to cr
4200: 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  eate a temporary
4210: 20 74 61 62 6c 65 2c 20 6d 61 6b 65 20 73 75 72   table, make sur
4220: 65 20 74 68 65 20 42 74 72 65 65 20 66 6f 72 0a  e the Btree for.
4230: 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 74 65 6d    ** holding tem
4240: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 69 73  porary tables is
4250: 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66   open..  */.  if
4260: 28 20 69 73 54 65 6d 70 20 26 26 20 64 62 2d 3e  ( isTemp && db->
4270: 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26  aDb[1].pBt==0 &&
4280: 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
4290: 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  n ){.    int rc 
42a0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 61  = sqlite3BtreeFa
42b0: 63 74 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c 20  ctory(db, 0, 0, 
42c0: 4d 41 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e  MAX_PAGES, &db->
42d0: 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[1].pBt);.   
42e0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
42f0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
4300: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4310: 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f  se, "unable to o
4320: 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
4330: 64 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20  database ".     
4340: 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f     "file for sto
4350: 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74  ring temporary t
4360: 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70  ables");.      p
4370: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
4380: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
4390: 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66   }.    if( db->f
43a0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
43b0: 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 72  Trans ){.      r
43c0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
43d0: 42 65 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e 61  BeginTrans(db->a
43e0: 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[1].pBt);.    
43f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
4400: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
4410: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4420: 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
4430: 6f 20 67 65 74 20 61 20 77 72 69 74 65 20 6c 6f  o get a write lo
4440: 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20 20 20  ck on ".        
4450: 20 20 22 74 68 65 20 74 65 6d 70 6f 72 61 72 79    "the temporary
4460: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 29   database file")
4470: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
4480: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4490: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
44a0: 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c  ure the new tabl
44b0: 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20  e name does not 
44c0: 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20  collide with an 
44d0: 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e  existing.  ** in
44e0: 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d  dex or table nam
44f0: 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72  e.  Issue an err
4500: 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20 69 74  or message if it
4510: 20 64 6f 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   does..  **.  **
4520: 20 49 66 20 77 65 20 61 72 65 20 72 65 2d 72 65   If we are re-re
4530: 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
4540: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65  _master table be
4550: 63 61 75 73 65 20 6f 66 20 61 20 73 63 68 65 6d  cause of a schem
4560: 61 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20 61 6e  a.  ** change an
4570: 64 20 61 20 6e 65 77 20 70 65 72 6d 61 6e 65 6e  d a new permanen
4580: 74 20 74 61 62 6c 65 20 69 73 20 66 6f 75 6e 64  t table is found
4590: 20 77 68 6f 73 65 20 6e 61 6d 65 20 63 6f 6c 6c   whose name coll
45a0: 69 64 65 73 20 77 69 74 68 0a 20 20 2a 2a 20 61  ides with.  ** a
45b0: 6e 20 65 78 69 73 74 69 6e 67 20 74 65 6d 70 6f  n existing tempo
45c0: 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 61 74  rary table, that
45d0: 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   is not an error
45e0: 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 6c 65 20  ..  */.  pTable 
45f0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
4600: 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  le(db, zName, 0)
4610: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d  ;.  if( pTable!=
4620: 30 20 26 26 20 28 70 54 61 62 6c 65 2d 3e 69 44  0 && (pTable->iD
4630: 62 3d 3d 69 44 62 20 7c 7c 20 21 64 62 2d 3e 69  b==iDb || !db->i
4640: 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20  nit.busy) ){.   
4650: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
4660: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
4670: 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %T already exist
4680: 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  s", pName);.    
4690: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
46a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
46b0: 20 7d 0a 20 20 69 66 28 20 28 70 49 64 78 20 3d   }.  if( (pIdx =
46c0: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
46d0: 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29  x(db, zName, 0))
46e0: 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20  !=0 &&.         
46f0: 20 28 70 49 64 78 2d 3e 69 44 62 3d 3d 30 20 7c   (pIdx->iDb==0 |
4700: 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  | !db->init.busy
4710: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
4720: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4730: 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
4740: 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65  dy an index name
4750: 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  d %s", zName);. 
4760: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
4770: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
4780: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d  ;.  }.  pTable =
4790: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
47a0: 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a  izeof(Table) );.
47b0: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
47c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
47d0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  e(zName);.    re
47e0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62  turn;.  }.  pTab
47f0: 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  le->zName = zNam
4800: 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  e;.  pTable->nCo
4810: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  l = 0;.  pTable-
4820: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  >aCol = 0;.  pTa
4830: 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  ble->iPKey = -1;
4840: 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  .  pTable->pInde
4850: 78 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  x = 0;.  pTable-
4860: 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 69 66  >iDb = iDb;.  if
4870: 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ( pParse->pNewTa
4880: 62 6c 65 20 29 20 73 71 6c 69 74 65 33 44 65 6c  ble ) sqlite3Del
4890: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 50 61  eteTable(db, pPa
48a0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b  rse->pNewTable);
48b0: 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
48c0: 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a  able = pTable;..
48d0: 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
48e0: 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74  ating the code t
48f0: 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20  hat will insert 
4900: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
4910: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53   into.  ** the S
4920: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
4930: 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72  le.  Note in par
4940: 74 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20  ticular that we 
4950: 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20  must go ahead.  
4960: 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  ** and allocate 
4970: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
4980: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
4990: 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f  entry now.  Befo
49a0: 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d  re any.  ** PRIM
49b0: 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
49c0: 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70  E keywords are p
49d0: 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65  arsed.  Those ke
49e0: 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73  ywords will caus
49f0: 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74  e.  ** indices t
4a00: 6f 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64  o be created and
4a10: 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72   the table recor
4a20: 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f  d must come befo
4a30: 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64  re the .  ** ind
4a40: 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68  ices.  Hence, th
4a50: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
4a60: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75  for the table mu
4a70: 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a  st be allocated.
4a80: 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20    ** now..  */. 
4a90: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
4aa0: 75 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69  usy && (v = sqli
4ab0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
4ac0: 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  e))!=0 ){.    sq
4ad0: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
4ae0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
4af0: 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66   0, iDb);.    if
4b00: 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  ( !isTemp ){.   
4b10: 20 20 20 2f 2a 20 45 76 65 72 79 20 74 69 6d 65     /* Every time
4b20: 20 61 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20   a new table is 
4b30: 63 72 65 61 74 65 64 20 74 68 65 20 66 69 6c 65  created the file
4b40: 2d 66 6f 72 6d 61 74 0a 20 20 20 20 20 20 2a 2a  -format.      **
4b50: 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 6d 65   and encoding me
4b60: 74 61 2d 76 61 6c 75 65 73 20 61 72 65 20 73 65  ta-values are se
4b70: 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
4b80: 65 2c 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 63  e, in.      ** c
4b90: 61 73 65 20 74 68 69 73 20 69 73 20 74 68 65 20  ase this is the 
4ba0: 66 69 72 73 74 20 74 61 62 6c 65 20 63 72 65 61  first table crea
4bb0: 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ted..      */.  
4bc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4bd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
4be0: 65 72 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72  er, db->file_for
4bf0: 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  mat, 0);.      s
4c00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4c10: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
4c20: 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20   iDb, 1);.      
4c30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4c40: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
4c50: 64 62 2d 3e 65 6e 63 2c 20 30 29 3b 0a 20 20 20  db->enc, 0);.   
4c60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4c70: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  dOp(v, OP_SetCoo
4c80: 6b 69 65 2c 20 69 44 62 2c 20 34 29 3b 0a 20 20  kie, iDb, 4);.  
4c90: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
4ca0: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76  penMasterTable(v
4cb0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
4cc0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4cd0: 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20  OP_NewRecno, 0, 
4ce0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
4cf0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
4d00: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  up, 0, 0);.    s
4d10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4d20: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
4d30: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
4d40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4d50: 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29  PutIntKey, 0, 0)
4d60: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
4d70: 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20  dd a new column 
4d80: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
4d90: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
4da0: 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  structed..**.** 
4db0: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
4dc0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
4dd0: 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ce for each colu
4de0: 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  mn declaration.*
4df0: 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  * in a CREATE TA
4e00: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
4e10: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
4e20: 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a  e() gets called.
4e30: 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20  ** first to get 
4e40: 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54  things going.  T
4e50: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
4e60: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65   is called for e
4e70: 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a  ach.** column..*
4e80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
4e90: 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70  dColumn(Parse *p
4ea0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
4eb0: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
4ec0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
4ed0: 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 43 6f 6c 75  r *z = 0;.  Colu
4ee0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20  mn *pCol;.  if( 
4ef0: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
4f00: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
4f10: 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  urn;.  sqlite3Se
4f20: 74 4e 53 74 72 69 6e 67 28 26 7a 2c 20 70 4e 61  tNString(&z, pNa
4f30: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c  me->z, pName->n,
4f40: 20 30 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20   0);.  if( z==0 
4f50: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
4f60: 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20  te3Dequote(z);. 
4f70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
4f80: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
4f90: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
4fa0: 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  p(z, p->aCol[i].
4fb0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
4fc0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
4fd0: 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c  sg(pParse, "dupl
4fe0: 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  icate column nam
4ff0: 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  e: %s", z);.    
5000: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
5010: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
5020: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28     }.  }.  if( (
5030: 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d  p->nCol & 0x7)==
5040: 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  0 ){.    Column 
5050: 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20  *aNew;.    aNew 
5060: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
5070: 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43   p->aCol, (p->nC
5080: 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e  ol+8)*sizeof(p->
5090: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69  aCol[0]));.    i
50a0: 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( aNew==0 ) ret
50b0: 75 72 6e 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c  urn;.    p->aCol
50c0: 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = aNew;.  }.  p
50d0: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70  Col = &p->aCol[p
50e0: 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65  ->nCol];.  memse
50f0: 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(pCol, 0, sizeo
5100: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
5110: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
5120: 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65  z;. .  /* If the
5130: 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70  re is no type sp
5140: 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73  ecified, columns
5150: 20 68 61 76 65 20 74 68 65 20 64 65 66 61 75 6c   have the defaul
5160: 74 20 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20  t affinity.  ** 
5170: 27 4e 55 4d 45 52 49 43 27 2e 20 49 66 20 74 68  'NUMERIC'. If th
5180: 65 72 65 20 69 73 20 61 20 74 79 70 65 20 73 70  ere is a type sp
5190: 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73 71  ecified, then sq
51a0: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79  lite3AddColumnTy
51b0: 70 65 28 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  pe().  ** will b
51c0: 65 20 63 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f  e called next to
51d0: 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e   set pCol->affin
51e0: 69 74 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20  ity correctly.. 
51f0: 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69   */.  pCol->affi
5200: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
5210: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 70 43 6f  F_NUMERIC;.  pCo
5220: 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73  l->pColl = pPars
5230: 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
5240: 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d  ;.  p->nCol++;.}
5250: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5260: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
5270: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
5280: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
5290: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
52a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
52b0: 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54  atement.  A "NOT
52c0: 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e   NULL" constrain
52d0: 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65  t has.** been se
52e0: 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20  en on a column. 
52f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
5300: 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66  ts the notNull f
5310: 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f  lag on.** the co
5320: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
5330: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
5340: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
5350: 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72  e3AddNotNull(Par
5360: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
5370: 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c  onError){.  Tabl
5380: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
5390: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
53a0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
53b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
53c0: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
53d0: 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b   i>=0 ) p->aCol[
53e0: 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45  i].notNull = onE
53f0: 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rror;.}../*.** T
5400: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
5410: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
5420: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
5430: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
5440: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
5450: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
5460: 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65   The pFirst toke
5470: 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  n is the first.*
5480: 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73  * token in the s
5490: 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e  equence of token
54a0: 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20  s that describe 
54b0: 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a  the type of the.
54c0: 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e  ** column curren
54d0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
54e0: 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20  uction.   pLast 
54f0: 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65  is the last toke
5500: 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75  n.** in the sequ
5510: 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20  ence.  Use this 
5520: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63  information to c
5530: 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e  onstruct a strin
5540: 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69  g.** that contai
5550: 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20  ns the typename 
5560: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e  of the column an
5570: 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72  d store that str
5580: 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e  ing.** in zType.
5590: 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  .*/ .void sqlite
55a0: 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50  3AddColumnType(P
55b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
55c0: 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b  ken *pFirst, Tok
55d0: 65 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20 54 61  en *pLast){.  Ta
55e0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 2c  ble *p;.  int i,
55f0: 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63   j;.  int n;.  c
5600: 68 61 72 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20 20  har *z, **pz;.  
5610: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
5620: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
5630: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
5640: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
5650: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20  ->nCol-1;.  if( 
5660: 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  i<0 ) return;.  
5670: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
5680: 69 5d 3b 0a 20 20 70 7a 20 3d 20 26 70 43 6f 6c  i];.  pz = &pCol
5690: 2d 3e 7a 54 79 70 65 3b 0a 20 20 6e 20 3d 20 70  ->zType;.  n = p
56a0: 4c 61 73 74 2d 3e 6e 20 2b 20 41 64 64 72 28 70  Last->n + Addr(p
56b0: 4c 61 73 74 2d 3e 7a 29 20 2d 20 41 64 64 72 28  Last->z) - Addr(
56c0: 70 46 69 72 73 74 2d 3e 7a 29 3b 0a 20 20 73 71  pFirst->z);.  sq
56d0: 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28  lite3SetNString(
56e0: 70 7a 2c 20 70 46 69 72 73 74 2d 3e 7a 2c 20 6e  pz, pFirst->z, n
56f0: 2c 20 30 29 3b 0a 20 20 7a 20 3d 20 2a 70 7a 3b  , 0);.  z = *pz;
5700: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
5710: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  turn;.  for(i=j=
5720: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
5730: 20 20 20 69 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b     int c = z[i];
5740: 0a 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65  .    if( isspace
5750: 28 63 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  (c) ) continue;.
5760: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a      z[j++] = c;.
5770: 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a    }.  z[j] = 0;.
5780: 2f 2f 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72  //  pCol->sortOr
5790: 64 65 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c  der = sqlite3Col
57a0: 6c 61 74 65 54 79 70 65 28 7a 2c 20 6e 29 3b 0a  lateType(z, n);.
57b0: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
57c0: 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69   = sqlite3Affini
57d0: 74 79 54 79 70 65 28 7a 2c 20 6e 29 3b 0a 7d 0a  tyType(z, n);.}.
57e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67 69 76 65 6e  ./*.** The given
57f0: 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 64 65   token is the de
5800: 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
5810: 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
5820: 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20  added to.** the 
5830: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
5840: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
5850: 6f 6e 2e 20 20 49 66 20 22 6d 69 6e 75 73 46 6c  on.  If "minusFl
5860: 61 67 22 20 69 73 20 74 72 75 65 2c 20 69 74 0a  ag" is true, it.
5870: 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 76 61 6c  ** means the val
5880: 75 65 20 74 6f 6b 65 6e 20 77 61 73 20 70 72 65  ue token was pre
5890: 63 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73  ceded by a minus
58a0: 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   sign..**.** Thi
58b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
58c0: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
58d0: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
58e0: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
58f0: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
5900: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  LE statement..*/
5910: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
5920: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72  DefaultValue(Par
5930: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
5940: 6e 20 2a 70 56 61 6c 2c 20 69 6e 74 20 6d 69 6e  n *pVal, int min
5950: 75 73 46 6c 61 67 29 7b 0a 20 20 54 61 62 6c 65  usFlag){.  Table
5960: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
5970: 63 68 61 72 20 2a 2a 70 7a 3b 0a 20 20 69 66 28  char **pz;.  if(
5980: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
5990: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
59a0: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
59b0: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30  Col-1;.  if( i<0
59c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 7a 20   ) return;.  pz 
59d0: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44  = &p->aCol[i].zD
59e0: 66 6c 74 3b 0a 20 20 69 66 28 20 6d 69 6e 75 73  flt;.  if( minus
59f0: 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  Flag ){.    sqli
5a00: 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a  te3SetNString(pz
5a10: 2c 20 22 2d 22 2c 20 31 2c 20 70 56 61 6c 2d 3e  , "-", 1, pVal->
5a20: 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a  z, pVal->n, 0);.
5a30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
5a40: 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 70  ite3SetNString(p
5a50: 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c  z, pVal->z, pVal
5a60: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  ->n, 0);.  }.  s
5a70: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 2a 70  qlite3Dequote(*p
5a80: 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  z);.}../*.** Des
5a90: 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41  ignate the PRIMA
5aa0: 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74  RY KEY for the t
5ab0: 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20  able.  pList is 
5ac0: 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  a list of names 
5ad0: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  .** of columns t
5ae0: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69  hat form the pri
5af0: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c  mary key.  If pL
5b00: 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ist is NULL, the
5b10: 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  n the.** most re
5b20: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
5b30: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
5b40: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
5b50: 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62  key..**.** A tab
5b60: 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d  le can have at m
5b70: 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  ost one primary 
5b80: 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62  key.  If the tab
5b90: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a  le already has.*
5ba0: 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  * a primary key 
5bb0: 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65  (and this is the
5bc0: 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20   second primary 
5bd0: 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65  key) then create
5be0: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a   an.** error..**
5bf0: 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41  .** If the PRIMA
5c00: 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73  RY KEY is on a s
5c10: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f  ingle column who
5c20: 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49  se datatype is I
5c30: 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20  NTEGER,.** then 
5c40: 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75  we will try to u
5c50: 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  se that column a
5c60: 73 20 74 68 65 20 72 6f 77 20 69 64 2e 20 20 28  s the row id.  (
5c70: 45 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a 20 46 6f  Exception:.** Fo
5c80: 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  r backwards comp
5c90: 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f  atibility with o
5ca0: 6c 64 65 72 20 64 61 74 61 62 61 73 65 73 2c 20  lder databases, 
5cb0: 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 2a  do not do this.*
5cc0: 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 66 6f  * if the file fo
5cd0: 72 6d 61 74 20 76 65 72 73 69 6f 6e 20 6e 75 6d  rmat version num
5ce0: 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ber is less than
5cf0: 20 31 2e 29 20 20 53 65 74 20 74 68 65 20 54 61   1.)  Set the Ta
5d00: 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65  ble.iPKey.** fie
5d10: 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ld of the table 
5d20: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
5d30: 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64  on to be the ind
5d40: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54  ex of the.** INT
5d50: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
5d60: 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e   column.  Table.
5d70: 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20  iPKey is set to 
5d80: 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a  -1 if there is.*
5d90: 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49  * no INTEGER PRI
5da0: 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20  MARY KEY..**.** 
5db0: 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f  If the key is no
5dc0: 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  t an INTEGER PRI
5dd0: 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63  MARY KEY, then c
5de0: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a  reate a unique.*
5df0: 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20  * index for the 
5e00: 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69  key.  No index i
5e10: 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e  s created for IN
5e20: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
5e30: 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Ys..*/.void sqli
5e40: 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79  te3AddPrimaryKey
5e50: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5e60: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69  IdList *pList, i
5e70: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54  nt onError){.  T
5e80: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
5e90: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
5ea0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
5eb0: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
5ec0: 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70 54 61  -1, i;.  if( pTa
5ed0: 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 69 6d  b==0 ) goto prim
5ee0: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20  ary_key_exit;.  
5ef0: 69 66 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69  if( pTab->hasPri
5f00: 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  mKey ){.    sqli
5f10: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5f20: 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c  se, .      "tabl
5f30: 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72  e \"%s\" has mor
5f40: 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61  e than one prima
5f50: 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a  ry key", pTab->z
5f60: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
5f70: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
5f80: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61  ;.  }.  pTab->ha
5f90: 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20  sPrimKey = 1;.  
5fa0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
5fb0: 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
5fc0: 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70  >nCol - 1;.    p
5fd0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
5fe0: 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20  isPrimKey = 1;. 
5ff0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
6000: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
6010: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  d; i++){.      f
6020: 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
6030: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
6040: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
6050: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
6060: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
6070: 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  e, pTab->aCol[iC
6080: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  ol].zName)==0 ){
6090: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
60a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
60b0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43    }.      if( iC
60c0: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 20  ol<pTab->nCol ) 
60d0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
60e0: 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a  .isPrimKey = 1;.
60f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
6100: 69 73 74 2d 3e 6e 49 64 3e 31 20 29 20 69 43 6f  ist->nId>1 ) iCo
6110: 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66  l = -1;.  }.  if
6120: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f  ( iCol>=0 && iCo
6130: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  l<pTab->nCol ){.
6140: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
6150: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
6160: 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54  pe;.  }.  if( zT
6170: 79 70 65 20 26 26 20 73 71 6c 69 74 65 33 53 74  ype && sqlite3St
6180: 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e  rICmp(zType, "IN
6190: 54 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20  TEGER")==0 ){.  
61a0: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
61b0: 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e  iCol;.    pTab->
61c0: 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f  keyConf = onErro
61d0: 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  r;.  }else{.    
61e0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
61f0: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
6200: 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72   0, pList, onErr
6210: 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70  or, 0, 0);.    p
6220: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70  List = 0;.  }..p
6230: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a  rimary_key_exit:
6240: 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  .  sqlite3IdList
6250: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
6260: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
6270: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
6280: 65 72 20 74 6f 20 43 6f 6c 6c 53 65 71 20 67 69  er to CollSeq gi
6290: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
62a0: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
62b0: 65 6e 63 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ence..** If the 
62c0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
62d0: 63 65 20 64 69 64 20 6e 6f 74 20 70 72 65 76 69  ce did not previ
62e0: 6f 75 73 6c 79 20 65 78 69 73 74 2c 20 63 72 65  ously exist, cre
62f0: 61 74 65 20 69 74 20 62 75 74 0a 2a 2a 20 61 73  ate it but.** as
6300: 73 69 67 6e 20 69 74 20 61 6e 20 4e 55 4c 4c 20  sign it an NULL 
6310: 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
6320: 69 6f 6e 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  ion..*/.CollSeq 
6330: 2a 73 71 6c 69 74 65 33 43 6f 6c 6c 61 74 65 54  *sqlite3CollateT
6340: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
6350: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
6360: 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70 65 29  Type, int nType)
6370: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
6380: 6c 6c 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  ll;.  sqlite *db
6390: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
63a0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
63b0: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
63c0: 43 6f 6c 6c 53 65 71 2c 20 7a 54 79 70 65 2c 20  CollSeq, zType, 
63d0: 6e 54 79 70 65 29 3b 0a 20 20 69 66 28 20 70 43  nType);.  if( pC
63e0: 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  oll==0 ){.    sq
63f0: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6c 6c 61  lite3ChangeColla
6400: 74 69 6e 67 46 75 6e 63 74 69 6f 6e 28 64 62 2c  tingFunction(db,
6410: 20 7a 54 79 70 65 2c 20 6e 54 79 70 65 2c 20 30   zType, nType, 0
6420: 2c 20 30 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  , 0);.    pColl 
6430: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
6440: 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c  d(&db->aCollSeq,
6450: 20 7a 54 79 70 65 2c 20 6e 54 79 70 65 29 3b 0a   zType, nType);.
6460: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f    }.  return pCo
6470: 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ll;.}../*.** Set
6480: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
6490: 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  unction of the m
64a0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72  ost recently par
64b0: 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  sed table column
64c0: 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53  .** to the CollS
64d0: 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69  eq given..*/.voi
64e0: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c  d sqlite3AddColl
64f0: 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70  ateType(Parse *p
6500: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
6510: 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54  r *zType, int nT
6520: 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ype){.  Table *p
6530: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
6540: 6c 6c 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  ll;.  sqlite *db
6550: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
6560: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
6570: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
6580: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f   ) return;.  pCo
6590: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ll = sqlite3Hash
65a0: 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53  Find(&db->aCollS
65b0: 65 71 2c 20 7a 54 79 70 65 2c 20 6e 54 79 70 65  eq, zType, nType
65c0: 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d  );.  if( pColl==
65d0: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  0 ){.    pColl =
65e0: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
65f0: 6c 6c 61 74 69 6e 67 46 75 6e 63 74 69 6f 6e 28  llatingFunction(
6600: 64 62 2c 20 7a 54 79 70 65 2c 20 6e 54 79 70 65  db, zType, nType
6610: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  , 0, 0);.  }.  i
6620: 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
6630: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d  p->aCol[p->nCol-
6640: 31 5d 2e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c  1].pColl = pColl
6650: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
6660: 72 65 61 74 65 20 6f 72 20 6d 6f 64 69 66 79 20  reate or modify 
6670: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
6680: 65 6e 63 65 20 65 6e 74 72 79 20 69 6e 20 74 68  ence entry in th
6690: 65 20 73 71 6c 69 74 65 2e 61 43 6f 6c 6c 53 65  e sqlite.aCollSe
66a0: 71 0a 2a 2a 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  q.** table..**.*
66b0: 2a 20 4f 6e 63 65 20 61 6e 20 65 6e 74 72 79 20  * Once an entry 
66c0: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
66d0: 73 71 6c 69 74 65 2e 61 43 6f 6c 6c 53 65 71 20  sqlite.aCollSeq 
66e0: 74 61 62 6c 65 2c 20 69 74 20 63 61 6e 20 6e 65  table, it can ne
66f0: 76 65 72 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65  ver.** be remove
6700: 64 2c 20 74 68 6f 75 67 68 20 69 73 20 63 6f 6d  d, though is com
6710: 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
6720: 20 6f 72 20 75 73 65 72 20 64 61 74 61 20 63 61   or user data ca
6730: 6e 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  n be changed..**
6740: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
6750: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c  nter to the coll
6760: 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 74  ating function t
6770: 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20  hat was created 
6780: 6f 72 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a  or modified..*/.
6790: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
67a0: 43 68 61 6e 67 65 43 6f 6c 6c 61 74 69 6e 67 46  ChangeCollatingF
67b0: 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
67c0: 65 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  e *db,          
67d0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
67e0: 6e 74 6f 20 77 68 69 63 68 20 74 6f 20 69 6e 73  nto which to ins
67f0: 65 72 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ert the collatio
6800: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
6810: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 2f  r *zName,      /
6820: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
6830: 6c 6c 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  llation */.  int
6840: 20 6e 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20   nName,         
6850: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6860: 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
6870: 7a 4e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20  zName */.  void 
6880: 2a 70 55 73 65 72 2c 20 20 20 20 20 20 20 20 20  *pUser,         
6890: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
68a0: 6d 65 6e 74 20 74 6f 20 78 43 6d 70 20 2a 2f 0a  ment to xCmp */.
68b0: 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 76 6f    int (*xCmp)(vo
68c0: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
68d0: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
68e0: 69 64 2a 29 20 2f 2a 20 43 6f 6d 70 61 72 69 73  id*) /* Comparis
68f0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29  on function */.)
6900: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
6910: 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73  ll;..  pColl = s
6920: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
6930: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e  db->aCollSeq, zN
6940: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 69  ame, nName);.  i
6950: 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20  f( pColl==0 ){. 
6960: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
6970: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65  eMallocRaw( size
6980: 6f 66 28 2a 70 43 6f 6c 6c 29 20 2b 20 6e 4e 61  of(*pColl) + nNa
6990: 6d 65 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66  me + 1 );.    if
69a0: 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ( pColl==0 ){.  
69b0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
69c0: 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 7a    }.    pColl->z
69d0: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
69e0: 43 6f 6c 6c 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d  Coll[1];.    mem
69f0: 63 70 79 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  cpy(pColl->zName
6a00: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31  , zName, nName+1
6a10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61  );.    sqlite3Ha
6a20: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 43  shInsert(&db->aC
6a30: 6f 6c 6c 53 65 71 2c 20 70 43 6f 6c 6c 2d 3e 7a  ollSeq, pColl->z
6a40: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 70 43 6f  Name, nName, pCo
6a50: 6c 6c 29 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 6c  ll);.  }.  pColl
6a60: 2d 3e 70 55 73 65 72 20 3d 20 70 55 73 65 72 3b  ->pUser = pUser;
6a70: 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d  .  pColl->xCmp =
6a80: 20 78 43 6d 70 3b 0a 20 20 72 65 74 75 72 6e 20   xCmp;.  return 
6a90: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pColl;.}../*.** 
6aa0: 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Scan the column 
6ab0: 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20  type name zType 
6ac0: 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61  (length nType) a
6ad0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a  nd return the.**
6ae0: 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66 69   associated affi
6af0: 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2f 0a 63 68  nity type..*/.ch
6b00: 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69  ar sqlite3Affini
6b10: 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61  tyType(const cha
6b20: 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54  r *zType, int nT
6b30: 79 70 65 29 7b 0a 20 20 69 6e 74 20 6e 2c 20 69  ype){.  int n, i
6b40: 3b 0a 20 20 73 74 72 75 63 74 20 7b 0a 20 20 20  ;.  struct {.   
6b50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 75   const char *zSu
6b60: 62 3b 20 20 2f 2a 20 4b 65 79 77 6f 72 64 73 20  b;  /* Keywords 
6b70: 73 75 62 73 74 72 69 6e 67 20 74 6f 20 73 65 61  substring to sea
6b80: 72 63 68 20 66 6f 72 20 2a 2f 0a 20 20 20 20 69  rch for */.    i
6b90: 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20  nt nSub;        
6ba0: 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 7a    /* length of z
6bb0: 53 75 62 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  Sub */.    char 
6bc0: 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 2f 2a  affinity;     /*
6bd0: 20 41 66 66 69 6e 69 74 79 20 74 6f 20 72 65 74   Affinity to ret
6be0: 75 72 6e 20 69 66 20 69 74 20 6d 61 74 63 68 65  urn if it matche
6bf0: 73 20 2a 2f 0a 20 20 7d 20 73 75 62 73 74 72 69  s */.  } substri
6c00: 6e 67 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 22  ngs[] = {.    {"
6c10: 49 4e 54 22 2c 20 20 33 2c 20 53 51 4c 49 54 45  INT",  3, SQLITE
6c20: 5f 41 46 46 5f 49 4e 54 45 47 45 52 7d 2c 0a 20  _AFF_INTEGER},. 
6c30: 20 20 20 7b 22 43 48 41 52 22 2c 20 34 2c 20 53     {"CHAR", 4, S
6c40: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c  QLITE_AFF_TEXT},
6c50: 0a 20 20 20 20 7b 22 43 4c 4f 42 22 2c 20 34 2c  .    {"CLOB", 4,
6c60: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
6c70: 7d 2c 0a 20 20 20 20 7b 22 54 45 58 54 22 2c 20  },.    {"TEXT", 
6c80: 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  4, SQLITE_AFF_TE
6c90: 58 54 7d 2c 0a 20 20 20 20 7b 22 42 4c 4f 42 22  XT},.    {"BLOB"
6ca0: 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  , 4, SQLITE_AFF_
6cb0: 4e 4f 4e 45 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 66  NONE},.  };..  f
6cc0: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
6cd0: 28 73 75 62 73 74 72 69 6e 67 73 29 2f 73 69 7a  (substrings)/siz
6ce0: 65 6f 66 28 73 75 62 73 74 72 69 6e 67 73 5b 30  eof(substrings[0
6cf0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ]); i++){.    in
6d00: 74 20 63 31 20 3d 20 73 75 62 73 74 72 69 6e 67  t c1 = substring
6d10: 73 5b 69 5d 2e 7a 53 75 62 5b 30 5d 3b 0a 20 20  s[i].zSub[0];.  
6d20: 20 20 69 6e 74 20 63 32 20 3d 20 74 6f 6c 6f 77    int c2 = tolow
6d30: 65 72 28 63 31 29 3b 0a 20 20 20 20 69 6e 74 20  er(c1);.    int 
6d40: 6c 69 6d 69 74 20 3d 20 6e 54 79 70 65 20 2d 20  limit = nType - 
6d50: 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 6e 53  substrings[i].nS
6d60: 75 62 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ub;.    const ch
6d70: 61 72 20 2a 7a 20 3d 20 73 75 62 73 74 72 69 6e  ar *z = substrin
6d80: 67 73 5b 69 5d 2e 7a 53 75 62 3b 0a 20 20 20 20  gs[i].zSub;.    
6d90: 66 6f 72 28 6e 3d 30 3b 20 6e 3c 3d 6c 69 6d 69  for(n=0; n<=limi
6da0: 74 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69  t; n++){.      i
6db0: 6e 74 20 63 20 3d 20 7a 54 79 70 65 5b 6e 5d 3b  nt c = zType[n];
6dc0: 0a 20 20 20 20 20 20 69 66 28 20 28 63 3d 3d 63  .      if( (c==c
6dd0: 31 20 7c 7c 20 63 3d 3d 63 32 29 0a 20 20 20 20  1 || c==c2).    
6de0: 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73           && 0==s
6df0: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 26  qlite3StrNICmp(&
6e00: 7a 54 79 70 65 5b 6e 5d 2c 20 7a 2c 20 73 75 62  zType[n], z, sub
6e10: 73 74 72 69 6e 67 73 5b 69 5d 2e 6e 53 75 62 29  strings[i].nSub)
6e20: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
6e30: 72 6e 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d  rn substrings[i]
6e40: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  .affinity;.     
6e50: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
6e60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
6e70: 5f 4e 55 4d 45 52 49 43 3b 0a 7d 0a 0a 2f 2a 0a  _NUMERIC;.}../*.
6e80: 2a 2a 20 43 6f 6d 65 20 75 70 20 77 69 74 68 20  ** Come up with 
6e90: 61 20 6e 65 77 20 72 61 6e 64 6f 6d 20 76 61 6c  a new random val
6ea0: 75 65 20 66 6f 72 20 74 68 65 20 73 63 68 65 6d  ue for the schem
6eb0: 61 20 63 6f 6f 6b 69 65 2e 20 20 4d 61 6b 65 20  a cookie.  Make 
6ec0: 73 75 72 65 0a 2a 2a 20 74 68 65 20 6e 65 77 20  sure.** the new 
6ed0: 76 61 6c 75 65 20 69 73 20 64 69 66 66 65 72 65  value is differe
6ee0: 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 6c 64 2e  nt from the old.
6ef0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d  .**.** The schem
6f00: 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64  a cookie is used
6f10: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
6f20: 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f  en the schema fo
6f30: 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  r the.** databas
6f40: 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65  e changes.  Afte
6f50: 72 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68  r each schema ch
6f60: 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65  ange, the cookie
6f70: 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65   value.** change
6f80: 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65  s.  When a proce
6f90: 73 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74  ss first reads t
6fa0: 68 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63  he schema it rec
6fb0: 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b  ords the.** cook
6fc0: 69 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c  ie.  Thereafter,
6fd0: 20 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65   whenever it goe
6fe0: 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  s to access the 
6ff0: 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20  database,.** it 
7000: 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69  checks the cooki
7010: 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
7020: 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f  he schema has no
7030: 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e  t changed.** sin
7040: 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72  ce it was last r
7050: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ead..**.** This 
7060: 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70  plan is not comp
7070: 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72  letely bullet-pr
7080: 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73  oof.  It is poss
7090: 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  ible for.** the 
70a0: 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65  schema to change
70b0: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
70c0: 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b  and for the cook
70d0: 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20  ie to be.** set 
70e0: 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61  back to prior va
70f0: 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61  lue.  But schema
7100: 20 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66   changes are inf
7110: 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74  requent.** and t
7120: 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
7130: 66 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61  f hitting the sa
7140: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  me cookie value 
7150: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61  is only.** 1 cha
7160: 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f  nce in 2^32.  So
7170: 20 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75   we're safe enou
7180: 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  gh..*/.void sqli
7190: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
71a0: 73 71 6c 69 74 65 20 2a 64 62 2c 20 56 64 62 65  sqlite *db, Vdbe
71b0: 20 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20   *v, int iDb){. 
71c0: 20 69 66 28 20 64 62 2d 3e 6e 65 78 74 5f 63 6f   if( db->next_co
71d0: 6f 6b 69 65 3d 3d 64 62 2d 3e 61 44 62 5b 30 5d  okie==db->aDb[0]
71e0: 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 29  .schema_cookie )
71f0: 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  {.    unsigned c
7200: 68 61 72 20 72 3b 0a 20 20 20 20 73 71 6c 69 74  har r;.    sqlit
7210: 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 31 2c 20  e3Randomness(1, 
7220: 26 72 29 3b 0a 20 20 20 20 64 62 2d 3e 6e 65 78  &r);.    db->nex
7230: 74 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 61  t_cookie = db->a
7240: 44 62 5b 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f  Db[0].schema_coo
7250: 6b 69 65 20 2b 20 72 20 2b 20 31 3b 0a 20 20 20  kie + r + 1;.   
7260: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
7270: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
7280: 65 73 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  es;.    sqlite3V
7290: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
72a0: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 6e 65 78 74  nteger, db->next
72b0: 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20  _cookie, 0);.   
72c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
72d0: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
72e0: 65 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 7d 0a  e, iDb, 0);.  }.
72f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65  }../*.** Measure
7300: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
7310: 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65 64  haracters needed
7320: 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67   to output the g
7330: 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69  iven.** identifi
7340: 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  er.  The number 
7350: 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65  returned include
7360: 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65  s any quotes use
7370: 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f  d.** but does no
7380: 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75  t include the nu
7390: 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a  ll terminator..*
73a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65  /.static int ide
73b0: 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63  ntLength(const c
73c0: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e  har *z){.  int n
73d0: 3b 0a 20 20 69 6e 74 20 6e 65 65 64 51 75 6f 74  ;.  int needQuot
73e0: 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6e 3d 30  e = 0;.  for(n=0
73f0: 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b  ; *z; n++, z++){
7400: 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 27  .    if( *z=='\'
7410: 27 20 29 7b 20 6e 2b 2b 3b 20 6e 65 65 64 51 75  ' ){ n++; needQu
7420: 6f 74 65 3d 31 3b 20 7d 0a 20 20 7d 0a 20 20 72  ote=1; }.  }.  r
7430: 65 74 75 72 6e 20 6e 20 2b 20 6e 65 65 64 51 75  eturn n + needQu
7440: 6f 74 65 2a 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ote*2;.}../*.** 
7450: 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69 66  Write an identif
7460: 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ier onto the end
7470: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73 74   of the given st
7480: 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75  ring.  Add.** qu
7490: 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20 61  ote characters a
74a0: 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  s needed..*/.sta
74b0: 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75  tic void identPu
74c0: 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a  t(char *z, int *
74d0: 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 49 64 65  pIdx, char *zIde
74e0: 6e 74 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  nt){.  int i, j,
74f0: 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20   needQuote;.  i 
7500: 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a  = *pIdx;.  for(j
7510: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
7520: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73  ++){.    if( !is
7530: 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29  alnum(zIdent[j])
7540: 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27   && zIdent[j]!='
7550: 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  _' ) break;.  }.
7560: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a    needQuote =  z
7570: 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69  Ident[j]!=0 || i
7580: 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d  sdigit(zIdent[0]
7590: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
75a0: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65      || sqlite3Ke
75b0: 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74  ywordCode(zIdent
75c0: 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69  , j)!=TK_ID;.  i
75d0: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
75e0: 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  [i++] = '\'';.  
75f0: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
7600: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b  j]; j++){.    z[
7610: 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d  i++] = zIdent[j]
7620: 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74  ;.    if( zIdent
7630: 5b 6a 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b 69 2b  [j]=='\'' ) z[i+
7640: 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a 20  +] = '\'';.  }. 
7650: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
7660: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a   z[i++] = '\'';.
7670: 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70    z[i] = 0;.  *p
7680: 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  Idx = i;.}../*.*
7690: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45  * Generate a CRE
76a0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
76b0: 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20  ent appropriate 
76c0: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
76d0: 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20   table.  Memory 
76e0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74  to hold the text
76f0: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
7700: 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  t is obtained.**
7710: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
7720: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
7730: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
7740: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
7750: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
7760: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
7770: 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Table *p){.  int
7780: 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72   i, k, n;.  char
7790: 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20   *zStmt;.  char 
77a0: 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a  *zSep, *zSep2, *
77b0: 7a 45 6e 64 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  zEnd;.  n = 0;. 
77c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
77d0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  Col; i++){.    n
77e0: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
77f0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
7800: 29 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64  );.  }.  n += id
7810: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61  entLength(p->zNa
7820: 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 34 30 20  me);.  if( n<40 
7830: 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22  ){.    zSep = ""
7840: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
7850: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29  ";.    zEnd = ")
7860: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
7870: 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20  zSep = "\n  ";. 
7880: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20     zSep2 = ",\n 
7890: 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22   ";.    zEnd = "
78a0: 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d  \n)";.  }.  n +=
78b0: 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b   35 + 6*p->nCol;
78c0: 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  zStmt = sqlit
78d0: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b  eMallocRaw( n );
78e0: 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20  .  if( zStmt==0 
78f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 74  ) return 0;.  st
7900: 72 63 70 79 28 7a 53 74 6d 74 2c 20 70 2d 3e 69  rcpy(zStmt, p->i
7910: 44 62 3d 3d 31 20 3f 20 22 43 52 45 41 54 45 20  Db==1 ? "CREATE 
7920: 54 45 4d 50 20 54 41 42 4c 45 20 22 20 3a 20 22  TEMP TABLE " : "
7930: 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b  CREATE TABLE ");
7940: 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53  .  k = strlen(zS
7950: 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74  tmt);.  identPut
7960: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a  (zStmt, &k, p->z
7970: 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b  Name);.  zStmt[k
7980: 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72  ++] = '(';.  for
7990: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
79a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63 70   i++){.    strcp
79b0: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65  y(&zStmt[k], zSe
79c0: 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72  p);.    k += str
79d0: 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a  len(&zStmt[k]);.
79e0: 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32      zSep = zSep2
79f0: 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a  ;.    identPut(z
7a00: 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 61 43 6f  Stmt, &k, p->aCo
7a10: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  l[i].zName);.  }
7a20: 0a 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74  .  strcpy(&zStmt
7a30: 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65  [k], zEnd);.  re
7a40: 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f  turn zStmt;.}../
7a50: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7a60: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  e is called to r
7a70: 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20  eport the final 
7a80: 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ")" that termina
7a90: 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20  tes.** a CREATE 
7aa0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
7ab0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
7ac0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
7ad0: 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75  other action rou
7ae0: 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20  tines have been 
7af0: 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61  building.** is a
7b00: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65  dded to the inte
7b10: 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73  rnal hash tables
7b20: 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  , assuming no er
7b30: 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63  rors have.** occ
7b40: 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  urred..**.** An 
7b50: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61  entry for the ta
7b60: 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74  ble is made in t
7b70: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
7b80: 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a  on disk, unless.
7b90: 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  ** this is a tem
7ba0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20  porary table or 
7bb0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
7bc0: 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74  .  When db->init
7bd0: 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d  .busy==1.** it m
7be0: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
7bf0: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
7c00: 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61  aster table beca
7c10: 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63  use we just.** c
7c20: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20  onnected to the 
7c30: 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61  database or beca
7c40: 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  use the sqlite_m
7c50: 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a  aster table has.
7c60: 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e  ** recently chan
7c70: 67 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74 72  ges, so the entr
7c80: 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65  y for this table
7c90: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
7ca0: 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  in.** the sqlite
7cb0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20  _master table.  
7cc0: 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  We do not want t
7cd0: 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69  o create it agai
7ce0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
7cf0: 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74  pSelect argument
7d00: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
7d10: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
7d20: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20   routine.** was 
7d30: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
7d40: 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74   a table generat
7d50: 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43  ed from a .** "C
7d60: 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20  REATE TABLE ... 
7d70: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73  AS SELECT ..." s
7d80: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63  tatement.  The c
7d90: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a  olumn names of.*
7da0: 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * the new table 
7db0: 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72  will match the r
7dc0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
7dd0: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
7de0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
7df0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7e00: 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65 6c  Token *pEnd, Sel
7e10: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
7e20: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c   Table *p;.  sql
7e30: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
7e40: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45  ->db;..  if( (pE
7e50: 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74  nd==0 && pSelect
7e60: 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ==0) || pParse->
7e70: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f  nErr || sqlite3_
7e80: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
7e90: 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50  return;.  p = pP
7ea0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
7eb0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
7ec0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  turn;..  /* If t
7ed0: 68 65 20 74 61 62 6c 65 20 69 73 20 67 65 6e 65  he table is gene
7ee0: 72 61 74 65 64 20 66 72 6f 6d 20 61 20 53 45 4c  rated from a SEL
7ef0: 45 43 54 2c 20 74 68 65 6e 20 63 6f 6e 73 74 72  ECT, then constr
7f00: 75 63 74 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73  uct the.  ** lis
7f10: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64  t of columns and
7f20: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
7f30: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
7f40: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
7f50: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
7f60: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
7f70: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
7f80: 73 65 2c 20 30 2c 20 70 53 65 6c 65 63 74 29 3b  se, 0, pSelect);
7f90: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62  .    if( pSelTab
7fa0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7fb0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
7fc0: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e  l==0 );.    p->n
7fd0: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
7fe0: 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c  Col;.    p->aCol
7ff0: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
8000: 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e  ;.    pSelTab->n
8010: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 65  Col = 0;.    pSe
8020: 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  lTab->aCol = 0;.
8030: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
8040: 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61  eTable(0, pSelTa
8050: 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  b);.  }..  /* If
8060: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   the db->init.bu
8070: 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73  sy is 1 it means
8080: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
8090: 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a  the SQL off the.
80a0: 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73    ** "sqlite_mas
80b0: 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f  ter" or "sqlite_
80c0: 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62  temp_master" tab
80d0: 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a  le on the disk..
80e0: 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77    ** So do not w
80f0: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
8100: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
8110: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
8120: 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  umber.  ** for t
8130: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
8140: 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  e db->init.newTn
8150: 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20  um field.  (The 
8160: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
8170: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
8180: 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74  n put there by t
8190: 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20  he sqliteOpenCb 
81a0: 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20  routine.).  */. 
81b0: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
81c0: 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75  sy ){.    p->tnu
81d0: 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
81e0: 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Tnum;.  }..  /* 
81f0: 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  If not initializ
8200: 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ing, then create
8210: 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68   a record for th
8220: 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a  e new table.  **
8230: 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
8240: 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74  ASTER table of t
8250: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
8260: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a  e record number.
8270: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77    ** for the new
8280: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 73 68 6f   table entry sho
8290: 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 6f  uld already be o
82a0: 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a  n the stack..  *
82b0: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69  *.  ** If this i
82c0: 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61  s a TEMPORARY ta
82d0: 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65  ble, write the e
82e0: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75  ntry into the au
82f0: 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c  xiliary.  ** fil
8300: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74  e instead of int
8310: 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
8320: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
8330: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
8340: 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  usy ){.    int n
8350: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 0a  ;.    Vdbe *v;..
8360: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
8370: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
8380: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
8390: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70  eturn;.    if( p
83a0: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
83b0: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c        /* A regul
83c0: 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ar table */.    
83d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
83e0: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
83f0: 6c 65 2c 20 30 2c 20 70 2d 3e 69 44 62 2c 20 28  le, 0, p->iDb, (
8400: 63 68 61 72 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20  char*)&p->tnum, 
8410: 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20  P3_POINTER);.   
8420: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
8430: 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20   A view */.     
8440: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8450: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
8460: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
8470: 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20    p->tnum = 0;. 
8480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8490: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
84a0: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
84b0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
84c0: 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20 70 2d  String, 0, 0, p-
84d0: 3e 70 53 65 6c 65 63 74 3d 3d 30 3f 22 74 61 62  >pSelect==0?"tab
84e0: 6c 65 22 3a 22 76 69 65 77 22 2c 20 50 33 5f 53  le":"view", P3_S
84f0: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
8500: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
8510: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20 70  _String, 0, 0, p
8520: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
8530: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
8540: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
8550: 20 30 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29   0, p->zName, 0)
8560: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8570: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
8580: 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 4, 0);.    if(
8590: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
85a0: 20 20 63 68 61 72 20 2a 7a 20 3d 20 63 72 65 61    char *z = crea
85b0: 74 65 54 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a  teTableStmt(p);.
85c0: 20 20 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73 74        n = z ? st
85d0: 72 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 20  rlen(z) : 0;.   
85e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
85f0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
8600: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
8610: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
8620: 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b  P3(v, -1, z, n);
8630: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
8640: 65 28 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(z);.    }else{
8650: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 53  .      if( p->pS
8660: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
8670: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
8680: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
8690: 20 30 2c 20 22 43 52 45 41 54 45 20 56 49 45 57   0, "CREATE VIEW
86a0: 20 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a   ", P3_STATIC);.
86b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
86c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
86d0: 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op3(v, OP_String
86e0: 2c 20 30 2c 20 30 2c 20 22 43 52 45 41 54 45 20  , 0, 0, "CREATE 
86f0: 54 41 42 4c 45 20 22 2c 20 50 33 5f 53 54 41 54  TABLE ", P3_STAT
8700: 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IC);.      }.   
8710: 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 21     assert( pEnd!
8720: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  =0 );.      n = 
8730: 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20  Addr(pEnd->z) - 
8740: 41 64 64 72 28 70 50 61 72 73 65 2d 3e 73 4e 61  Addr(pParse->sNa
8750: 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a  meToken.z) + 1;.
8760: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8770: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
8780: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
8790: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
87a0: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 50 61  ngeP3(v, -1, pPa
87b0: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
87c0: 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  z, n);.      sql
87d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
87e0: 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 32 2c 20 30   OP_Concat, 2, 0
87f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
8800: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
8810: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c  P_MakeRecord, 5,
8820: 20 30 2c 20 22 74 74 74 69 74 22 2c 20 50 33 5f   0, "tttit", P3_
8830: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
8840: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
8850: 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30   OP_PutIntKey, 0
8860: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 70  , 0);.    if( !p
8870: 2d 3e 69 44 62 20 29 7b 0a 20 20 20 20 20 20 73  ->iDb ){.      s
8880: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
8890: 69 65 28 64 62 2c 20 76 2c 20 70 2d 3e 69 44 62  ie(db, v, p->iDb
88a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
88b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
88c0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
88d0: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  ;.    if( pSelec
88e0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
88f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
8900: 50 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e 69 44  P_Integer, p->iD
8910: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  b, 0);.      sql
8920: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
8930: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31   OP_OpenWrite, 1
8940: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
8950: 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20  se->nTab = 2;.  
8960: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
8970: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
8980: 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c  t, SRT_Table, 1,
8990: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
89a0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
89b0: 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  ndWriteOperation
89c0: 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20  (pParse);.  }.. 
89d0: 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c   /* Add the tabl
89e0: 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e to the in-memo
89f0: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
8a00: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
8a10: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
8a20: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30  arse->explain==0
8a30: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
8a40: 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  ==0 ){.    Table
8a50: 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65 79   *pOld;.    FKey
8a60: 20 2a 70 46 4b 65 79 3b 0a 20 20 20 20 70 4f 6c   *pFKey;.    pOl
8a70: 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  d = sqlite3HashI
8a80: 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70  nsert(&db->aDb[p
8a90: 2d 3e 69 44 62 5d 2e 74 62 6c 48 61 73 68 2c 20  ->iDb].tblHash, 
8aa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
8ac0: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d  zName, strlen(p-
8ad0: 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20  >zName)+1, p);. 
8ae0: 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20     if( pOld ){. 
8af0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
8b00: 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  pOld );  /* Mall
8b10: 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
8b20: 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49  led inside HashI
8b30: 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20  nsert() */.     
8b40: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
8b50: 20 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e     for(pFKey=p->
8b60: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46  pFKey; pFKey; pF
8b70: 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74  Key=pFKey->pNext
8b80: 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74  From){.      int
8b90: 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46   nTo = strlen(pF
8ba0: 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20  Key->zTo) + 1;. 
8bb0: 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78       pFKey->pNex
8bc0: 74 54 6f 20 3d 20 73 71 6c 69 74 65 33 48 61 73  tTo = sqlite3Has
8bd0: 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70  hFind(&db->aDb[p
8be0: 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 20 70 46  ->iDb].aFKey, pF
8bf0: 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a  Key->zTo, nTo);.
8c00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73        sqlite3Has
8c10: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
8c20: 5b 70 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 20  [p->iDb].aFKey, 
8c30: 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c  pFKey->zTo, nTo,
8c40: 20 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20   pFKey);.    }. 
8c50: 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
8c60: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
8c70: 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20  ->nTable++;.    
8c80: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
8c90: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
8ca0: 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s;.  }.}../*.** 
8cb0: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
8cc0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e   this routine in
8cd0: 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
8ce0: 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76   a new VIEW.*/.v
8cf0: 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
8d00: 65 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a  eView(.  Parse *
8d10: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54  pParse,     /* T
8d20: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
8d30: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
8d40: 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68  Begin,     /* Th
8d50: 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
8d60: 68 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73  hat begins the s
8d70: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
8d80: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
8d90: 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68   /* The token th
8da0: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  at holds the nam
8db0: 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f  e of the view */
8dc0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
8dd0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b  ,     /* The tok
8de0: 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  en that holds th
8df0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  e name of the vi
8e00: 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ew */.  Select *
8e10: 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20  pSelect,   /* A 
8e20: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
8e30: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
8e40: 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a  e the new view *
8e50: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 20  /.  int isTemp  
8e60: 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66         /* TRUE f
8e70: 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76  or a TEMPORARY v
8e80: 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  iew */.){.  Tabl
8e90: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  e *p;.  int n;. 
8ea0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
8eb0: 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20    Token sEnd;.  
8ec0: 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20  DbFixer sFix;.  
8ed0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 0a 20  Token *pName;.. 
8ee0: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
8ef0: 6c 65 28 70 50 61 72 73 65 2c 20 70 42 65 67 69  le(pParse, pBegi
8f00: 6e 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  n, pName1, pName
8f10: 32 2c 20 69 73 54 65 6d 70 2c 20 31 29 3b 0a 20  2, isTemp, 1);. 
8f20: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
8f30: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
8f40: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
8f50: 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
8f60: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
8f70: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
8f80: 72 6e 3b 0a 20 20 7d 0a 20 20 72 65 73 6f 6c 76  rn;.  }.  resolv
8f90: 65 53 63 68 65 6d 61 4e 61 6d 65 28 70 50 61 72  eSchemaName(pPar
8fa0: 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
8fb0: 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69  e2, &pName);.  i
8fc0: 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
8fd0: 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
8fe0: 20 70 2d 3e 69 44 62 2c 20 22 76 69 65 77 22 2c   p->iDb, "view",
8ff0: 20 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20 73   pName).    && s
9000: 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28  qlite3FixSelect(
9010: 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 0a  &sFix, pSelect).
9020: 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
9030: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
9040: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
9050: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  n;.  }..  /* Mak
9060: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
9070: 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74  entire SELECT st
9080: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
9090: 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
90a0: 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f   ** This will fo
90b0: 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72  rce all the Expr
90c0: 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20  .token.z values 
90d0: 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
90e0: 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
90f0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69   rather than poi
9100: 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20  nt to the input 
9110: 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d  string - which m
9120: 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  eans that.  ** t
9130: 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74  hey will persist
9140: 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65   after the curre
9150: 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  nt sqlite3_exec(
9160: 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a  ) call returns..
9170: 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63    */.  p->pSelec
9180: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
9190: 74 44 75 70 28 70 53 65 6c 65 63 74 29 3b 0a 20  tDup(pSelect);. 
91a0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
91b0: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
91c0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62   if( !pParse->db
91d0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
91e0: 20 20 20 73 71 6c 69 74 65 33 56 69 65 77 47 65     sqlite3ViewGe
91f0: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
9200: 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20  rse, p);.  }..  
9210: 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e  /* Locate the en
9220: 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  d of the CREATE 
9230: 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20  VIEW statement. 
9240: 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74   Make sEnd point
9250: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64   to.  ** the end
9260: 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20  ..  */.  sEnd = 
9270: 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
9280: 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a  en;.  if( sEnd.z
9290: 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a  [0]!=0 && sEnd.z
92a0: 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20  [0]!=';' ){.    
92b0: 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e  sEnd.z += sEnd.n
92c0: 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d  ;.  }.  sEnd.n =
92d0: 20 30 3b 0a 20 20 6e 20 3d 20 28 28 69 6e 74 29   0;.  n = ((int)
92e0: 73 45 6e 64 2e 7a 29 20 2d 20 28 69 6e 74 29 70  sEnd.z) - (int)p
92f0: 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20  Begin->z;.  z = 
9300: 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69  pBegin->z;.  whi
9310: 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d  le( n>0 && (z[n-
9320: 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61  1]==';' || isspa
9330: 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e  ce(z[n-1])) ){ n
9340: 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d  --; }.  sEnd.z =
9350: 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64   &z[n-1];.  sEnd
9360: 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73  .n = 1;..  /* Us
9370: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
9380: 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76  e() to add the v
9390: 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54  iew to the SQLIT
93a0: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a  E_MASTER table *
93b0: 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61  /.  sqlite3EndTa
93c0: 62 6c 65 28 70 50 61 72 73 65 2c 20 26 73 45 6e  ble(pParse, &sEn
93d0: 64 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b  d, 0);.  return;
93e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61  .}../*.** The Ta
93f0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54  ble structure pT
9400: 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  able is really a
9410: 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20   VIEW.  Fill in 
9420: 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  the names of.** 
9430: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
9440: 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70  he view in the p
9450: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e  Table structure.
9460: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
9470: 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73  ber.** of errors
9480: 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  .  If an error i
9490: 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20  s seen leave an 
94a0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
94b0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
94c0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
94d0: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
94e0: 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
94f0: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
9500: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  {.  ExprList *pE
9510: 4c 69 73 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  List;.  Select *
9520: 70 53 65 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70  pSel;.  Table *p
9530: 53 65 6c 54 61 62 3b 0a 20 20 69 6e 74 20 6e 45  SelTab;.  int nE
9540: 72 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  rr = 0;..  asser
9550: 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 20 20  t( pTable );..  
9560: 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43  /* A positive nC
9570: 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c  ol means the col
9580: 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74  umns names for t
9590: 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a  his view are.  *
95a0: 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e  * already known.
95b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
95c0: 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74  le->nCol>0 ) ret
95d0: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e  urn 0;..  /* A n
95e0: 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20  egative nCol is 
95f0: 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72  a special marker
9600: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65   meaning that we
9610: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20   are currently. 
9620: 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f   ** trying to co
9630: 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e  mpute the column
9640: 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65   names.  If we e
9650: 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  nter this routin
9660: 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65  e with.  ** a ne
9670: 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20  gative nCol, it 
9680: 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72  means two or mor
9690: 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c  e views form a l
96a0: 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  oop, like this:.
96b0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52    **.  **     CR
96c0: 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53  EATE VIEW one AS
96d0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
96e0: 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  wo;.  **     CRE
96f0: 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20  ATE VIEW two AS 
9700: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e  SELECT * FROM on
9710: 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74  e;.  **.  ** Act
9720: 75 61 6c 6c 79 2c 20 74 68 69 73 20 65 72 72 6f  ually, this erro
9730: 72 20 69 73 20 63 61 75 67 68 74 20 70 72 65 76  r is caught prev
9740: 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20 74 68  iously and so th
9750: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
9760: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77  .  ** should alw
9770: 61 79 73 20 66 61 69 6c 2e 20 20 42 75 74 20 77  ays fail.  But w
9780: 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 69 74 20  e will leave it 
9790: 69 6e 20 70 6c 61 63 65 20 6a 75 73 74 20 74 6f  in place just to
97a0: 20 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20   be safe..  */. 
97b0: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
97c0: 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  l<0 ){.    sqlit
97d0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
97e0: 65 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63  e, "view %s is c
97f0: 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65  ircularly define
9800: 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  d", pTable->zNam
9810: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
9820: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
9830: 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
9840: 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64  it means we need
9850: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
9860: 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  table names..  *
9870: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
9880: 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 20 2f  le->pSelect ); /
9890: 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c 20 74 68  * If nCol==0, th
98a0: 65 6e 20 70 54 61 62 6c 65 20 6d 75 73 74 20 62  en pTable must b
98b0: 65 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 70 53  e a VIEW */.  pS
98c0: 65 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 70 53 65  el = pTable->pSe
98d0: 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65  lect;..  /* Note
98e0: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74   that the call t
98f0: 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  o sqlite3ResultS
9900: 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c  etOfSelect() wil
9910: 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a  l expand any.  *
9920: 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69  * "*" elements i
9930: 6e 20 74 68 69 73 20 6c 69 73 74 2e 20 20 42 75  n this list.  Bu
9940: 74 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  t we will need t
9950: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 6c 69  o restore the li
9960: 73 74 0a 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20  st.  ** back to 
9970: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  its original con
9980: 66 69 67 75 72 61 74 69 6f 6e 20 61 66 74 65 72  figuration after
9990: 77 61 72 64 73 2c 20 73 6f 20 77 65 20 73 61 76  wards, so we sav
99a0: 65 20 61 20 63 6f 70 79 20 6f 66 0a 20 20 2a 2a  e a copy of.  **
99b0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e   the original in
99c0: 20 70 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20   pEList..  */.  
99d0: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 2d 3e 70  pEList = pSel->p
99e0: 45 4c 69 73 74 3b 0a 20 20 70 53 65 6c 2d 3e 70  EList;.  pSel->p
99f0: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
9a00: 78 70 72 4c 69 73 74 44 75 70 28 70 45 4c 69 73  xprListDup(pELis
9a10: 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 2d 3e  t);.  if( pSel->
9a20: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
9a30: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20   pSel->pEList = 
9a40: 70 45 4c 69 73 74 3b 0a 20 20 20 20 72 65 74 75  pEList;.    retu
9a50: 72 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  rn 1;  /* Malloc
9a60: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20   failed */.  }. 
9a70: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
9a80: 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d 20  -1;.  pSelTab = 
9a90: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
9aa0: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
9ab0: 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 69 66 28   0, pSel);.  if(
9ac0: 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20   pSelTab ){.    
9ad0: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
9ae0: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70  aCol==0 );.    p
9af0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53  Table->nCol = pS
9b00: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
9b10: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
9b20: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
9b30: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
9b40: 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61   = 0;.    pSelTa
9b50: 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
9b60: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
9b70: 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b  ble(0, pSelTab);
9b80: 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72  .    DbSetProper
9b90: 74 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ty(pParse->db, p
9ba0: 54 61 62 6c 65 2d 3e 69 44 62 2c 20 44 42 5f 55  Table->iDb, DB_U
9bb0: 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 20 20  nresetViews);.  
9bc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 6c  }else{.    pTabl
9bd0: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  e->nCol = 0;.   
9be0: 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73   nErr++;.  }.  s
9bf0: 71 6c 69 74 65 33 53 65 6c 65 63 74 55 6e 62 69  qlite3SelectUnbi
9c00: 6e 64 28 70 53 65 6c 29 3b 0a 20 20 73 71 6c 69  nd(pSel);.  sqli
9c10: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
9c20: 65 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b  e(pSel->pEList);
9c30: 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20  .  pSel->pEList 
9c40: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 72 65 74 75  = pEList;.  retu
9c50: 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a  rn nErr;  .}../*
9c60: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f  .** Clear the co
9c70: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
9c80: 74 68 65 20 56 49 45 57 20 70 54 61 62 6c 65 2e  the VIEW pTable.
9c90: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9ca0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
9cb0: 65 6e 65 76 65 72 20 61 6e 79 20 6f 74 68 65 72  enever any other
9cc0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69   table or view i
9cd0: 73 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 54  s modified..** T
9ce0: 68 65 20 76 69 65 77 20 70 61 73 73 65 64 20 69  he view passed i
9cf0: 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nto this routine
9d00: 20 6d 69 67 68 74 20 64 65 70 65 6e 64 20 64 69   might depend di
9d10: 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65  rectly or indire
9d20: 63 74 6c 79 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d  ctly.** on the m
9d30: 6f 64 69 66 69 65 64 20 6f 72 20 64 65 6c 65 74  odified or delet
9d40: 65 64 20 74 61 62 6c 65 20 73 6f 20 77 65 20 6e  ed table so we n
9d50: 65 65 64 20 74 6f 20 63 6c 65 61 72 20 74 68 65  eed to clear the
9d60: 20 6f 6c 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e   old column.** n
9d70: 61 6d 65 73 20 73 6f 20 74 68 61 74 20 74 68 65  ames so that the
9d80: 79 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 6d 70  y will be recomp
9d90: 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
9da0: 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52  void sqliteViewR
9db0: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
9dc0: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
9dd0: 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d    int i;.  Colum
9de0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72  n *pCol;.  asser
9df0: 74 28 20 70 54 61 62 6c 65 21 3d 30 20 26 26 20  t( pTable!=0 && 
9e00: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 21  pTable->pSelect!
9e10: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  =0 );.  for(i=0,
9e20: 20 70 43 6f 6c 3d 70 54 61 62 6c 65 2d 3e 61 43   pCol=pTable->aC
9e30: 6f 6c 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  ol; i<pTable->nC
9e40: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
9e50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
9e60: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pCol->zName);. 
9e70: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43     sqliteFree(pC
9e80: 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20  ol->zDflt);.    
9e90: 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d  sqliteFree(pCol-
9ea0: 3e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73  >zType);.  }.  s
9eb0: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
9ec0: 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70 54 61 62 6c  ->aCol);.  pTabl
9ed0: 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  e->aCol = 0;.  p
9ee0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
9ef0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
9f00: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
9f10: 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57   from every VIEW
9f20: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78   in database idx
9f30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9f40: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
9f50: 41 6c 6c 28 73 71 6c 69 74 65 20 2a 64 62 2c 20  All(sqlite *db, 
9f60: 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68  int idx){.  Hash
9f70: 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21  Elem *i;.  if( !
9f80: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
9f90: 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
9fa0: 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e  tViews) ) return
9fb0: 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
9fc0: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
9fd0: 44 62 5b 69 64 78 5d 2e 74 62 6c 48 61 73 68 29  Db[idx].tblHash)
9fe0: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
9ff0: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54  hNext(i)){.    T
a000: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
a010: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
a020: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
a030: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73  elect ){.      s
a040: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 43 6f  qliteViewResetCo
a050: 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b  lumnNames(pTab);
a060: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43  .    }.  }.  DbC
a070: 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c  learProperty(db,
a080: 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
a090: 56 69 65 77 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Views);.}../*.**
a0a0: 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20   Given a token, 
a0b0: 6c 6f 6f 6b 20 75 70 20 61 20 74 61 62 6c 65 20  look up a table 
a0c0: 77 69 74 68 20 74 68 61 74 20 6e 61 6d 65 2e 20  with that name. 
a0d0: 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c   If not found, l
a0e0: 65 61 76 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  eave.** an error
a0f0: 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20   for the parser 
a100: 74 6f 20 66 69 6e 64 20 61 6e 64 20 72 65 74 75  to find and retu
a110: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c  rn NULL..*/.Tabl
a120: 65 20 2a 73 71 6c 69 74 65 33 54 61 62 6c 65 46  e *sqlite3TableF
a130: 72 6f 6d 54 6f 6b 65 6e 28 50 61 72 73 65 20 2a  romToken(Parse *
a140: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
a150: 54 6f 6b 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  Tok){.  char *zN
a160: 61 6d 65 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ame;.  Table *pT
a170: 61 62 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71  ab;.  zName = sq
a180: 6c 69 74 65 33 54 61 62 6c 65 4e 61 6d 65 46 72  lite3TableNameFr
a190: 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29 3b 0a 20  omToken(pTok);. 
a1a0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
a1b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 54 61 62  return 0;.  pTab
a1c0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
a1d0: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
a1e0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c  zName, 0);.  sql
a1f0: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
a200: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
a210: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
a220: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
a230: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 54 22   such table: %T"
a240: 2c 20 70 54 6f 6b 29 3b 0a 20 20 7d 0a 20 20 72  , pTok);.  }.  r
a250: 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f  eturn pTab;.}../
a260: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a270: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64  e is called to d
a280: 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20  o the work of a 
a290: 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65  DROP TABLE state
a2a0: 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69  ment..** pName i
a2b0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
a2c0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72  e table to be dr
a2d0: 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  opped..*/.void s
a2e0: 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28  qlite3DropTable(
a2f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
a300: 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69  rcList *pName, i
a310: 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20 54 61  nt isView){.  Ta
a320: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62  ble *pTab;.  Vdb
a330: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 62 61 73 65  e *v;.  int base
a340: 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
a350: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
a360: 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70  nt iDb;..  if( p
a370: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
a380: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
a390: 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74  iled ) goto exit
a3a0: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 61  _drop_table;.  a
a3b0: 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
a3c0: 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20  rc==1 );.  pTab 
a3d0: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
a3e0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61  able(pParse, pNa
a3f0: 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
a400: 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
a410: 61 62 61 73 65 29 3b 0a 0a 20 20 69 66 28 20 70  abase);..  if( p
a420: 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  Tab==0 ) goto ex
a430: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
a440: 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62   iDb = pTab->iDb
a450: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
a460: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
a470: 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  b );.#ifndef SQL
a480: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
a490: 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
a4a0: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e  nt code;.    con
a4b0: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
a4c0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 54 61  SCHEMA_TABLE(pTa
a4d0: 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e  b->iDb);.    con
a4e0: 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
a4f0: 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62  b->aDb[pTab->iDb
a500: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
a510: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
a520: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
a530: 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
a540: 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67  , zDb)){.      g
a550: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
a560: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ble;.    }.    i
a570: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
a580: 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b     if( iDb==1 ){
a590: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
a5a0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
a5b0: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
a5c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
a5d0: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
a5e0: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
a5f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
a600: 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  ( iDb==1 ){.    
a610: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
a620: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
a630: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
a640: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
a650: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
a660: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a670: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
a680: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
a690: 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61   code, pTab->zNa
a6a0: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
a6b0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
a6c0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
a6d0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
a6e0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
a6f0: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
a700: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c   pTab->zName, 0,
a710: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
a720: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
a730: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ble;.    }.  }.#
a740: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 54 61 62  endif.  if( pTab
a750: 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
a760: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
a770: 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
a780: 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64   %s may not be d
a790: 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a  ropped", pTab->z
a7a0: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 72 73  Name);.    pPars
a7b0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67  e->nErr++;.    g
a7c0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
a7d0: 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  ble;.  }.  if( i
a7e0: 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
a7f0: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
a800: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
a810: 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
a820: 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65  OP TABLE to dele
a830: 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54  te table %s", pT
a840: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
a850: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
a860: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
a870: 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d  !isView && pTab-
a880: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
a890: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
a8a0: 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
a8b0: 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65  P VIEW to delete
a8c0: 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d   view %s", pTab-
a8d0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
a8e0: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
a8f0: 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  e;.  }..  /* Gen
a900: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
a910: 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66  move the table f
a920: 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
a930: 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73  able.  ** on dis
a940: 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  k..  */.  v = sq
a950: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
a960: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
a970: 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
a980: 4f 70 4c 69 73 74 20 64 72 6f 70 54 61 62 6c 65  OpList dropTable
a990: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f  [] = {.      { O
a9a0: 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c  P_Rewind,     0,
a9b0: 20 41 44 44 52 28 31 30 29 2c 20 30 7d 2c 0a 20   ADDR(10), 0},. 
a9c0: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
a9d0: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
a9e0: 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20     0}, /* 1 */. 
a9f0: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f       { OP_MemSto
aa00: 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20  re,   1, 1,     
aa10: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
aa20: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c  P_MemLoad,    1,
aa30: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   0,        0}, /
aa40: 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 3 */.      { O
aa50: 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c  P_Column,     0,
aa60: 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   2,        0},. 
aa70: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20       { OP_Ne,   
aa80: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29        0, ADDR(9)
aa90: 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ,  0},.      { O
aaa0: 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c  P_Delete,     0,
aab0: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
aac0: 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64       { OP_Rewind
aad0: 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28 31 30  ,     0, ADDR(10
aae0: 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ), 0},.      { O
aaf0: 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c  P_Goto,       0,
ab00: 20 41 44 44 52 28 33 29 2c 20 20 30 7d 2c 0a 20   ADDR(3),  0},. 
ab10: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20       { OP_Next, 
ab20: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 33 29        0, ADDR(3)
ab30: 2c 20 20 30 7d 2c 20 2f 2a 20 39 20 2a 2f 0a 20  ,  0}, /* 9 */. 
ab40: 20 20 20 7d 3b 0a 20 20 20 20 49 6e 64 65 78 20     };.    Index 
ab50: 2a 70 49 64 78 3b 0a 20 20 20 20 54 72 69 67 67  *pIdx;.    Trigg
ab60: 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20  er *pTrigger;.  
ab70: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
ab80: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
ab90: 72 73 65 2c 20 30 2c 20 70 54 61 62 2d 3e 69 44  rse, 0, pTab->iD
aba0: 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70  b);..    /* Drop
abb0: 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73   all triggers as
abc0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
abd0: 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
abe0: 6f 70 70 65 64 20 2a 2f 0a 20 20 20 20 70 54 72  opped */.    pTr
abf0: 69 67 67 65 72 20 3d 20 70 54 61 62 2d 3e 70 54  igger = pTab->pT
ac00: 72 69 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c  rigger;.    whil
ac10: 65 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20  e( pTrigger ){. 
ac20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
ac30: 69 67 67 65 72 2d 3e 69 44 62 3d 3d 70 54 61 62  igger->iDb==pTab
ac40: 2d 3e 69 44 62 20 7c 7c 20 70 54 72 69 67 67 65  ->iDb || pTrigge
ac50: 72 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20  r->iDb==1 );.   
ac60: 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72     sqlite3DropTr
ac70: 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c  iggerPtr(pParse,
ac80: 20 70 54 72 69 67 67 65 72 2c 20 31 29 3b 0a 20   pTrigger, 1);. 
ac90: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
aca0: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
acb0: 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
acc0: 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a  Trigger->pNext;.
acd0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ace0: 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20       pTrigger = 
acf0: 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a  pTab->pTrigger;.
ad00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
ad10: 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53     /* Drop all S
ad20: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 65 6e 74  QLITE_MASTER ent
ad30: 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20  ries that refer 
ad40: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  to the table */.
ad50: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d      sqlite3OpenM
ad60: 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70 54  asterTable(v, pT
ad70: 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 62 61  ab->iDb);.    ba
ad80: 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
ad90: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
ada0: 61 79 53 69 7a 65 28 64 72 6f 70 54 61 62 6c 65  aySize(dropTable
adb0: 29 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a 20  ), dropTable);. 
adc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
add0: 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31  angeP3(v, base+1
ade0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
adf0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20  );..    /* Drop 
ae00: 61 6c 6c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  all SQLITE_TEMP_
ae10: 4d 41 53 54 45 52 20 65 6e 74 72 69 65 73 20 74  MASTER entries t
ae20: 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
ae30: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 66   table */.    if
ae40: 28 20 70 54 61 62 2d 3e 69 44 62 21 3d 31 20 29  ( pTab->iDb!=1 )
ae50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
ae60: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76  penMasterTable(v
ae70: 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 61 73 65  , 1);.      base
ae80: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ae90: 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
aea0: 53 69 7a 65 28 64 72 6f 70 54 61 62 6c 65 29 2c  Size(dropTable),
aeb0: 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a 20 20 20   dropTable);.   
aec0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
aed0: 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31  angeP3(v, base+1
aee0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
aef0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
af00: 28 20 70 54 61 62 2d 3e 69 44 62 21 3d 31 20 29  ( pTab->iDb!=1 )
af10: 7b 20 20 2f 2a 20 54 65 6d 70 20 64 61 74 61 62  {  /* Temp datab
af20: 61 73 65 20 68 61 73 20 6e 6f 20 73 63 68 65 6d  ase has no schem
af30: 61 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 20 20  a cookie */.    
af40: 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
af50: 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70 54 61  ookie(db, v, pTa
af60: 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 7d 0a 20  b->iDb);.    }. 
af70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
af80: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
af90: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
afa0: 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20  !isView ){.     
afb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
afc0: 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c  p(v, OP_Destroy,
afd0: 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 70 54 61   pTab->tnum, pTa
afe0: 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 66  b->iDb);.      f
aff0: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
b000: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
b010: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
b020: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b030: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
b040: 73 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e 75  stroy, pIdx->tnu
b050: 6d 2c 20 70 49 64 78 2d 3e 69 44 62 29 3b 0a 20  m, pIdx->iDb);. 
b060: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b070: 20 73 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65   sqlite3EndWrite
b080: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
b090: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
b0a0: 65 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ete the in-memor
b0b0: 79 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  y description of
b0c0: 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2a   the table..  **
b0d0: 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a  .  ** Exception:
b0e0: 20 69 66 20 74 68 65 20 53 51 4c 20 73 74 61 74   if the SQL stat
b0f0: 65 6d 65 6e 74 20 62 65 67 61 6e 20 77 69 74 68  ement began with
b100: 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79   the EXPLAIN key
b110: 77 6f 72 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  word,.  ** then 
b120: 6e 6f 20 63 68 61 6e 67 65 73 20 73 68 6f 75 6c  no changes shoul
b130: 64 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a  d be made..  */.
b140: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65    if( !pParse->e
b150: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73 71  xplain ){.    sq
b160: 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  liteUnlinkAndDel
b170: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61  eteTable(db, pTa
b180: 62 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  b);.    db->flag
b190: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
b1a0: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 20  rnChanges;.  }. 
b1b0: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
b1c0: 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65  All(db, iDb);..e
b1d0: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a  xit_drop_table:.
b1e0: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
b1f0: 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d  Delete(pName);.}
b200: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
b210: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
b220: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66  o create a new f
b230: 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68  oreign key on th
b240: 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65  e table.** curre
b250: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
b260: 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43  ruction.  pFromC
b270: 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  ol determines wh
b280: 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69  ich columns.** i
b290: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  n the current ta
b2a0: 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ble point to the
b2b0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49   foreign key.  I
b2c0: 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68  f pFromCol==0 th
b2d0: 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68  en.** connect th
b2e0: 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73  e key to the las
b2f0: 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65  t column inserte
b300: 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e  d.  pTo is the n
b310: 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61  ame of.** the ta
b320: 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e  ble referred to.
b330: 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69    pToCol is a li
b340: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
b350: 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f  the other.** pTo
b360: 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20   table that the 
b370: 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e  foreign key poin
b380: 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f  ts to.  flags co
b390: 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e  ntains all.** in
b3a0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
b3b0: 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  the conflict res
b3c0: 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
b3d0: 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  ms specified.** 
b3e0: 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45  in the ON DELETE
b3f0: 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20  , ON UPDATE and 
b400: 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65  ON INSERT clause
b410: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79  s..**.** An FKey
b420: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72   structure is cr
b430: 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20  eated and added 
b440: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
b450: 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20  rently.** under 
b460: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20  construction in 
b470: 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  the pParse->pNew
b480: 54 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68  Table field.  Th
b490: 65 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73  e new FKey.** is
b4a0: 20 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f   not linked into
b4b0: 20 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68   db->aFKey at th
b4c0: 69 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20  is point - that 
b4d0: 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a  does not happen.
b4e0: 2a 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33  ** until sqlite3
b4f0: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a  EndTable()..**.*
b500: 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  * The foreign ke
b510: 79 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d  y is set for IMM
b520: 45 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e  EDIATE processin
b530: 67 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74  g.  A subsequent
b540: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69   call.** to sqli
b550: 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
b560: 65 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67  ey() might chang
b570: 65 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52  e this to DEFERR
b580: 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ED..*/.void sqli
b590: 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e  te3CreateForeign
b5a0: 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
b5b0: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
b5c0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
b5d0: 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 46 72 6f  /.  IdList *pFro
b5e0: 6d 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75  mCol,    /* Colu
b5f0: 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c  mns in this tabl
b600: 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  e that point to 
b610: 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
b620: 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20   Token *pTo,    
b630: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
b640: 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
b650: 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 54   */.  IdList *pT
b660: 6f 43 6f 6c 2c 20 20 20 20 20 20 2f 2a 20 43 6f  oCol,      /* Co
b670: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68  lumns in the oth
b680: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  er table */.  in
b690: 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
b6a0: 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72     /* Conflict r
b6b0: 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
b6c0: 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 54 61  thms. */.){.  Ta
b6d0: 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d  ble *p = pParse-
b6e0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e  >pNewTable;.  in
b6f0: 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69  t nByte;.  int i
b700: 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  ;.  int nCol;.  
b710: 63 68 61 72 20 2a 7a 3b 0a 20 20 46 4b 65 79 20  char *z;.  FKey 
b720: 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 61  *pFKey = 0;..  a
b730: 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b  ssert( pTo!=0 );
b740: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
b750: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
b760: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28  to fk_end;.  if(
b770: 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
b780: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
b790: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66  ->nCol-1;.    if
b7a0: 28 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20  ( iCol<0 ) goto 
b7b0: 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  fk_end;.    if( 
b7c0: 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
b7d0: 2d 3e 6e 49 64 21 3d 31 20 29 7b 0a 20 20 20 20  ->nId!=1 ){.    
b7e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
b7f0: 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69  g(pParse, "forei
b800: 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20  gn key on %s".  
b810: 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20         " should 
b820: 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f  reference only o
b830: 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ne column of tab
b840: 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20  le %T",.        
b850: 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a   p->aCol[iCol].z
b860: 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20  Name, pTo);.    
b870: 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
b880: 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20     }.    nCol = 
b890: 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
b8a0: 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
b8b0: 3e 6e 49 64 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e  >nId!=pFromCol->
b8c0: 6e 49 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nId ){.    sqlit
b8d0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
b8e0: 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62  e,.        "numb
b8f0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
b900: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65   foreign key doe
b910: 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
b920: 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20  number of ".    
b930: 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20      "columns in 
b940: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
b950: 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f  able");.    goto
b960: 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65   fk_end;.  }else
b970: 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72  {.    nCol = pFr
b980: 6f 6d 43 6f 6c 2d 3e 6e 49 64 3b 0a 20 20 7d 0a  omCol->nId;.  }.
b990: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
b9a0: 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a  (*pFKey) + nCol*
b9b0: 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43  sizeof(pFKey->aC
b9c0: 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20  ol[0]) + pTo->n 
b9d0: 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f  + 1;.  if( pToCo
b9e0: 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
b9f0: 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 49 64 3b  ; i<pToCol->nId;
ba00: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79   i++){.      nBy
ba10: 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f  te += strlen(pTo
ba20: 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
ba30: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
ba40: 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65    pFKey = sqlite
ba50: 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b  Malloc( nByte );
ba60: 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20  .  if( pFKey==0 
ba70: 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20  ) goto fk_end;. 
ba80: 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20   pFKey->pFrom = 
ba90: 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  p;.  pFKey->pNex
baa0: 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79  tFrom = p->pFKey
bab0: 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26  ;.  z = (char*)&
bac0: 70 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65  pFKey[1];.  pFKe
bad0: 79 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75 63  y->aCol = (struc
bae0: 74 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20  t sColMap*)z;.  
baf0: 7a 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72 75  z += sizeof(stru
bb00: 63 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c  ct sColMap)*nCol
bb10: 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d  ;.  pFKey->zTo =
bb20: 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20   z;.  memcpy(z, 
bb30: 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b  pTo->z, pTo->n);
bb40: 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30  .  z[pTo->n] = 0
bb50: 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b  ;.  z += pTo->n+
bb60: 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  1;.  pFKey->pNex
bb70: 74 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79  tTo = 0;.  pFKey
bb80: 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  ->nCol = nCol;. 
bb90: 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30   if( pFromCol==0
bba0: 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61   ){.    pFKey->a
bbb0: 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70  Col[0].iFrom = p
bbc0: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73  ->nCol-1;.  }els
bbd0: 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e{.    for(i=0; 
bbe0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
bbf0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
bc00: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
bc10: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
bc20: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
bc30: 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d  rICmp(p->aCol[j]
bc40: 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c  .zName, pFromCol
bc50: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
bc60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
bc70: 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72  Key->aCol[i].iFr
bc80: 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  om = j;.        
bc90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
bca0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
bcb0: 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20   if( j>=p->nCol 
bcc0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
bcd0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
bce0: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75  e, .          "u
bcf0: 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22  nknown column \"
bd00: 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20  %s\" in foreign 
bd10: 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c  key definition",
bd20: 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f   .          pFro
bd30: 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
bd40: 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
bd50: 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  fk_end;.      }.
bd60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
bd70: 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
bd80: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
bd90: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ++){.      int n
bda0: 20 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c   = strlen(pToCol
bdb0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
bdc0: 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c       pFKey->aCol
bdd0: 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20  [i].zCol = z;.  
bde0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54      memcpy(z, pT
bdf0: 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
be00: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d  , n);.      z[n]
be10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d   = 0;.      z +=
be20: 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n+1;.    }.  }.
be30: 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
be40: 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79  red = 0;.  pFKey
be50: 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20 66  ->deleteConf = f
be60: 6c 61 67 73 20 26 20 30 78 66 66 3b 0a 20 20 70  lags & 0xff;.  p
be70: 46 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66  FKey->updateConf
be80: 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 38 20 29   = (flags >> 8 )
be90: 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79   & 0xff;.  pFKey
bea0: 2d 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28  ->insertConf = (
beb0: 66 6c 61 67 73 20 3e 3e 20 31 36 20 29 20 26 20  flags >> 16 ) & 
bec0: 30 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b  0xff;..  /* Link
bed0: 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
bee0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73   to the table as
bef0: 20 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a   the last step..
bf00: 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20    */.  p->pFKey 
bf10: 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79  = pFKey;.  pFKey
bf20: 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20   = 0;..fk_end:. 
bf30: 20 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65   sqliteFree(pFKe
bf40: 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c  y);.  sqlite3IdL
bf50: 69 73 74 44 65 6c 65 74 65 28 70 46 72 6f 6d 43  istDelete(pFromC
bf60: 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64  ol);.  sqlite3Id
bf70: 4c 69 73 74 44 65 6c 65 74 65 28 70 54 6f 43 6f  ListDelete(pToCo
bf80: 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  l);.}../*.** Thi
bf90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
bfa0: 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54  led when an INIT
bfb0: 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20  IALLY IMMEDIATE 
bfc0: 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  or INITIALLY DEF
bfd0: 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20  ERRED.** clause 
bfe0: 69 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20  is seen as part 
bff0: 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  of a foreign key
c000: 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68   definition.  Th
c010: 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20  e isDeferred.** 
c020: 70 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66  parameter is 1 f
c030: 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  or INITIALLY DEF
c040: 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20  ERRED and 0 for 
c050: 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
c060: 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61  ATE..** The beha
c070: 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74  vior of the most
c080: 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65   recently create
c090: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73  d foreign key is
c0a0: 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63   adjusted.** acc
c0b0: 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69  ordingly..*/.voi
c0c0: 64 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f  d sqlite3DeferFo
c0d0: 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a  reignKey(Parse *
c0e0: 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65  pParse, int isDe
c0f0: 66 65 72 72 65 64 29 7b 0a 20 20 54 61 62 6c 65  ferred){.  Table
c100: 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a   *pTab;.  FKey *
c110: 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54  pFKey;.  if( (pT
c120: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
c130: 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70  wTable)==0 || (p
c140: 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b  FKey = pTab->pFK
c150: 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ey)==0 ) return;
c160: 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65  .  pFKey->isDefe
c170: 72 72 65 64 20 3d 20 69 73 44 65 66 65 72 72 65  rred = isDeferre
c180: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  d;.}../*.** Crea
c190: 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66  te a new index f
c1a0: 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e  or an SQL table.
c1b0: 20 20 70 49 6e 64 65 78 20 69 73 20 74 68 65 20    pIndex is the 
c1c0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
c1d0: 78 20 0a 2a 2a 20 61 6e 64 20 70 54 61 62 6c 65  x .** and pTable
c1e0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
c1f0: 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
c200: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
c210: 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20    Both will .** 
c220: 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72  be NULL for a pr
c230: 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20  imary key or an 
c240: 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72  index that is cr
c250: 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79  eated to satisfy
c260: 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e   a.** UNIQUE con
c270: 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61  straint.  If pTa
c280: 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61  ble and pIndex a
c290: 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61  re NULL, use pPa
c2a0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a  rse->pNewTable.*
c2b0: 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74  * as the table t
c2c0: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
c2d0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
c2e0: 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74   is a table that
c2f0: 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79   is.** currently
c300: 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
c310: 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54  ed by a CREATE T
c320: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
c330: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61  **.** pList is a
c340: 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
c350: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
c360: 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e   pList will be N
c370: 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ULL if this.** i
c380: 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  s a primary key 
c390: 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72  or unique-constr
c3a0: 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74  aint on the most
c3b0: 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61   recent column a
c3c0: 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74  dded.** to the t
c3d0: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
c3e0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
c3f0: 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  n.  .*/.void sql
c400: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
c410: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c420: 2c 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72  ,   /* All infor
c430: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69  mation about thi
c440: 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b  s parse */.  Tok
c450: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a  en *pName1,   /*
c460: 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69   First part of i
c470: 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
c480: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  e NULL */.  Toke
c490: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20  n *pName2,   /* 
c4a0: 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69  Second part of i
c4b0: 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
c4c0: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  e NULL */.  Toke
c4d0: 6e 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20  n *pTblName, /* 
c4e0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
c4f0: 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20  e to index. Use 
c500: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
c510: 65 20 69 66 20 30 20 2a 2f 0a 20 20 49 64 4c 69  e if 0 */.  IdLi
c520: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
c530: 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  A list of column
c540: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
c550: 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
c560: 2c 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72  ,     /* OE_Abor
c570: 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45  t, OE_Ignore, OE
c580: 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f  _Replace, or OE_
c590: 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  None */.  Token 
c5a0: 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68  *pStart,   /* Th
c5b0: 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
c5c0: 68 61 74 20 62 65 67 69 6e 73 20 61 20 43 52 45  hat begins a CRE
c5d0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
c5e0: 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
c5f0: 70 45 6e 64 20 20 20 20 20 20 2f 2a 20 54 68 65  pEnd      /* The
c600: 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73   ")" that closes
c610: 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
c620: 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29  X statement */.)
c630: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
c640: 3d 20 30 3b 20 2f 2a 20 54 61 62 6c 65 20 74 6f  = 0; /* Table to
c650: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
c660: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
c670: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
c680: 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a  o be created */.
c690: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
c6a0: 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  0;.  int i, j;. 
c6b0: 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20   Token nullId;  
c6c0: 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20    /* Fake token 
c6d0: 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20  for an empty ID 
c6e0: 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46 69 78 65  list */.  DbFixe
c6f0: 72 20 73 46 69 78 3b 20 20 20 20 2f 2a 20 46 6f  r sFix;    /* Fo
c700: 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61  r assigning data
c710: 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54  base names to pT
c720: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  able */.  int is
c730: 54 65 6d 70 3b 20 20 20 20 20 20 2f 2a 20 54 72  Temp;      /* Tr
c740: 75 65 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ue for a tempora
c750: 72 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 73 71  ry index */.  sq
c760: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
c770: 65 2d 3e 64 62 3b 0a 0a 20 20 69 6e 74 20 69 44  e->db;..  int iD
c780: 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  b;          /* I
c790: 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
c7a0: 62 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69  base that is bei
c7b0: 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  ng written */.  
c7c0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30  Token *pName = 0
c7d0: 3b 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64  ; /* Unqualified
c7e0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
c7f0: 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  ex to create */.
c800: 0a 2f 2a 0a 20 20 69 66 28 20 70 50 61 72 73 65  ./*.  if( pParse
c810: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
c820: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
c830: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
c840: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20  te_index;.  if( 
c850: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 0a 20  db->init.busy . 
c860: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 46 69      && sqlite3Fi
c870: 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
c880: 72 73 65 2c 20 64 62 2d 3e 69 6e 69 74 2e 69 44  rse, db->init.iD
c890: 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d  b, "index", pNam
c8a0: 65 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74  e).     && sqlit
c8b0: 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46  e3FixSrcList(&sF
c8c0: 69 78 2c 20 70 54 61 62 6c 65 29 0a 20 20 29 7b  ix, pTable).  ){
c8d0: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
c8e0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
c8f0: 0a 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46  .*/..  /*.  ** F
c900: 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68  ind the table th
c910: 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
c920: 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72  xed.  Return ear
c930: 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ly if not found.
c940: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c  .  */.  if( pTbl
c950: 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 63  Name!=0 ){.    c
c960: 68 61 72 20 2a 7a 54 62 6c 4e 61 6d 65 3b 0a 0a  har *zTblName;..
c970: 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74      /* Use the t
c980: 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61  wo-part index na
c990: 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  me to determine 
c9a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
c9b0: 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66    ** to search f
c9c0: 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 49 66  or the table. If
c9d0: 20 6e 6f 20 64 61 74 61 62 61 73 65 20 6e 61 6d   no database nam
c9e0: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
c9f0: 0a 20 20 20 20 2a 2a 20 69 44 62 20 69 73 20 73  .    ** iDb is s
ca00: 65 74 20 74 6f 20 30 2e 20 49 6e 20 74 68 69 73  et to 0. In this
ca10: 20 63 61 73 65 20 73 65 61 72 63 68 20 62 6f 74   case search bot
ca20: 68 20 74 68 65 20 74 65 6d 70 20 61 6e 64 20 6d  h the temp and m
ca30: 61 69 6e 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  ain.    ** datab
ca40: 61 73 65 73 20 66 6f 72 20 74 68 65 20 6e 61 6d  ases for the nam
ca50: 65 64 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  ed table..    */
ca60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
ca70: 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b  me1 && pName2 );
ca80: 0a 20 20 20 20 69 44 62 20 3d 20 72 65 73 6f 6c  .    iDb = resol
ca90: 76 65 53 63 68 65 6d 61 4e 61 6d 65 28 70 50 61  veSchemaName(pPa
caa0: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
cab0: 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
cac0: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f    if( iDb<0 ) go
cad0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
cae0: 6e 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f  ndex;..    /* No
caf0: 77 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65  w search for the
cb00: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
cb10: 74 61 62 61 73 65 20 69 44 62 2e 20 49 66 20 69  tabase iDb. If i
cb20: 44 62 20 69 73 0a 20 20 20 20 2a 2a 20 7a 65 72  Db is.    ** zer
cb30: 6f 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20 62  o, then search b
cb40: 6f 74 68 20 74 68 65 20 22 6d 61 69 6e 22 20 61  oth the "main" a
cb50: 6e 64 20 22 74 65 6d 70 22 20 64 61 74 61 62 61  nd "temp" databa
cb60: 73 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ses..    */.    
cb70: 7a 54 62 6c 4e 61 6d 65 20 3d 20 73 71 6c 69 74  zTblName = sqlit
cb80: 65 33 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  e3TableNameFromT
cb90: 6f 6b 65 6e 28 70 54 62 6c 4e 61 6d 65 29 3b 0a  oken(pTblName);.
cba0: 20 20 20 20 69 66 28 20 21 7a 54 62 6c 4e 61 6d      if( !zTblNam
cbb0: 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  e ){.      pPars
cbc0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
cbd0: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
cbe0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
cbf0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
cc00: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
cc10: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
cc20: 65 31 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  e1!=0 );.    if(
cc30: 20 69 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20   iDb==0 ){.     
cc40: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
cc50: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 62  indTable(db, zTb
cc60: 6c 4e 61 6d 65 2c 20 22 74 65 6d 70 22 29 3b 0a  lName, "temp");.
cc70: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70      }.    if( !p
cc80: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61  Tab ){.      pTa
cc90: 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
cca0: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 7a  eTable(pParse, z
ccb0: 54 62 6c 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62  TblName, db->aDb
ccc0: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  [iDb].zName);.  
ccd0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
cce0: 65 65 28 20 7a 54 62 6c 4e 61 6d 65 20 29 3b 0a  ee( zTblName );.
ccf0: 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20      if( !pTab ) 
cd00: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
cd10: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20  _index;.    iDb 
cd20: 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 7d  = pTab->iDb;.  }
cd30: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
cd40: 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20  ( pName==0 );.  
cd50: 20 20 70 54 61 62 20 3d 20 20 70 50 61 72 73 65    pTab =  pParse
cd60: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20  ->pNewTable;.   
cd70: 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62   iDb = pTab->iDb
cd80: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54 61  ;.  }..  if( pTa
cd90: 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  b==0 || pParse->
cda0: 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74  nErr ) goto exit
cdb0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
cdc0: 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f   if( pTab->readO
cdd0: 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nly ){.    sqlit
cde0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
cdf0: 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
ce00: 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
ce10: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
ce20: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
ce30: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
ce40: 2f 2a 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69  /*.  if( pTab->i
ce50: 44 62 3e 3d 32 20 26 26 20 64 62 2d 3e 69 6e 69  Db>=2 && db->ini
ce60: 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20  t.busy==0 ){.   
ce70: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
ce80: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
ce90: 25 73 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  %s may not have 
cea0: 69 6e 64 69 63 65 73 20 61 64 64 65 64 22 2c 20  indices added", 
ceb0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
cec0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
ced0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 2a 2f  te_index;.  }.*/
cee0: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65  .  if( pTab->pSe
cef0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
cf00: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
cf10: 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e  se, "views may n
cf20: 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
cf30: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
cf40: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
cf50: 0a 20 20 69 73 54 65 6d 70 20 3d 20 70 54 61 62  .  isTemp = pTab
cf60: 2d 3e 69 44 62 3d 3d 31 3b 0a 0a 20 20 2f 2a 0a  ->iDb==1;..  /*.
cf70: 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61    ** Find the na
cf80: 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  me of the index.
cf90: 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72    Make sure ther
cfa0: 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
cfb0: 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e   another.  ** in
cfc0: 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74  dex or table wit
cfd0: 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
cfe0: 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63    .  **.  ** Exc
cff0: 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61  eption:  If we a
d000: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e  re reading the n
d010: 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e  ames of permanen
d020: 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74  t indices from t
d030: 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d  he.  ** sqlite_m
d040: 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63  aster table (bec
d050: 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  ause some other 
d060: 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20  process changed 
d070: 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a  the schema) and.
d080: 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20    ** one of the 
d090: 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c  index names coll
d0a0: 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61  ides with the na
d0b0: 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72  me of a temporar
d0c0: 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20  y table or.  ** 
d0d0: 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77  index, then we w
d0e0: 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
d0f0: 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64  process this ind
d100: 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ex..  **.  ** If
d110: 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61   pName==0 it mea
d120: 6e 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20  ns that we are. 
d130: 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68   ** dealing with
d140: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
d150: 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
d160: 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f  int.  We have to
d170: 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a   invent our.  **
d180: 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   own name..  */.
d190: 20 20 69 66 28 20 70 4e 61 6d 65 20 26 26 20 21    if( pName && !
d1a0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
d1b0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 53 61  .    Index *pISa
d1c0: 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 6e  meName;    /* An
d1d0: 6f 74 68 65 72 20 69 6e 64 65 78 20 77 69 74 68  other index with
d1e0: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 2a   the same name *
d1f0: 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 53  /.    Table *pTS
d200: 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41  ameName;    /* A
d210: 20 74 61 62 6c 65 20 77 69 74 68 20 73 61 6d 65   table with same
d220: 20 6e 61 6d 65 20 61 73 20 74 68 65 20 69 6e 64   name as the ind
d230: 65 78 20 2a 2f 0a 20 20 20 20 7a 4e 61 6d 65 20  ex */.    zName 
d240: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
d250: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
d260: 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  >n);.    if( zNa
d270: 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
d280: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
d290: 20 20 20 20 69 66 28 20 28 70 49 53 61 6d 65 4e      if( (pISameN
d2a0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ame = sqlite3Fin
d2b0: 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
d2c0: 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 0))!=0 ){.    
d2d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
d2e0: 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
d2f0: 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73   %s already exis
d300: 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ts", zName);.   
d310: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
d320: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
d330: 0a 20 20 20 20 69 66 28 20 28 70 54 53 61 6d 65  .    if( (pTSame
d340: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Name = sqlite3Fi
d350: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
d360: 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20  e, 0))!=0 ){.   
d370: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
d380: 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
d390: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74  e is already a t
d3a0: 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20  able named %s", 
d3b0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
d3c0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
d3d0: 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ndex;.    }.  }e
d3e0: 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30  lse if( pName==0
d3f0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   ){.    char zBu
d400: 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e  f[30];.    int n
d410: 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f  ;.    Index *pLo
d420: 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f  op;.    for(pLoo
d430: 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20  p=pTab->pIndex, 
d440: 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  n=1; pLoop; pLoo
d450: 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20  p=pLoop->pNext, 
d460: 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e  n++){}.    sprin
d470: 74 66 28 7a 42 75 66 2c 22 25 64 29 22 2c 6e 29  tf(zBuf,"%d)",n)
d480: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  ;.    zName = 0;
d490: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
d4a0: 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 28  tring(&zName, "(
d4b0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
d4c0: 22 20 61 75 74 6f 69 6e 64 65 78 20 22 2c 20 7a  " autoindex ", z
d4d0: 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Buf, (char*)0);.
d4e0: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
d4f0: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
d500: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 65 6c  ate_index;.  }el
d510: 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  se{.    zName = 
d520: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e  sqliteStrNDup(pN
d530: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
d540: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  );.  }..  /* Che
d550: 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61  ck for authoriza
d560: 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61  tion to create a
d570: 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69  n index..  */.#i
d580: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d590: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
d5a0: 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68    {.    const ch
d5b0: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
d5c0: 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61  b[pTab->iDb].zNa
d5d0: 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
d5e0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
d5f0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
d600: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
d610: 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62  (isTemp), 0, zDb
d620: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
d630: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
d640: 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  x;.    }.    i =
d650: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49   SQLITE_CREATE_I
d660: 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 69 73  NDEX;.    if( is
d670: 54 65 6d 70 20 29 20 69 20 3d 20 53 51 4c 49 54  Temp ) i = SQLIT
d680: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
d690: 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
d6a0: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
d6b0: 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  arse, i, zName, 
d6c0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
d6d0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
d6e0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
d6f0: 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
d700: 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69  dif..  /* If pLi
d710: 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20  st==0, it means 
d720: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
d730: 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20   called to make 
d740: 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b  a primary.  ** k
d750: 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61  ey out of the la
d760: 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20  st column added 
d770: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  to the table und
d780: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
d790: 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20  .  ** So create 
d7a0: 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73  a fake list to s
d7b0: 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20  imulate this..  
d7c0: 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  */.  if( pList==
d7d0: 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  0 ){.    nullId.
d7e0: 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  z = pTab->aCol[p
d7f0: 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61  Tab->nCol-1].zNa
d800: 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e  me;.    nullId.n
d810: 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c 6c 49 64   = strlen(nullId
d820: 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  .z);.    pList =
d830: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70   sqlite3IdListAp
d840: 70 65 6e 64 28 30 2c 20 26 6e 75 6c 6c 49 64 29  pend(0, &nullId)
d850: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
d860: 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
d870: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
d880: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c  ..  /* .  ** All
d890: 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
d8a0: 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f  structure. .  */
d8b0: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
d8c0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
d8d0: 28 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e  (Index) + strlen
d8e0: 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20 20  (zName) + 1 +.  
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d900: 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 69 6e        (sizeof(in
d910: 74 29 20 2b 20 73 69 7a 65 6f 66 28 43 6f 6c 6c  t) + sizeof(Coll
d920: 53 65 71 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e 49  Seq*))*pList->nI
d930: 64 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  d );.  if( pInde
d940: 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  x==0 ) goto exit
d950: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
d960: 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
d970: 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64 65  n = (int*)&pInde
d980: 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
d990: 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b 0a 20 20  [pList->nId];.  
d9a0: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20  pIndex->zName = 
d9b0: 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e  (char*)&pIndex->
d9c0: 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e  aiColumn[pList->
d9d0: 6e 49 64 5d 3b 0a 20 20 73 74 72 63 70 79 28 70  nId];.  strcpy(p
d9e0: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  Index->zName, zN
d9f0: 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ame);.  pIndex->
da00: 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20  pTable = pTab;. 
da10: 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
da20: 20 3d 20 70 4c 69 73 74 2d 3e 6e 49 64 3b 0a 20   = pList->nId;. 
da30: 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
da40: 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49   = onError;.  pI
da50: 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20  ndex->autoIndex 
da60: 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20 20 70 49  = pName==0;.  pI
da70: 6e 64 65 78 2d 3e 69 44 62 20 3d 20 69 44 62 3b  ndex->iDb = iDb;
da80: 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20  ..  /* Scan the 
da90: 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
daa0: 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c  umns of the tabl
dab0: 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  e to be indexed 
dac0: 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68  and.  ** load th
dad0: 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73  e column indices
dae0: 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20   into the Index 
daf0: 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f  structure.  Repo
db00: 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a  rt an error.  **
db10: 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69   if any column i
db20: 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a  s not found..  *
db30: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
db40: 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
db50: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
db60: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
db70: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
db80: 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
db90: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[i].zName, pT
dba0: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
dbb0: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
dbc0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d     }.    if( j>=
dbd0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
dbe0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
dbf0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
dc00: 6c 65 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c  le %s has no col
dc10: 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20  umn named %s",. 
dc20: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
dc30: 6d 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  me, pList->a[i].
dc40: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  zName);.      sq
dc50: 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65 78 29  liteFree(pIndex)
dc60: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
dc70: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
dc80: 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
dc90: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
dca0: 6a 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b  j;.    pIndex->k
dcb0: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20  eyInfo.aColl[i] 
dcc0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
dcd0: 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e  pColl;.  }.  pIn
dce0: 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69  dex->keyInfo.nFi
dcf0: 65 6c 64 20 3d 20 70 4c 69 73 74 2d 3e 6e 49 64  eld = pList->nId
dd00: 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  ;..  /* Link the
dd10: 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63   new Index struc
dd20: 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c  ture to its tabl
dd30: 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68  e and to the oth
dd40: 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  er.  ** in-memor
dd50: 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  y database struc
dd60: 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69  tures. .  */.  i
dd70: 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  f( !pParse->expl
dd80: 61 69 6e 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ain ){.    Index
dd90: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c   *p;.    p = sql
dda0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
ddb0: 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e  db->aDb[pIndex->
ddc0: 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 0a 20  iDb].idxHash, . 
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dde0: 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
ddf0: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49  zName, strlen(pI
de00: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20  ndex->zName)+1, 
de10: 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28  pIndex);.    if(
de20: 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65   p ){.      asse
de30: 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b  rt( p==pIndex );
de40: 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
de50: 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
de60: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
de70: 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  (pIndex);.      
de80: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
de90: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
dea0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
deb0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
dec0: 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  ges;.  }..  /* W
ded0: 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e  hen adding an in
dee0: 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20  dex to the list 
def0: 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61  of indices for a
df00: 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a   table, make.  *
df10: 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63  * sure all indic
df20: 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65  es labeled OE_Re
df30: 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72  place come after
df40: 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c   all those label
df50: 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72  ed.  ** OE_Ignor
df60: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  e.  This is nece
df70: 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f  ssary for the co
df80: 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
df90: 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61  of UPDATE.  ** a
dfa0: 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a  nd INSERT..  */.
dfb0: 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f    if( onError!=O
dfc0: 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61  E_Replace || pTa
dfd0: 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20  b->pIndex==0.   
dfe0: 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e      || pTab->pIn
dff0: 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
e000: 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 70  _Replace){.    p
e010: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
e020: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
e030: 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20   pTab->pIndex = 
e040: 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b  pIndex;.  }else{
e050: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68  .    Index *pOth
e060: 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  er = pTab->pInde
e070: 78 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 4f  x;.    while( pO
e080: 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70  ther->pNext && p
e090: 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e  Other->pNext->on
e0a0: 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
e0b0: 65 20 29 7b 0a 20 20 20 20 20 20 70 4f 74 68 65  e ){.      pOthe
e0c0: 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  r = pOther->pNex
e0d0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  t;.    }.    pIn
e0e0: 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74  dex->pNext = pOt
e0f0: 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
e100: 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20  pOther->pNext = 
e110: 70 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  pIndex;.  }..  /
e120: 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
e130: 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d  t.busy is 1 it m
e140: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
e150: 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20  ing the SQL off 
e160: 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65  the.  ** "sqlite
e170: 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f  _master" table o
e180: 6e 20 74 68 65 20 64 69 73 6b 2e 20 20 53 6f 20  n the disk.  So 
e190: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  do not write to 
e1a0: 74 68 65 20 64 69 73 6b 0a 20 20 2a 2a 20 61 67  the disk.  ** ag
e1b0: 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68  ain.  Extract th
e1c0: 65 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 66  e table number f
e1d0: 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74  rom the db->init
e1e0: 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 0a  .newTnum field..
e1f0: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
e200: 6e 69 74 2e 62 75 73 79 20 26 26 20 70 54 62 6c  nit.busy && pTbl
e210: 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 70  Name!=0 ){.    p
e220: 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62  Index->tnum = db
e230: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a  ->init.newTnum;.
e240: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
e250: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
e260: 73 20 30 20 74 68 65 6e 20 63 72 65 61 74 65 20  s 0 then create 
e270: 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73  the index on dis
e280: 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e  k.  This.  ** in
e290: 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74  volves writing t
e2a0: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68  he index into th
e2b0: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e master table a
e2c0: 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  nd filling in th
e2d0: 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74  e.  ** index wit
e2e0: 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  h the current ta
e2f0: 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20  ble contents..  
e300: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e  **.  ** The db->
e310: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 77  init.busy is 0 w
e320: 68 65 6e 20 74 68 65 20 75 73 65 72 20 66 69 72  hen the user fir
e330: 73 74 20 65 6e 74 65 72 73 20 61 20 43 52 45 41  st enters a CREA
e340: 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63  TE INDEX .  ** c
e350: 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69  ommand.  db->ini
e360: 74 2e 62 75 73 79 20 69 73 20 31 20 77 68 65 6e  t.busy is 1 when
e370: 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20 6f   a database is o
e380: 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20  pened and .  ** 
e390: 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
e3a0: 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64  tements are read
e3b0: 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74   out of the mast
e3c0: 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20  er table.  In.  
e3d0: 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63 61  ** the latter ca
e3e0: 73 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72  se the index alr
e3f0: 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64  eady exists on d
e400: 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68  isk, which is wh
e410: 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20  y.  ** we don't 
e420: 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65  want to recreate
e430: 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   it..  **.  ** I
e440: 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74  f pTblName==0 it
e450: 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65   means this inde
e460: 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61  x is generated a
e470: 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a  s a primary key.
e480: 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63    ** or UNIQUE c
e490: 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43  onstraint of a C
e4a0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
e4b0: 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68  ement.  Since th
e4c0: 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73  e table.  ** has
e4d0: 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74   just been creat
e4e0: 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  ed, it contains 
e4f0: 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20  no data and the 
e500: 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61  index initializa
e510: 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63  tion.  ** step c
e520: 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20  an be skipped.. 
e530: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 64   */.  else if( d
e540: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
e550: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
e560: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 69    Vdbe *v;.    i
e570: 6e 74 20 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a 20  nt lbl1, lbl2;. 
e580: 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 76     int i;..    v
e590: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
e5a0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
e5b0: 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65  f( v==0 ) goto e
e5c0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
e5d0: 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61  ;.    if( pTblNa
e5e0: 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  me!=0 ){.      s
e5f0: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
e600: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
e610: 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  , 0, iDb);.     
e620: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
e630: 65 72 54 61 62 6c 65 28 76 2c 20 69 44 62 29 3b  erTable(v, iDb);
e640: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
e650: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
e660: 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30  P_NewRecno, 0, 0
e670: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
e680: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69  beOp3(v, OP_Stri
e690: 6e 67 2c 20 30 2c 20 30 2c 20 22 69 6e 64 65 78  ng, 0, 0, "index
e6a0: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
e6b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
e6c0: 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  3(v, OP_String, 
e6d0: 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  0, 0, pIndex->zN
e6e0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ame, 0);.    sql
e6f0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
e700: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20  P_String, 0, 0, 
e710: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
e720: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e730: 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  Op3(v, OP_Create
e740: 49 6e 64 65 78 2c 20 30 2c 20 69 44 62 2c 28 63  Index, 0, iDb,(c
e750: 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 74 6e  har*)&pIndex->tn
e760: 75 6d 2c 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a  um,P3_POINTER);.
e770: 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
e780: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 54   = 0;.    if( pT
e790: 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  blName ){.      
e7a0: 73 71 6c 69 74 65 33 56 64 62 65 43 6f 64 65 28  sqlite3VdbeCode(
e7b0: 76 2c 0a 20 20 20 20 20 20 20 20 20 20 4f 50 5f  v,.          OP_
e7c0: 44 75 70 2c 20 20 20 20 20 20 20 30 2c 20 20 20  Dup,       0,   
e7d0: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
e7e0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 69 44  OP_Integer,   iD
e7f0: 62 2c 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30  b,    0,.      0
e800: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e810: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
e820: 65 6e 57 72 69 74 65 2c 20 31 2c 20 30 2c 0a 20  enWrite, 1, 0,. 
e830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e840: 20 20 20 20 28 63 68 61 72 2a 29 26 70 49 6e 64      (char*)&pInd
e850: 65 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f  ex->keyInfo, P3_
e860: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 7d 0a  KEYINFO);.    }.
e870: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e880: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
e890: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  g, 0, 0);.    if
e8a0: 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e 64  ( pStart && pEnd
e8b0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e8c0: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
e8d0: 20 2d 31 2c 20 22 43 52 45 41 54 45 20 49 4e 44   -1, "CREATE IND
e8e0: 45 58 20 22 2c 20 50 33 5f 53 54 41 54 49 43 29  EX ", P3_STATIC)
e8f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
e900: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
e910: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
e920: 20 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e      n = Addr(pEn
e930: 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 4e 61  d->z) - Addr(pNa
e940: 6d 65 2d 3e 7a 29 20 2b 20 31 3b 0a 20 20 20 20  me->z) + 1;.    
e950: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
e960: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 4e 61  ngeP3(v, -1, pNa
e970: 6d 65 2d 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  me->z, n);.     
e980: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e990: 70 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20  p(v, OP_Concat, 
e9a0: 32 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  2, 0);.    }.   
e9b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
e9c0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
e9d0: 2c 20 35 2c 20 30 2c 20 22 74 74 74 69 74 22 2c  , 5, 0, "tttit",
e9e0: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
e9f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ea00: 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65  p(v, OP_PutIntKe
ea10: 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  y, 0, 0);.    if
ea20: 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20  ( pTblName ){.  
ea30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ea40: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
ea50: 65 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20 30  er, pTab->iDb, 0
ea60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ea70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ea80: 4f 70 65 6e 52 65 61 64 2c 20 32 2c 20 70 54 61  OpenRead, 2, pTa
ea90: 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20  b->tnum);.      
eaa0: 2f 2a 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  /* VdbeComment((
eab0: 76 2c 20 22 25 73 22 2c 20 70 54 61 62 2d 3e 7a  v, "%s", pTab->z
eac0: 4e 61 6d 65 29 29 3b 20 2a 2f 0a 20 20 20 20 20  Name)); */.     
ead0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
eae0: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
eaf0: 6c 75 6d 6e 73 2c 20 32 2c 20 70 54 61 62 2d 3e  lumns, 2, pTab->
eb00: 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 6c 62 6c  nCol);.      lbl
eb10: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
eb20: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
eb30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
eb40: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
eb50: 2c 20 32 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20  , 2, lbl2);.    
eb60: 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 33    lbl1 = sqlite3
eb70: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
eb80: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
eb90: 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
eba0: 79 28 76 2c 20 70 49 6e 64 65 78 2c 20 32 29 3b  y(v, pIndex, 2);
ebb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ebc0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 50  beOp3(v, OP_IdxP
ebd0: 75 74 2c 20 31 2c 20 70 49 6e 64 65 78 2d 3e 6f  ut, 1, pIndex->o
ebe0: 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 2c  nError!=OE_None,
ebf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ec00: 20 20 20 20 20 20 20 22 69 6e 64 65 78 65 64 20         "indexed 
ec10: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20  columns are not 
ec20: 75 6e 69 71 75 65 22 2c 20 50 33 5f 53 54 41 54  unique", P3_STAT
ec30: 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
ec40: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ec50: 50 5f 4e 65 78 74 2c 20 32 2c 20 6c 62 6c 31 29  P_Next, 2, lbl1)
ec60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ec70: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
ec80: 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20  v, lbl2);.      
ec90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
eca0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 32 2c  (v, OP_Close, 2,
ecb0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
ecc0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ecd0: 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a  P_Close, 1, 0);.
ece0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54      }.    if( pT
ecf0: 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
ed00: 20 20 20 69 66 28 20 21 69 73 54 65 6d 70 20 29     if( !isTemp )
ed10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ed20: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  3ChangeCookie(db
ed30: 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  , v, iDb);.     
ed40: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
ed50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ed60: 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Close, 0, 0);.  
ed70: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 57 72      sqlite3EndWr
ed80: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
ed90: 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rse);.    }.  }.
eda0: 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62  .  /* Clean up b
edb0: 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
edc0: 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64  .exit_create_ind
edd0: 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 49 64 4c  ex:.  sqlite3IdL
ede0: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
edf0: 3b 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 53 72  ;.  /* sqlite3Sr
ee00: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54 61 62  cListDelete(pTab
ee10: 6c 65 29 3b 20 2a 2f 0a 20 20 73 71 6c 69 74 65  le); */.  sqlite
ee20: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72  Free(zName);.  r
ee30: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
ee40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
ee50: 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69  l drop an existi
ee60: 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20  ng named index. 
ee70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
ee80: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
ee90: 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65  DROP INDEX state
eea0: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
eeb0: 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50  lite3DropIndex(P
eec0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
eed0: 63 4c 69 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20  cList *pName){. 
eee0: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
eef0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
ef00: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
ef10: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61  ->db;..  if( pPa
ef20: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
ef30: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
ef40: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  ed ) return;.  a
ef50: 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
ef60: 72 63 3d 3d 31 20 29 3b 0a 20 20 70 49 6e 64 65  rc==1 );.  pInde
ef70: 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
ef80: 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e  ndex(db, pName->
ef90: 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d  a[0].zName, pNam
efa0: 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
efb0: 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  e);.  if( pIndex
efc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
efd0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
efe0: 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
eff0: 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30  x: %S", pName, 0
f000: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
f010: 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
f020: 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61  .  if( pIndex->a
f030: 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  utoIndex ){.    
f040: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f050: 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61  pParse, "index a
f060: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55  ssociated with U
f070: 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f  NIQUE ".      "o
f080: 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
f090: 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
f0a0: 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b  be dropped", 0);
f0b0: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
f0c0: 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 2f  rop_index;.  }./
f0d0: 2a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  *.  if( pIndex->
f0e0: 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c  iDb>1 ){.    sql
f0f0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
f100: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 61 6c 74  rse, "cannot alt
f110: 65 72 20 73 63 68 65 6d 61 20 6f 66 20 61 74 74  er schema of att
f120: 61 63 68 65 64 20 22 0a 20 20 20 20 20 20 20 22  ached ".       "
f130: 64 61 74 61 62 61 73 65 73 22 2c 20 30 29 3b 0a  databases", 0);.
f140: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
f150: 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 2a 2f  op_index;.  }.*/
f160: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f170: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
f180: 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
f190: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
f1a0: 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62  P_INDEX;.    Tab
f1b0: 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
f1c0: 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63  x->pTable;.    c
f1d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
f1e0: 20 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d   db->aDb[pIndex-
f1f0: 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >iDb].zName;.   
f200: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
f210: 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
f220: 28 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20  (pIndex->iDb);. 
f230: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
f240: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
f250: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
f260: 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Tab, 0, zDb) ){.
f270: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
f280: 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
f290: 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  }.    if( pIndex
f2a0: 2d 3e 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53  ->iDb ) code = S
f2b0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
f2c0: 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
f2d0: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
f2e0: 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49  pParse, code, pI
f2f0: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61  ndex->zName, pTa
f300: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
f310: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
f320: 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
f330: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
f340: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
f350: 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
f360: 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20   index and from 
f370: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
f380: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
f390: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
f3a0: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
f3b0: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 4c 69   static VdbeOpLi
f3c0: 73 74 20 64 72 6f 70 49 6e 64 65 78 5b 5d 20 3d  st dropIndex[] =
f3d0: 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65   {.      { OP_Re
f3e0: 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44  wind,     0, ADD
f3f0: 52 28 39 29 2c 20 30 7d 2c 20 0a 20 20 20 20 20  R(9), 0}, .     
f400: 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20   { OP_String,   
f410: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d    0, 0,       0}
f420: 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20  , /* 1 */.      
f430: 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20  { OP_MemStore,  
f440: 20 31 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c   1, 1,       0},
f450: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c  .      { OP_MemL
f460: 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20  oad,    1, 0,   
f470: 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a      0}, /* 3 */.
f480: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
f490: 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20  n,     0, 1,    
f4a0: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
f4b0: 50 5f 45 71 2c 20 20 20 20 20 20 20 20 20 30 2c  P_Eq,         0,
f4c0: 20 41 44 44 52 28 38 29 2c 20 30 7d 2c 0a 20 20   ADDR(8), 0},.  
f4d0: 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20      { OP_Next,  
f4e0: 20 20 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c       0, ADDR(3),
f4f0: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
f500: 47 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41  Goto,       0, A
f510: 44 44 52 28 39 29 2c 20 30 7d 2c 0a 20 20 20 20  DDR(9), 0},.    
f520: 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20    { OP_Delete,  
f530: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30     0, 0,       0
f540: 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 7d  }, /* 8 */.    }
f550: 3b 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a  ;.    int base;.
f560: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
f570: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
f580: 70 50 61 72 73 65 2c 20 30 2c 20 70 49 6e 64 65  pParse, 0, pInde
f590: 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  x->iDb);.    sql
f5a0: 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61  ite3OpenMasterTa
f5b0: 62 6c 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 69  ble(v, pIndex->i
f5c0: 44 62 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20  Db);.    base = 
f5d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f5e0: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
f5f0: 65 28 64 72 6f 70 49 6e 64 65 78 29 2c 20 64 72  e(dropIndex), dr
f600: 6f 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71  opIndex);.    sq
f610: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
f620: 33 28 76 2c 20 62 61 73 65 2b 31 2c 20 70 49 6e  3(v, base+1, pIn
f630: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  dex->zName, 0);.
f640: 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
f650: 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb!=1 ){.      
f660: 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
f670: 6b 69 65 28 64 62 2c 20 76 2c 20 70 49 6e 64 65  kie(db, v, pInde
f680: 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 7d 0a 20  x->iDb);.    }. 
f690: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f6a0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
f6b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
f6c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f6d0: 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49 6e 64  OP_Destroy, pInd
f6e0: 65 78 2d 3e 74 6e 75 6d 2c 20 70 49 6e 64 65 78  ex->tnum, pIndex
f6f0: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  ->iDb);.    sqli
f700: 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61  te3EndWriteOpera
f710: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
f720: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  }..  /* Delete t
f730: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 65 73  he in-memory des
f740: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 69 73  cription of this
f750: 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69   index..  */.  i
f760: 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  f( !pParse->expl
f770: 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ain ){.    sqlit
f780: 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
f790: 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  eIndex(db, pInde
f7a0: 78 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  x);.    db->flag
f7b0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
f7c0: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a  rnChanges;.  }..
f7d0: 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a  exit_drop_index:
f7e0: 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
f7f0: 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a  tDelete(pName);.
f800: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
f810: 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
f820: 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73   the given IdLis
f830: 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
f840: 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65   IdList if.** ne
f850: 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ed be..**.** A n
f860: 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74  ew IdList is ret
f870: 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
f880: 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
f890: 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c  ..*/.IdList *sql
f8a0: 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
f8b0: 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
f8c0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
f8d0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
f8e0: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
f8f0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
f900: 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20  of(IdList) );.  
f910: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
f920: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
f930: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30  List->nAlloc = 0
f940: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
f950: 74 2d 3e 6e 49 64 3e 3d 70 4c 69 73 74 2d 3e 6e  t->nId>=pList->n
f960: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 73 74 72  Alloc ){.    str
f970: 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20  uct IdList_item 
f980: 2a 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e  *a;.    pList->n
f990: 41 6c 6c 6f 63 20 3d 20 70 4c 69 73 74 2d 3e 6e  Alloc = pList->n
f9a0: 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20 20 20  Alloc*2 + 5;.   
f9b0: 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c   a = sqliteReall
f9c0: 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69  oc(pList->a, pLi
f9d0: 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f  st->nAlloc*sizeo
f9e0: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29  f(pList->a[0]) )
f9f0: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
fa00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
fa10: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  dListDelete(pLis
fa20: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
fa30: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c   0;.    }.    pL
fa40: 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a  ist->a = a;.  }.
fa50: 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d    memset(&pList-
fa60: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20  >a[pList->nId], 
fa70: 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  0, sizeof(pList-
fa80: 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70  >a[0]));.  if( p
fa90: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68 61  Token ){.    cha
faa0: 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d  r **pz = &pList-
fab0: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a  >a[pList->nId].z
fac0: 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Name;.    sqlite
fad0: 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20  3SetNString(pz, 
fae0: 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65  pToken->z, pToke
faf0: 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66  n->n, 0);.    if
fb00: 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  ( *pz==0 ){.    
fb10: 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
fb20: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
fb30: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
fb40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
fb50: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 2a 70  qlite3Dequote(*p
fb60: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  z);.    }.  }.  
fb70: 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20  pList->nId++;.  
fb80: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
fb90: 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
fba0: 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  new table name t
fbb0: 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  o the given SrcL
fbc0: 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
fbd0: 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a  ew SrcList if.**
fbe0: 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77   need be.  A new
fbf0: 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65   entry is create
fc00: 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  d in the SrcList
fc10: 20 65 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20   even if pToken 
fc20: 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41  is NULL..**.** A
fc30: 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 73 20   new SrcList is 
fc40: 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
fc50: 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  L if malloc() fa
fc60: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  ils..**.** If pD
fc70: 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e  atabase is not n
fc80: 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ull, it means th
fc90: 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  at the table has
fca0: 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20   an optional.** 
fcb0: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72  database name pr
fcc0: 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73  efix.  Like this
fcd0: 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62  :  "database.tab
fce0: 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62  le".  The pDatab
fcf0: 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  ase.** points to
fd00: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
fd10: 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70  and the pTable p
fd20: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74  oints to the dat
fd30: 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54  abase name..** T
fd40: 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  he SrcList.a[].z
fd50: 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69  Name field is fi
fd60: 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61  lled with the ta
fd70: 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d  ble name which m
fd80: 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f  ight.** come fro
fd90: 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61  m pTable (if pDa
fda0: 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20  tabase is NULL) 
fdb0: 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73  or from pDatabas
fdc0: 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e  e.  .** SrcList.
fdd0: 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73  a[].zDatabase is
fde0: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
fdf0: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66   database name f
fe00: 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f  rom pTable,.** o
fe10: 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e  r with NULL if n
fe20: 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70  o database is sp
fe30: 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ecified..**.** I
fe40: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
fe50: 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73  f call like this
fe60: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
fe70: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
fe80: 70 65 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a  pend(A,B,0);.**.
fe90: 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74  ** Then B is a t
fea0: 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
feb0: 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
fec0: 69 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20  is unspecified. 
fed0: 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69   If called.** li
fee0: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
fef0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
ff00: 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c  cListAppend(A,B,
ff10: 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43  C);.**.** Then C
ff20: 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61   is the table na
ff30: 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20  me and B is the 
ff40: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
ff50: 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
ff60: 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
ff70: 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  SrcList *pList, 
ff80: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54  Token *pTable, T
ff90: 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 29  oken *pDatabase)
ffa0: 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  {.  if( pList==0
ffb0: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
ffc0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
ffd0: 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b  zeof(SrcList) );
ffe0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
fff0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
10000 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
10010 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 1;.  }.  if( p
10020 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73  List->nSrc>=pLis
10030 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  t->nAlloc ){.   
10040 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
10050 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
10060 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65 77  c *= 2;.    pNew
10070 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
10080 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20 20 20  (pList,.        
10090 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70         sizeof(*p
100a0 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74 2d 3e  List) + (pList->
100b0 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66  nAlloc-1)*sizeof
100c0 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b  (pList->a[0]) );
100d0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
100e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
100f0 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
10100 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
10110 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
10120 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20   pList = pNew;. 
10130 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c 69   }.  memset(&pLi
10140 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
10150 63 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c  c], 0, sizeof(pL
10160 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69  ist->a[0]));.  i
10170 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20  f( pDatabase && 
10180 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20  pDatabase->z==0 
10190 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  ){.    pDatabase
101a0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
101b0 70 44 61 74 61 62 61 73 65 20 26 26 20 70 54 61  pDatabase && pTa
101c0 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e  ble ){.    Token
101d0 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62   *pTemp = pDatab
101e0 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61  ase;.    pDataba
101f0 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20  se = pTable;.   
10200 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b   pTable = pTemp;
10210 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 6c  .  }.  if( pTabl
10220 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a  e ){.    char **
10230 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  pz = &pList->a[p
10240 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a 4e 61 6d  List->nSrc].zNam
10250 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  e;.    sqlite3Se
10260 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 54 61  tNString(pz, pTa
10270 62 6c 65 2d 3e 7a 2c 20 70 54 61 62 6c 65 2d 3e  ble->z, pTable->
10280 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a  n, 0);.    if( *
10290 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  pz==0 ){.      s
102a0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
102b0 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
102c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
102d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
102e0 69 74 65 33 44 65 71 75 6f 74 65 28 2a 70 7a 29  ite3Dequote(*pz)
102f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
10300 28 20 70 44 61 74 61 62 61 73 65 20 29 7b 0a 20  ( pDatabase ){. 
10310 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26     char **pz = &
10320 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
10330 6e 53 72 63 5d 2e 7a 44 61 74 61 62 61 73 65 3b  nSrc].zDatabase;
10340 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e  .    sqlite3SetN
10350 53 74 72 69 6e 67 28 70 7a 2c 20 70 44 61 74 61  String(pz, pData
10360 62 61 73 65 2d 3e 7a 2c 20 70 44 61 74 61 62 61  base->z, pDataba
10370 73 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69  se->n, 0);.    i
10380 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20  f( *pz==0 ){.   
10390 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
103a0 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
103b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
103c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
103d0 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
103e0 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  *pz);.    }.  }.
103f0 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74    pList->a[pList
10400 2d 3e 6e 53 72 63 5d 2e 69 43 75 72 73 6f 72 20  ->nSrc].iCursor 
10410 3d 20 2d 31 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e  = -1;.  pList->n
10420 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  Src++;.  return 
10430 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
10440 41 73 73 69 67 6e 20 63 75 72 73 6f 72 73 20 74  Assign cursors t
10450 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  o all tables in 
10460 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69  a SrcList.*/.voi
10470 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
10480 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61  AssignCursors(Pa
10490 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
104a0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
104b0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
104c0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
104d0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
104e0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
104f0 6f 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  or<0 ){.      pL
10500 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
10510 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
10520 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ++;.    }.  }.}.
10530 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61 6c  ./*.** Add an al
10540 69 61 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ias to the last 
10550 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 20 74 68  identifier on th
10560 65 20 67 69 76 65 6e 20 69 64 65 6e 74 69 66 69  e given identifi
10570 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  er list..*/.void
10580 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
10590 64 64 41 6c 69 61 73 28 53 72 63 4c 69 73 74 20  ddAlias(SrcList 
105a0 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
105b0 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c  Token){.  if( pL
105c0 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 53  ist && pList->nS
105d0 72 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  rc>0 ){.    int 
105e0 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20  i = pList->nSrc 
105f0 2d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  - 1;.    sqlite3
10600 53 65 74 4e 53 74 72 69 6e 67 28 26 70 4c 69 73  SetNString(&pLis
10610 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20  t->a[i].zAlias, 
10620 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65  pToken->z, pToke
10630 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71  n->n, 0);.    sq
10640 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 4c 69  lite3Dequote(pLi
10650 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29  st->a[i].zAlias)
10660 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
10670 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e  elete an IdList.
10680 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
10690 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64 4c  IdListDelete(IdL
106a0 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
106b0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
106c0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
106d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
106e0 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
106f0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
10700 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
10710 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
10720 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  e(pList->a);.  s
10730 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 29  qliteFree(pList)
10740 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
10750 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70  n the index in p
10760 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e  List of the iden
10770 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64  tifier named zId
10780 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20  .  Return -1.** 
10790 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
107a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69  .int sqlite3IdLi
107b0 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a  stIndex(IdList *
107c0 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61  pList, const cha
107d0 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
107e0 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
107f0 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  =0 ) return -1;.
10800 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
10810 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
10820 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
10830 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
10840 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d  ].zName, zName)=
10850 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
10860 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
10870 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
10880 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73  an entire SrcLis
10890 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20  t including all 
108a0 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65  its substructure
108b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
108c0 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53  3SrcListDelete(S
108d0 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
108e0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
108f0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
10900 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
10910 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
10920 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
10930 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 44 61  (pList->a[i].zDa
10940 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c  tabase);.    sql
10950 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
10960 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
10970 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
10980 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a  ->a[i].zAlias);.
10990 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
109a0 5b 69 5d 2e 70 54 61 62 20 26 26 20 70 4c 69 73  [i].pTab && pLis
109b0 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d 3e 69 73  t->a[i].pTab->is
109c0 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20  Transient ){.   
109d0 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
109e0 54 61 62 6c 65 28 30 2c 20 70 4c 69 73 74 2d 3e  Table(0, pList->
109f0 61 5b 69 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20  a[i].pTab);.    
10a00 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  }.    sqlite3Sel
10a10 65 63 74 44 65 6c 65 74 65 28 70 4c 69 73 74 2d  ectDelete(pList-
10a20 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a  >a[i].pSelect);.
10a30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
10a40 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  elete(pList->a[i
10a50 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ].pOn);.    sqli
10a60 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
10a70 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 55 73 69  pList->a[i].pUsi
10a80 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ng);.  }.  sqlit
10a90 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  eFree(pList);.}.
10aa0 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74  ./*.** Begin a t
10ab0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
10ac0 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54  id sqlite3BeginT
10ad0 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
10ae0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e   *pParse, int on
10af0 45 72 72 6f 72 29 7b 0a 20 20 73 71 6c 69 74 65  Error){.  sqlite
10b00 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61   *db;..  if( pPa
10b10 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50  rse==0 || (db=pP
10b20 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20  arse->db)==0 || 
10b30 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d  db->aDb[0].pBt==
10b40 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
10b50 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
10b60 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  | sqlite3_malloc
10b70 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  _failed ) return
10b80 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
10b90 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
10ba0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
10bb0 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c  ION, "BEGIN", 0,
10bc0 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   0) ) return;.  
10bd0 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
10be0 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29  SQLITE_InTrans )
10bf0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
10c00 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
10c10 61 6e 6e 6f 74 20 73 74 61 72 74 20 61 20 74 72  annot start a tr
10c20 61 6e 73 61 63 74 69 6f 6e 20 77 69 74 68 69 6e  ansaction within
10c30 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 29   a transaction")
10c40 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
10c50 7d 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  }.  sqlite3Begin
10c60 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
10c70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Parse, 0, 0);.  
10c80 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70  if( !pParse->exp
10c90 6c 61 69 6e 20 29 7b 0a 20 20 20 20 64 62 2d 3e  lain ){.    db->
10ca0 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
10cb0 49 6e 54 72 61 6e 73 3b 0a 20 20 20 20 64 62 2d  InTrans;.    db-
10cc0 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72  >onError = onErr
10cd0 6f 72 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  or;.  }.}../*.**
10ce0 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61   Commit a transa
10cf0 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
10d00 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73  lite3CommitTrans
10d10 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
10d20 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20  arse){.  sqlite 
10d30 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  *db;..  if( pPar
10d40 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61  se==0 || (db=pPa
10d50 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64  rse->db)==0 || d
10d60 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
10d70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
10d80 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
10d90 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
10da0 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
10db0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
10dc0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
10dd0 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
10de0 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  ON, "COMMIT", 0,
10df0 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   0) ) return;.  
10e00 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
10e10 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29   SQLITE_InTrans)
10e20 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
10e30 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
10e40 65 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69  e, "cannot commi
10e50 74 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74 69  t - no transacti
10e60 6f 6e 20 69 73 20 61 63 74 69 76 65 22 29 3b 0a  on is active");.
10e70 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
10e80 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65    if( !pParse->e
10e90 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 64 62  xplain ){.    db
10ea0 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
10eb0 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 7d 0a  TE_InTrans;.  }.
10ec0 20 20 73 71 6c 69 74 65 33 45 6e 64 57 72 69 74    sqlite3EndWrit
10ed0 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
10ee0 65 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73  e);.  if( !pPars
10ef0 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
10f00 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20    db->onError = 
10f10 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20 7d 0a  OE_Default;.  }.
10f20 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
10f30 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  k a transaction.
10f40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
10f50 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69  ollbackTransacti
10f60 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
10f70 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b  ){.  sqlite *db;
10f80 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69  .  Vdbe *v;..  i
10f90 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
10fa0 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
10fb0 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d  =0 || db->aDb[0]
10fc0 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
10fd0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
10fe0 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f  nErr || sqlite3_
10ff0 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
11000 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71  return;.  if( sq
11010 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
11020 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
11030 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c  ANSACTION, "ROLL
11040 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72  BACK", 0, 0) ) r
11050 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 64 62  eturn;.  if( (db
11060 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
11070 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a  _InTrans)==0 ){.
11080 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11090 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
110a0 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 2d 20 6e  not rollback - n
110b0 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  o transaction is
110c0 20 61 63 74 69 76 65 22 29 3b 0a 20 20 20 20 72   active");.    r
110d0 65 74 75 72 6e 3b 20 0a 20 20 7d 0a 20 20 76 20  eturn; .  }.  v 
110e0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
110f0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
11100 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
11110 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11120 52 6f 6c 6c 62 61 63 6b 2c 20 30 2c 20 30 29 3b  Rollback, 0, 0);
11130 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 72  .  }.  if( !pPar
11140 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
11150 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
11160 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b  ~SQLITE_InTrans;
11170 0a 20 20 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72  .    db->onError
11180 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20   = OE_Default;. 
11190 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
111a0 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
111b0 68 61 74 20 77 69 6c 6c 20 76 65 72 69 66 79 20  hat will verify 
111c0 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
111d0 65 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 6e 61 6d  e for all.** nam
111e0 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
111f0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
11200 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
11210 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
11220 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
11230 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
11240 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
11250 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
11260 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
11270 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
11280 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
11290 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
112a0 69 44 62 5d 2e 70 42 74 21 3d 30 20 29 3b 0a 20  iDb].pBt!=0 );. 
112b0 20 69 66 28 20 69 44 62 21 3d 31 20 26 26 20 21   if( iDb!=1 && !
112c0 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
112d0 2c 20 69 44 62 2c 20 44 42 5f 43 6f 6f 6b 69 65  , iDb, DB_Cookie
112e0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
112f0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11300 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69 44  VerifyCookie, iD
11310 62 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  b, db->aDb[iDb].
11320 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 29 3b 0a  schema_cookie);.
11330 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74      DbSetPropert
11340 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 43 6f  y(db, iDb, DB_Co
11350 6f 6b 69 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  okie);.  }.}../*
11360 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
11370 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70  E code that prep
11380 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61  ares for doing a
11390 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
113a0 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
113b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
113c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
113d0 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74  e starts a new t
113e0 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65  ransaction if we
113f0 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79   are not already
11400 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61   within.** a tra
11410 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65  nsaction.  If we
11420 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74   are already wit
11430 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hin a transactio
11440 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70  n, then a checkp
11450 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69  oint.** is set i
11460 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65  f the setStateme
11470 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
11480 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f  true.  A checkpo
11490 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  int should.** be
114a0 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69   set for operati
114b0 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66  ons that might f
114c0 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f  ail (due to a co
114d0 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f  nstraint) part o
114e0 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72  f.** the way thr
114f0 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77  ough and which w
11500 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f  ill need to undo
11510 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74   some writes wit
11520 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a  hout having to.*
11530 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77  * rollback the w
11540 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  hole transaction
11550 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e  .  For operation
11560 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73  s where all cons
11570 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62  traints.** can b
11580 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65  e checked before
11590 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65   any changes are
115a0 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
115b0 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76  abase, it is nev
115c0 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20  er.** necessary 
115d0 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20  to undo a write 
115e0 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69  and the checkpoi
115f0 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  nt should not be
11600 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79   set..**.** Only
11610 20 64 61 74 61 62 61 73 65 20 69 44 62 20 61 6e   database iDb an
11620 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  d the temp datab
11630 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69  ase are made wri
11640 74 61 62 6c 65 20 62 79 20 74 68 69 73 20 63 61  table by this ca
11650 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30  ll..** If iDb==0
11660 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20  , then the main 
11670 61 6e 64 20 74 65 6d 70 20 64 61 74 61 62 61 73  and temp databas
11680 65 73 20 61 72 65 20 6d 61 64 65 20 77 72 69 74  es are made writ
11690 61 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44  able.   If.** iD
116a0 62 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74  b==1 then only t
116b0 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
116c0 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c   is made writabl
116d0 65 2e 20 20 49 66 20 69 44 62 3e 31 20 74 68 65  e.  If iDb>1 the
116e0 6e 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  n the.** specifi
116f0 65 64 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ed auxiliary dat
11700 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 74 65  abase and the te
11710 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20  mp database are 
11720 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a  made writable..*
11730 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
11740 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
11750 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
11760 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e   int setStatemen
11770 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56  t, int iDb){.  V
11780 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
11790 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
117a0 62 3b 0a 20 20 69 66 28 20 44 62 48 61 73 50 72  b;.  if( DbHasPr
117b0 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20  operty(db, iDb, 
117c0 44 42 5f 4c 6f 63 6b 65 64 29 20 29 20 72 65 74  DB_Locked) ) ret
117d0 75 72 6e 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74  urn;.  v = sqlit
117e0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
117f0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
11800 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 64  return;.  if( !d
11810 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 69 6e 54 72  b->aDb[iDb].inTr
11820 61 6e 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ans ){.    sqlit
11830 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11840 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  P_Transaction, i
11850 44 62 2c 20 30 29 3b 0a 20 20 20 20 44 62 53 65  Db, 0);.    DbSe
11860 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44  tProperty(db, iD
11870 62 2c 20 44 42 5f 4c 6f 63 6b 65 64 29 3b 0a 20  b, DB_Locked);. 
11880 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
11890 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
118a0 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28  e, iDb);.    if(
118b0 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20   iDb!=1 ){.     
118c0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
118d0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
118e0 73 65 2c 20 73 65 74 53 74 61 74 65 6d 65 6e 74  se, setStatement
118f0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 1);.    }.  }e
11900 6c 73 65 20 69 66 28 20 73 65 74 53 74 61 74 65  lse if( setState
11910 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ment ){.    sqli
11920 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11930 4f 50 5f 53 74 61 74 65 6d 65 6e 74 2c 20 69 44  OP_Statement, iD
11940 62 2c 20 30 29 3b 0a 20 20 20 20 44 62 53 65 74  b, 0);.    DbSet
11950 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62  Property(db, iDb
11960 2c 20 44 42 5f 4c 6f 63 6b 65 64 29 3b 0a 20 20  , DB_Locked);.  
11970 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
11980 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 6f  ate code that co
11990 6e 63 6c 75 64 65 73 20 61 6e 20 6f 70 65 72 61  ncludes an opera
119a0 74 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 68 61  tion that may ha
119b0 76 65 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 68  ve changed.** th
119c0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20  e database.  If 
119d0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
119e0 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72  saction was star
119f0 74 65 64 2c 20 74 68 65 6e 20 65 6d 69 74 0a 2a  ted, then emit.*
11a00 2a 20 61 6e 20 4f 50 5f 43 6f 6d 6d 69 74 20 74  * an OP_Commit t
11a10 68 61 74 20 77 69 6c 6c 20 63 61 75 73 65 20 74  hat will cause t
11a20 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 62 65  he changes to be
11a30 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69   committed to di
11a40 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  sk..**.** Note t
11a50 68 61 74 20 63 68 65 63 6b 70 6f 69 6e 74 73 20  hat checkpoints 
11a60 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
11a70 79 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 20 74  y committed at t
11a80 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 61 20 73  he end of.** a s
11a90 74 61 74 65 6d 65 6e 74 2e 20 20 4e 6f 74 65 20  tatement.  Note 
11aa0 61 6c 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  also that there 
11ab0 63 61 6e 20 62 65 20 6d 75 6c 74 69 70 6c 65 20  can be multiple 
11ac0 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c  calls to .** sql
11ad0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
11ae0 65 72 61 74 69 6f 6e 28 29 20 62 75 74 20 74 68  eration() but th
11af0 65 72 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ere should only 
11b00 62 65 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 63  be a single.** c
11b10 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 45 6e  all to sqlite3En
11b20 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
11b30 29 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  ) at the conclus
11b40 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65  ion of the state
11b50 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
11b60 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65  lite3EndWriteOpe
11b70 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  ration(Parse *pP
11b80 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
11b90 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
11ba0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
11bb0 66 28 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53  f( pParse->trigS
11bc0 74 61 63 6b 20 29 20 72 65 74 75 72 6e 3b 20 2f  tack ) return; /
11bd0 2a 20 69 66 20 74 68 69 73 20 69 73 20 69 6e 20  * if this is in 
11be0 61 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 76  a trigger */.  v
11bf0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
11c00 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
11c10 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
11c20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
11c30 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  & SQLITE_InTrans
11c40 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 42 45 47   ){.    /* A BEG
11c50 49 4e 20 68 61 73 20 65 78 65 63 75 74 65 64 2e  IN has executed.
11c60 20 20 44 6f 20 6e 6f 74 20 63 6f 6d 6d 69 74 20    Do not commit 
11c70 75 6e 74 69 6c 20 77 65 20 73 65 65 20 61 6e 20  until we see an 
11c80 65 78 70 6c 69 63 69 74 0a 20 20 20 20 2a 2a 20  explicit.    ** 
11c90 43 4f 4d 4d 49 54 20 73 74 61 74 65 6d 65 6e 74  COMMIT statement
11ca0 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  . */.  }else{.  
11cb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11cc0 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c  Op(v, OP_Commit,
11cd0 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a         0, 0);.  }.}.