/ Hex Artifact Content
Login

Artifact ebb6746232d4ff01555a103e69bf8740b13ca5b4:


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 35 20 32 30 30 34 2f 30 35 2f 32 38 20 31  195 2004/05/28 1
0300: 32 3a 31 31 3a 32 31 20 64 61 6e 69 65 6c 6b 31  2:11:21 danielk1
0310: 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e  977 Exp $.*/.#in
0320: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74  clude "sqliteInt
0330: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74  .h".#include <ct
0340: 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68  ype.h>../*.** Th
0350: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
0360: 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20  lled when a new 
0370: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73  SQL statement is
0380: 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a   beginning to.**
0390: 20 62 65 20 70 61 72 73 65 64 2e 20 20 43 68 65   be parsed.  Che
03a0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
03b0: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20   schema for the 
03c0: 64 61 74 61 62 61 73 65 20 6e 65 65 64 73 0a 2a  database needs.*
03d0: 2a 20 74 6f 20 62 65 20 72 65 61 64 20 66 72 6f  * to be read fro
03e0: 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  m the SQLITE_MAS
03f0: 54 45 52 20 61 6e 64 20 53 51 4c 49 54 45 5f 54  TER and SQLITE_T
0400: 45 4d 50 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  EMP_MASTER table
0410: 73 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73  s..** If it does
0420: 2c 20 74 68 65 6e 20 72 65 61 64 20 69 74 2e 0a  , then read it..
0430: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
0440: 65 67 69 6e 50 61 72 73 65 28 50 61 72 73 65 20  eginParse(Parse 
0450: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 78 70  *pParse, int exp
0460: 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 73 71 6c  lainFlag){.  sql
0470: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
0480: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
0490: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
04a0: 20 3d 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a   = explainFlag;.
04b0: 20 20 69 66 28 28 64 62 2d 3e 66 6c 61 67 73 20    if((db->flags 
04c0: 26 20 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c  & SQLITE_Initial
04d0: 69 7a 65 64 29 3d 3d 30 20 26 26 20 64 62 2d 3e  ized)==0 && db->
04e0: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
04f0: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
0500: 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26 70 50  ite3Init(db, &pP
0510: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  arse->zErrMsg);.
0520: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
0530: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
0540: 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a  Parse->rc = rc;.
0550: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
0560: 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rr++;.    }.  }.
0570: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
0580: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
0590: 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
05a0: 64 62 2c 20 69 2c 20 44 42 5f 4c 6f 63 6b 65 64  db, i, DB_Locked
05b0: 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  );.    if( !db->
05c0: 61 44 62 5b 69 5d 2e 69 6e 54 72 61 6e 73 20 29  aDb[i].inTrans )
05d0: 7b 0a 20 20 20 20 20 20 44 62 43 6c 65 61 72 50  {.      DbClearP
05e0: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44  roperty(db, i, D
05f0: 42 5f 43 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 7d  B_Cookie);.    }
0600: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
0610: 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Var = 0;.}../*.*
0620: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
0630: 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61  s called after a
0640: 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61 74   single SQL stat
0650: 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a  ement has been.*
0660: 2a 20 70 61 72 73 65 64 20 61 6e 64 20 77 65 20  * parsed and we 
0670: 77 61 6e 74 20 74 6f 20 65 78 65 63 75 74 65 20  want to execute 
0680: 74 68 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f  the VDBE code to
0690: 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 74   implement .** t
06a0: 68 61 74 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  hat statement.  
06b0: 50 72 69 6f 72 20 61 63 74 69 6f 6e 20 72 6f 75  Prior action rou
06c0: 74 69 6e 65 73 20 73 68 6f 75 6c 64 20 68 61 76  tines should hav
06d0: 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 63 6f 6e  e already.** con
06e0: 73 74 72 75 63 74 65 64 20 56 44 42 45 20 63 6f  structed VDBE co
06f0: 64 65 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  de to do the wor
0700: 6b 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61  k of the SQL sta
0710: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20  tement..** This 
0720: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61 73  routine just has
0730: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
0740: 56 44 42 45 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  VDBE code..**.**
0750: 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61 6e   Note that if an
0760: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
0770: 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68 65   it might be the
0780: 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f   case that.** no
0790: 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20 67   VDBE code was g
07a0: 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  enerated..*/.voi
07b0: 64 20 73 71 6c 69 74 65 33 45 78 65 63 28 50 61  d sqlite3Exec(Pa
07c0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
07d0: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
07e0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
07f0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
0800: 62 65 3b 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20  be;..  if( v==0 
0810: 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47  && (v = sqlite3G
0820: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21  etVdbe(pParse))!
0830: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
0840: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
0850: 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20  _Halt, 0, 0);.  
0860: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  }.  if( sqlite3_
0870: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
0880: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 76 20  return;.  if( v 
0890: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
08a0: 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a  =0 ){.    FILE *
08b0: 74 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61  trace = (db->fla
08c0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
08d0: 54 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f  Trace)!=0 ? stdo
08e0: 75 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69  ut : 0;.    sqli
08f0: 74 65 33 56 64 62 65 54 72 61 63 65 28 76 2c 20  te3VdbeTrace(v, 
0900: 74 72 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69  trace);.    sqli
0910: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
0920: 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  (v, pParse->nVar
0930: 2c 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  , pParse->explai
0940: 6e 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  n);.    pParse->
0950: 72 63 20 3d 20 70 50 61 72 73 65 2d 3e 6e 45 72  rc = pParse->nEr
0960: 72 20 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  r ? SQLITE_ERROR
0970: 20 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   : SQLITE_DONE;.
0980: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e      pParse->colN
0990: 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d  amesSet = 0;.  }
09a0: 65 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d  else if( pParse-
09b0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
09c0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  {.    pParse->rc
09d0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
09e0: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
09f0: 54 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Tab = 0;.  pPars
0a00: 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70  e->nMem = 0;.  p
0a10: 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b  Parse->nSet = 0;
0a20: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20  .  pParse->nAgg 
0a30: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
0a40: 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Var = 0;.}../*.*
0a50: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
0a60: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
0a70: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
0a80: 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72  .** a particular
0a90: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
0aa0: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 0a 2a  given the name.*
0ab0: 2a 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20  * of that table 
0ac0: 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
0ad0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
0ae0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
0af0: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
0b00: 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
0b10: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
0b20: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
0b30: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
0b40: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
0b50: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
0b60: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
0b70: 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20   matching table 
0b80: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
0b90: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
0ba0: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
0bb0: 65 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  e names is done.
0bc0: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
0bd0: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
0be0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
0bf0: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
0c00: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
0c10: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
0c20: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
0c30: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
0c40: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
0c50: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
0c60: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
0c70: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e  (sqlite *db, con
0c80: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
0c90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
0ca0: 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20  abase){.  Table 
0cb0: 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  *p = 0;.  int i;
0cc0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
0cd0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
0ce0: 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f   int j = (i<2) ?
0cf0: 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53   i^1 : i;   /* S
0d00: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
0d10: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66  e MAIN */.    if
0d20: 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26  ( zDatabase!=0 &
0d30: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
0d40: 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e  (zDatabase, db->
0d50: 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20  aDb[j].zName) ) 
0d60: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20  continue;.    p 
0d70: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
0d80: 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62  d(&db->aDb[j].tb
0d90: 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74  lHash, zName, st
0da0: 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a  rlen(zName)+1);.
0db0: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
0dc0: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
0dd0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
0de0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
0df0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
0e00: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
0e10: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
0e20: 61 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ase table given 
0e30: 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74  the name.** of t
0e40: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f  hat table and (o
0e50: 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e  ptionally) the n
0e60: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
0e70: 61 73 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e  ase.** containin
0e80: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  g the table.  Re
0e90: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
0ea0: 20 66 6f 75 6e 64 2e 0a 2a 2a 20 41 6c 73 6f 20   found..** Also 
0eb0: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
0ec0: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
0ed0: 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
0ee0: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
0ef0: 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
0f00: 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33  tine and sqlite3
0f10: 46 69 6e 64 54 61 62 6c 65 28 29 0a 2a 2a 20 69  FindTable().** i
0f20: 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  s that this rout
0f30: 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72  ine leaves an er
0f40: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
0f50: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 0a 2a  Parse->zErrMsg.*
0f60: 2a 20 77 68 65 72 65 20 73 71 6c 69 74 65 33 46  * where sqlite3F
0f70: 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20  indTable() does 
0f80: 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  not..*/.Table *s
0f90: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
0fa0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
0fb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
0fc0: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
0fd0: 7a 44 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  zDbase){.  Table
0fe0: 20 2a 70 3b 0a 0a 20 20 70 20 3d 20 73 71 6c 69   *p;..  p = sqli
0ff0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61  te3FindTable(pPa
1000: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  rse->db, zName, 
1010: 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  zDbase);.  if( p
1020: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  ==0 ){.    if( z
1030: 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73  Dbase ){.      s
1040: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1050: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
1060: 74 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20 7a  table: %s.%s", z
1070: 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  Dbase, zName);. 
1080: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
1090: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50  ite3FindTable(pP
10a0: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  arse->db, zName,
10b0: 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)!=0 ){.      
10c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
10d0: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 5c  pParse, "table \
10e0: 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 69 6e 20  "%s\" is not in 
10f0: 64 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22 22  database \"%s\""
1100: 2c 0a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  ,.         zName
1110: 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 20 20 7d  , zDbase);.    }
1120: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
1130: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1140: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  se, "no such tab
1150: 6c 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  le: %s", zName);
1160: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1170: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
1180: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
1190: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
11a0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a  hat describes .*
11b0: 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  * a particular i
11c0: 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e  ndex given the n
11d0: 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65  ame of that inde
11e0: 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d  x.** and the nam
11f0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1200: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
1210: 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65  the index..** Re
1220: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
1230: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
1240: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
1250: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
1260: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
1270: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64  the.** table and
1280: 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
1290: 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65 74  ing index is ret
12a0: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
12b0: 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c  king.** for dupl
12c0: 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65  icate index name
12d0: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
12e0: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
12f0: 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20  .** TEMP first, 
1300: 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20  then MAIN, then 
1310: 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61  any auxiliary da
1320: 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a  tabases added.**
1330: 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43   using the ATTAC
1340: 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e  H command..*/.In
1350: 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  dex *sqlite3Find
1360: 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62  Index(sqlite *db
1370: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
1380: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
1390: 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a  *zDb){.  Index *
13a0: 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  p = 0;.  int i;.
13b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
13c0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
13d0: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
13e0: 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61  i^1 : i;  /* Sea
13f0: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
1400: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  MAIN */.    if( 
1410: 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33 53 74  zDb && sqlite3St
1420: 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61  rICmp(zDb, db->a
1430: 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63  Db[j].zName) ) c
1440: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d  ontinue;.    p =
1450: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
1460: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 69 64 78  (&db->aDb[j].idx
1470: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  Hash, zName, str
1480: 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20  len(zName)+1);. 
1490: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
14a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
14b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
14c0: 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65  e the given inde
14d0: 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  x from the index
14e0: 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64   hash table, and
14f0: 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d   free.** its mem
1500: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a  ory structures..
1510: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  **.** The index 
1520: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
1530: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
1540: 68 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20  h tables but.** 
1550: 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b  it is not unlink
1560: 65 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c  ed from the Tabl
1570: 65 20 74 68 61 74 20 69 74 20 69 6e 64 65 78 65  e that it indexe
1580: 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20  s..** Unlinking 
1590: 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d  from the Table m
15a0: 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74  ust be done by t
15b0: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
15c0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
15d0: 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65  oid sqliteDelete
15e0: 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62  Index(sqlite *db
15f0: 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49  , Index *p){.  I
1600: 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 0a 20 20 61  ndex *pOld;..  a
1610: 73 73 65 72 74 28 20 64 62 21 3d 30 20 26 26 20  ssert( db!=0 && 
1620: 70 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20  p->zName!=0 );. 
1630: 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48   pOld = sqlite3H
1640: 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61  ashInsert(&db->a
1650: 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61  Db[p->iDb].idxHa
1660: 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  sh, p->zName,.  
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e 28 70          strlen(p
1690: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a  ->zName)+1, 0);.
16a0: 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 26 26    if( pOld!=0 &&
16b0: 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20   pOld!=p ){.    
16c0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
16d0: 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44  t(&db->aDb[p->iD
16e0: 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 4f 6c 64  b].idxHash, pOld
16f0: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
1710: 72 6c 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65  rlen(pOld->zName
1720: 29 2b 31 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d 0a  )+1, pOld);.  }.
1730: 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6c 41 66 66    if( p->zColAff
1740: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
1750: 65 65 28 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  ee(p->zColAff);.
1760: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
1770: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  (p);.}../*.** Un
1780: 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 69  link the given i
1790: 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 74 61  ndex from its ta
17a0: 62 6c 65 2c 20 74 68 65 6e 20 72 65 6d 6f 76 65  ble, then remove
17b0: 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 66 72  .** the index fr
17c0: 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  om the index has
17d0: 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65  h table and free
17e0: 20 69 74 73 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73   its memory.** s
17f0: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
1800: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
1810: 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73  AndDeleteIndex(s
1820: 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65 78  qlite *db, Index
1830: 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 66 28   *pIndex){.  if(
1840: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
1850: 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20  >pIndex==pIndex 
1860: 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  ){.    pIndex->p
1870: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20  Table->pIndex = 
1880: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
1890: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65   }else{.    Inde
18a0: 78 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  x *p;.    for(p=
18b0: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
18c0: 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70 2d 3e  pIndex; p && p->
18d0: 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b 20 70  pNext!=pIndex; p
18e0: 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20  =p->pNext){}.   
18f0: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 4e 65   if( p && p->pNe
1900: 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20  xt==pIndex ){.  
1910: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
1920: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
1930: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1940: 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20  DeleteIndex(db, 
1950: 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pIndex);.}../*.*
1960: 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65  * Erase all sche
1970: 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ma information f
1980: 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  rom the in-memor
1990: 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66  y hash tables of
19a0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
19b0: 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 72  nection.  This r
19c0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
19d0: 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f   to reclaim memo
19e0: 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65  ry.** before the
19f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c 6f 73   connection clos
1a00: 65 73 2e 20 20 49 74 20 69 73 20 61 6c 73 6f 20  es.  It is also 
1a10: 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 61 20  called during a 
1a20: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 74  rollback.** if t
1a30: 68 65 72 65 20 77 65 72 65 20 73 63 68 65 6d 61  here were schema
1a40: 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20   changes during 
1a50: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
1a60: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 3d 30  .**.** If iDb<=0
1a70: 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20   then reset the 
1a80: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
1a90: 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64  tables for all d
1aa0: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73  atabase.** files
1ab0: 2e 20 20 49 66 20 69 44 62 3e 3d 32 20 74 68 65  .  If iDb>=2 the
1ac0: 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65  n reset the inte
1ad0: 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72 20  rnal schema for 
1ae0: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67  only the.** sing
1af0: 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74 65  le file indicate
1b00: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1b10: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
1b20: 63 68 65 6d 61 28 73 71 6c 69 74 65 20 2a 64 62  chema(sqlite *db
1b30: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 48 61  , int iDb){.  Ha
1b40: 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20  shElem *pElem;. 
1b50: 20 48 61 73 68 20 74 65 6d 70 31 3b 0a 20 20 48   Hash temp1;.  H
1b60: 61 73 68 20 74 65 6d 70 32 3b 0a 20 20 69 6e 74  ash temp2;.  int
1b70: 20 69 2c 20 6a 3b 0a 0a 20 20 61 73 73 65 72 74   i, j;..  assert
1b80: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
1b90: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 64 62 2d  db->nDb );.  db-
1ba0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
1bb0: 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 3b 0a 20  E_Initialized;. 
1bc0: 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c 64 62   for(i=iDb; i<db
1bd0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
1be0: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
1bf0: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 74 65 6d 70  aDb[i];.    temp
1c00: 31 20 3d 20 70 44 62 2d 3e 74 62 6c 48 61 73 68  1 = pDb->tblHash
1c10: 3b 0a 20 20 20 20 74 65 6d 70 32 20 3d 20 70 44  ;.    temp2 = pD
1c20: 62 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20 20 20  b->trigHash;.   
1c30: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
1c40: 28 26 70 44 62 2d 3e 74 72 69 67 48 61 73 68 2c  (&pDb->trigHash,
1c50: 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52   SQLITE_HASH_STR
1c60: 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ING, 0);.    sql
1c70: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 70  ite3HashClear(&p
1c80: 44 62 2d 3e 61 46 4b 65 79 29 3b 0a 20 20 20 20  Db->aFKey);.    
1c90: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
1ca0: 28 26 70 44 62 2d 3e 69 64 78 48 61 73 68 29 3b  (&pDb->idxHash);
1cb0: 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  .    for(pElem=s
1cc0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
1cd0: 74 65 6d 70 32 29 3b 20 70 45 6c 65 6d 3b 20 70  temp2); pElem; p
1ce0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
1cf0: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
1d00: 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69     Trigger *pTri
1d10: 67 67 65 72 20 3d 20 73 71 6c 69 74 65 48 61 73  gger = sqliteHas
1d20: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
1d30: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
1d40: 65 54 72 69 67 67 65 72 28 70 54 72 69 67 67 65  eTrigger(pTrigge
1d50: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
1d60: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
1d70: 74 65 6d 70 32 29 3b 0a 20 20 20 20 73 71 6c 69  temp2);.    sqli
1d80: 74 65 33 48 61 73 68 49 6e 69 74 28 26 70 44 62  te3HashInit(&pDb
1d90: 2d 3e 74 62 6c 48 61 73 68 2c 20 53 51 4c 49 54  ->tblHash, SQLIT
1da0: 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30  E_HASH_STRING, 0
1db0: 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d  );.    for(pElem
1dc0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
1dd0: 28 26 74 65 6d 70 31 29 3b 20 70 45 6c 65 6d 3b  (&temp1); pElem;
1de0: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
1df0: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
1e00: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
1e10: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
1e20: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20  a(pElem);.      
1e30: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
1e40: 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
1e50: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 48    }.    sqlite3H
1e60: 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70 31 29  ashClear(&temp1)
1e70: 3b 0a 20 20 20 20 44 62 43 6c 65 61 72 50 72 6f  ;.    DbClearPro
1e80: 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f  perty(db, i, DB_
1e90: 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3b 0a 20  SchemaLoaded);. 
1ea0: 20 20 20 69 66 28 20 69 44 62 3e 30 20 29 20 72     if( iDb>0 ) r
1eb0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
1ec0: 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a 20  ert( iDb==0 );. 
1ed0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
1ee0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
1ef0: 67 65 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  ges;..  /* If on
1f00: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
1f10: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
1f20: 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62 65  ase files has be
1f30: 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20  en closed,.  ** 
1f40: 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 6e  then remove then
1f50: 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c 69   from the auxili
1f60: 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69 73  ary database lis
1f70: 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65 0a  t.  We take the.
1f80: 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79    ** opportunity
1f90: 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72 65   to do this here
1fa0: 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6a   since we have j
1fb0: 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c 20  ust deleted all 
1fc0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68 65  of the.  ** sche
1fd0: 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20 61  ma hash tables a
1fe0: 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f 20  nd therefore do 
1ff0: 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b 65  not have to make
2000: 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20 2a   any changes.  *
2010: 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73  * to any of thos
2020: 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
2030: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
2040: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nDb; i++){.    s
2050: 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20  truct Db *pDb = 
2060: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
2070: 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30   if( pDb->pBt==0
2080: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
2090: 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62 2d 3e  b->pAux && pDb->
20a0: 78 46 72 65 65 41 75 78 20 29 20 70 44 62 2d 3e  xFreeAux ) pDb->
20b0: 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e 70 41  xFreeAux(pDb->pA
20c0: 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  ux);.      pDb->
20d0: 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pAux = 0;.    }.
20e0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b    }.  for(i=j=2;
20f0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
2100: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
2110: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
2120: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  i];.    if( pDb-
2130: 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >pBt==0 ){.     
2140: 20 73 71 6c 69 74 65 46 72 65 65 28 70 44 62 2d   sqliteFree(pDb-
2150: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  >zName);.      p
2160: 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  Db->zName = 0;. 
2170: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2180: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69     }.    if( j<i
2190: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44   ){.      db->aD
21a0: 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69  b[j] = db->aDb[i
21b0: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b  ];.    }.    j++
21c0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
21d0: 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28  db->aDb[j], 0, (
21e0: 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f  db->nDb-j)*sizeo
21f0: 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a  f(db->aDb[j]));.
2200: 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20    db->nDb = j;. 
2210: 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20   if( db->nDb<=2 
2220: 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e  && db->aDb!=db->
2230: 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20  aDbStatic ){.   
2240: 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53   memcpy(db->aDbS
2250: 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20  tatic, db->aDb, 
2260: 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62  2*sizeof(db->aDb
2270: 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  [0]));.    sqlit
2280: 65 46 72 65 65 28 64 62 2d 3e 61 44 62 29 3b 0a  eFree(db->aDb);.
2290: 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62      db->aDb = db
22a0: 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20 7d  ->aDbStatic;.  }
22b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
22c0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
22d0: 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
22e0: 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 20 49 66  back occurs.  If
22f0: 20 74 68 65 72 65 20 77 65 72 65 0a 2a 2a 20 73   there were.** s
2300: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75  chema changes du
2310: 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63  ring the transac
2320: 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20 68 61  tion, then we ha
2330: 76 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 0a  ve to reset the.
2340: 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  ** internal hash
2350: 20 74 61 62 6c 65 73 20 61 6e 64 20 72 65 6c 6f   tables and relo
2360: 61 64 20 74 68 65 6d 20 66 72 6f 6d 20 64 69 73  ad them from dis
2370: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  k..*/.void sqlit
2380: 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e  e3RollbackIntern
2390: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
23a0: 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d   *db){.  if( db-
23b0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
23c0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b  InternChanges ){
23d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65  .    sqlite3Rese
23e0: 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
23f0: 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  db, 0);.  }.}../
2400: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2410: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
2420: 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73   a commit occurs
2430: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2440: 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  3CommitInternalC
2450: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20 2a 64  hanges(sqlite *d
2460: 62 29 7b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d  b){.  db->aDb[0]
2470: 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d  .schema_cookie =
2480: 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65   db->next_cookie
2490: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
24a0: 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43   ~SQLITE_InternC
24b0: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
24c0: 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f   Remove the memo
24d0: 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ry data structur
24e0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
24f0: 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  th the given.** 
2500: 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67  Table.  No chang
2510: 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64  es are made to d
2520: 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74  isk by this rout
2530: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ine..**.** This 
2540: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c  routine just del
2550: 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74  etes the data st
2560: 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65  ructure.  It doe
2570: 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20  s not unlink.** 
2580: 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73  the table data s
2590: 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
25a0: 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 4e  e hash table.  N
25b0: 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d 6f 76  or does it remov
25c0: 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79  e.** foreign key
25d0: 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74  s from the sqlit
25e0: 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62  e.aFKey hash tab
25f0: 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73  le.  But it does
2600: 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f   destroy.** memo
2610: 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66  ry structures of
2620: 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64   the indices and
2630: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73   foreign keys as
2640: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a  sociated with .*
2650: 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  * the table..**.
2660: 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73 6f 63  ** Indices assoc
2670: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
2680: 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e 6b 65  able are unlinke
2690: 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62 22 0a  d from the "db".
26a0: 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ** data structur
26b0: 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e 20 20  e if db!=NULL.  
26c0: 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64  If db==NULL, ind
26d0: 69 63 65 73 20 61 74 74 61 63 68 65 64 20 74 6f  ices attached to
26e0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 61 72  .** the table ar
26f0: 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74 20 69  e deleted, but i
2700: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 65  t is assumed the
2710: 79 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  y have already b
2720: 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e  een.** unlinked.
2730: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2740: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
2750: 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  te *db, Table *p
2760: 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Table){.  int i;
2770: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
2780: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79  , *pNext;.  FKey
2790: 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46   *pFKey, *pNextF
27a0: 4b 65 79 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  Key;..  if( pTab
27b0: 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  le==0 ) return;.
27c0: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c  .  /* Delete all
27d0: 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
27e0: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61  ted with this ta
27f0: 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  ble.  */.  for(p
2800: 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e  Index = pTable->
2810: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
2820: 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20  pIndex=pNext){. 
2830: 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65     pNext = pInde
2840: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73  x->pNext;.    as
2850: 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 69 44  sert( pIndex->iD
2860: 62 3d 3d 70 54 61 62 6c 65 2d 3e 69 44 62 20 7c  b==pTable->iDb |
2870: 7c 20 28 70 54 61 62 6c 65 2d 3e 69 44 62 3d 3d  | (pTable->iDb==
2880: 30 20 26 26 20 70 49 6e 64 65 78 2d 3e 69 44 62  0 && pIndex->iDb
2890: 3d 3d 31 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ==1) );.    sqli
28a0: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62  teDeleteIndex(db
28b0: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a  , pIndex);.  }..
28c0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
28d0: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73  foreign keys ass
28e0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
28f0: 73 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6b 65  s table.  The ke
2900: 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  ys.  ** should h
2910: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
2920: 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74   unlinked from t
2930: 68 65 20 64 62 2d 3e 61 46 4b 65 79 20 68 61 73  he db->aFKey has
2940: 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a 20 20  h table .  */.  
2950: 66 6f 72 28 70 46 4b 65 79 3d 70 54 61 62 6c 65  for(pFKey=pTable
2960: 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20  ->pFKey; pFKey; 
2970: 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79 29  pFKey=pNextFKey)
2980: 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b 65 79 20  {.    pNextFKey 
2990: 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72  = pFKey->pNextFr
29a0: 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  om;.    assert( 
29b0: 70 54 61 62 6c 65 2d 3e 69 44 62 3c 64 62 2d 3e  pTable->iDb<db->
29c0: 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nDb );.    asser
29d0: 74 28 20 73 71 6c 69 74 65 33 48 61 73 68 46 69  t( sqlite3HashFi
29e0: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70 54 61 62  nd(&db->aDb[pTab
29f0: 6c 65 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 0a  le->iDb].aFKey,.
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79             pFKey
2a20: 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46  ->zTo, strlen(pF
2a30: 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46  Key->zTo)+1)!=pF
2a40: 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  Key );.    sqlit
2a50: 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20  eFree(pFKey);.  
2a60: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  }..  /* Delete t
2a70: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
2a80: 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a  re itself..  */.
2a90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
2aa0: 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  ble->nCol; i++){
2ab0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2ac0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e  pTable->aCol[i].
2ad0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
2ae0: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
2af0: 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20  Col[i].zDflt);. 
2b00: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54     sqliteFree(pT
2b10: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54  able->aCol[i].zT
2b20: 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ype);.  }.  sqli
2b30: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a  teFree(pTable->z
2b40: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  Name);.  sqliteF
2b50: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
2b60: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  );.  if( pTable-
2b70: 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a 20 20 20 20  >zColAff ){.    
2b80: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
2b90: 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 7d  e->zColAff);.  }
2ba0: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
2bb0: 44 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70  Delete(pTable->p
2bc0: 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74  Select);.  sqlit
2bd0: 65 46 72 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d  eFree(pTable);.}
2be0: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74  ../*.** Unlink t
2bf0: 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66  he given table f
2c00: 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62  rom the hash tab
2c10: 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65  les and the dele
2c20: 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  te the.** table 
2c30: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20 61  structure with a
2c40: 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20 61  ll its indices a
2c50: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e  nd foreign keys.
2c60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2c70: 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44  sqliteUnlinkAndD
2c80: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
2c90: 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29  e *db, Table *p)
2ca0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b  {.  Table *pOld;
2cb0: 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70  .  FKey *pF1, *p
2cc0: 46 32 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d  F2;.  int i = p-
2cd0: 3e 69 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20  >iDb;.  assert( 
2ce0: 64 62 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20  db!=0 );.  pOld 
2cf0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
2d00: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e  ert(&db->aDb[i].
2d10: 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  tblHash, p->zNam
2d20: 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61  e, strlen(p->zNa
2d30: 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73  me)+1, 0);.  ass
2d40: 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20  ert( pOld==0 || 
2d50: 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 6f 72  pOld==p );.  for
2d60: 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70  (pF1=p->pFKey; p
2d70: 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65  F1; pF1=pF1->pNe
2d80: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 69 6e 74  xtFrom){.    int
2d90: 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46   nTo = strlen(pF
2da0: 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20  1->zTo) + 1;.   
2db0: 20 70 46 32 20 3d 20 73 71 6c 69 74 65 33 48 61   pF2 = sqlite3Ha
2dc0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b  shFind(&db->aDb[
2dd0: 69 5d 2e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a  i].aFKey, pF1->z
2de0: 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 69 66  To, nTo);.    if
2df0: 28 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20  ( pF2==pF1 ){.  
2e00: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
2e10: 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69  nsert(&db->aDb[i
2e20: 5d 2e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54  ].aFKey, pF1->zT
2e30: 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65  o, nTo, pF1->pNe
2e40: 78 74 54 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  xtTo);.    }else
2e50: 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  {.      while( p
2e60: 46 32 20 26 26 20 70 46 32 2d 3e 70 4e 65 78 74  F2 && pF2->pNext
2e70: 54 6f 21 3d 70 46 31 20 29 7b 20 70 46 32 3d 70  To!=pF1 ){ pF2=p
2e80: 46 32 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20  F2->pNextTo; }. 
2e90: 20 20 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a       if( pF2 ){.
2ea0: 20 20 20 20 20 20 20 20 70 46 32 2d 3e 70 4e 65          pF2->pNe
2eb0: 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e 65 78  xtTo = pF1->pNex
2ec0: 74 54 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  tTo;.      }.   
2ed0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
2ee0: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
2ef0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  p);.}../*.** Con
2f00: 73 74 72 75 63 74 20 74 68 65 20 6e 61 6d 65 20  struct the name 
2f10: 6f 66 20 61 20 75 73 65 72 20 74 61 62 6c 65 20  of a user table 
2f20: 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d 20 61 20  or index from a 
2f30: 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  token..**.** Spa
2f40: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  ce to hold the n
2f50: 61 6d 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ame is obtained 
2f60: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
2f70: 63 28 29 20 61 6e 64 20 6d 75 73 74 0a 2a 2a 20  c() and must.** 
2f80: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
2f90: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2fa0: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
2fb0: 65 33 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  e3TableNameFromT
2fc0: 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d  oken(Token *pNam
2fd0: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
2fe0: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  e = sqliteStrNDu
2ff0: 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  p(pName->z, pNam
3000: 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33  e->n);.  sqlite3
3010: 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a  Dequote(zName);.
3020: 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a    return zName;.
3030: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
3040: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
3050: 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20  table stored in 
3060: 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  database number 
3070: 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69  iDb for.** writi
3080: 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73  ng. The table is
3090: 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75   opened using cu
30a0: 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20  rsor 0..*/.void 
30b0: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
30c0: 72 54 61 62 6c 65 28 56 64 62 65 20 2a 76 2c 20  rTable(Vdbe *v, 
30d0: 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69  int iDb){.  sqli
30e0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
30f0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62 2c  OP_Integer, iDb,
3100: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
3110: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
3120: 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54  enWrite, 0, MAST
3130: 45 52 5f 52 4f 4f 54 29 3b 0a 20 20 73 71 6c 69  ER_ROOT);.  sqli
3140: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3150: 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
3160: 2c 20 30 2c 20 35 29 3b 20 2f 2a 20 73 71 6c 69  , 0, 5); /* sqli
3170: 74 65 5f 6d 61 73 74 65 72 20 68 61 73 20 35 20  te_master has 5 
3180: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f 2a  columns */.}../*
3190: 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70  .** The token *p
31a0: 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Name contains th
31b0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61  e name of a data
31c0: 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d 61  base (either "ma
31d0: 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22  in" or.** "temp"
31e0: 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   or the name of 
31f0: 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e  an attached db).
3200: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
3210: 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64  turns the.** ind
3220: 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  ex of the named 
3230: 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e  database in db->
3240: 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20  aDb[], or -1 if 
3250: 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a  the named db .**
3260: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
3270: 0a 2a 2f 0a 69 6e 74 20 66 69 6e 64 44 62 28 73  .*/.int findDb(s
3280: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65  qlite3 *db, Toke
3290: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  n *pName){.  int
32a0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
32b0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
32c0: 20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 6e      if( pName->n
32d0: 3d 3d 73 74 72 6c 65 6e 28 64 62 2d 3e 61 44 62  ==strlen(db->aDb
32e0: 5b 69 5d 2e 7a 4e 61 6d 65 29 20 26 26 20 0a 20  [i].zName) && . 
32f0: 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65         0==sqlite
3300: 33 53 74 72 4e 49 43 6d 70 28 64 62 2d 3e 61 44  3StrNICmp(db->aD
3310: 62 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d  b[i].zName, pNam
3320: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 20  e->z, pName->n) 
3330: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
3340: 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  i;.    }.  }.  r
3350: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 73 74 61  eturn -1;.}..sta
3360: 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 53  tic int resolveS
3370: 63 68 65 6d 61 4e 61 6d 65 28 0a 20 20 50 61 72  chemaName(.  Par
3380: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 54  se *pParse, .  T
3390: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 0a 20  oken *pName1, . 
33a0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
33b0: 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75  .  Token **pUnqu
33c0: 61 6c 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b  al.){.  int iDb;
33d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
33e0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
33f0: 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e  if( pName2 && pN
3400: 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20  ame2->n>0 ){.   
3410: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
3420: 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 2a  it.busy );.    *
3430: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32  pUnqual = pName2
3440: 3b 0a 20 20 20 20 69 44 62 20 3d 20 66 69 6e 64  ;.    iDb = find
3450: 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a  Db(db, pName1);.
3460: 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b      if( iDb<0 ){
3470: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
3480: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3490: 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65  unknown database
34a0: 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20   %T", pName1);. 
34b0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
34c0: 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r++;.      retur
34d0: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n -1;.    }.  }e
34e0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
34f0: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30   db->init.iDb==0
3500: 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   || db->init.bus
3510: 79 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64  y );.    iDb = d
3520: 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20  b->init.iDb;.   
3530: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
3540: 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e1;.  }.  return
3550: 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42   iDb;.}../*.** B
3560: 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e  egin constructin
3570: 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65  g a new table re
3580: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20  presentation in 
3590: 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73  memory.  This is
35a0: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66  .** the first of
35b0: 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20   several action 
35c0: 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65  routines that ge
35d0: 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70  t called in resp
35e0: 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45  onse.** to a CRE
35f0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
3600: 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75  ent.  In particu
3610: 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  lar, this routin
3620: 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61  e is called.** a
3630: 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65  fter seeing toke
3640: 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20  ns "CREATE" and 
3650: 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20  "TABLE" and the 
3660: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65  table name.  The
3670: 0a 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b 65 6e  .** pStart token
3680: 20 69 73 20 74 68 65 20 43 52 45 41 54 45 20 61   is the CREATE a
3690: 6e 64 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  nd pName is the 
36a0: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65  table name.  The
36b0: 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20   isTemp.** flag 
36c0: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74  is true if the t
36d0: 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73  able should be s
36e0: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78  tored in the aux
36f0: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a  iliary database.
3700: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
3710: 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  of in the main d
3720: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
3730: 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  his is normally 
3740: 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e  the case.** when
3750: 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22   the "TEMP" or "
3760: 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f  TEMPORARY" keywo
3770: 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74  rd occurs in bet
3780: 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61  ween.** CREATE a
3790: 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20  nd TABLE..**.** 
37a0: 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65  The new table re
37b0: 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69  cord is initiali
37c0: 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70  zed and put in p
37d0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
37e0: 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20  ..** As more of 
37f0: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
3800: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
3810: 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c  rsed, additional
3820: 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69   action.** routi
3830: 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  nes will be call
3840: 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69  ed to add more i
3850: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
3860: 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74  is record..** At
3870: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
3880: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
3890: 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69  tement, the sqli
38a0: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f  te3EndTable() ro
38b0: 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
38c0: 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  ed to complete t
38d0: 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  he construction 
38e0: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
38f0: 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64   record..*/.void
3900: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
3910: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
3920: 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72  rse,   /* Parser
3930: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
3940: 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f  ken *pStart,   /
3950: 2a 20 54 68 65 20 22 43 52 45 41 54 45 22 20 74  * The "CREATE" t
3960: 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  oken */.  Token 
3970: 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69  *pName1,   /* Fi
3980: 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  rst part of the 
3990: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
39a0: 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54  e or view */.  T
39b0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
39c0: 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f  /* Second part o
39d0: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
39e0: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
39f0: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c  */.  int isTemp,
3a00: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3a10: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20   this is a TEMP 
3a20: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
3a30: 73 56 69 65 77 20 20 20 20 20 20 20 2f 2a 20 54  sView       /* T
3a40: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
3a50: 20 56 49 45 57 20 2a 2f 0a 29 7b 0a 20 20 54 61   VIEW */.){.  Ta
3a60: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49  ble *pTable;.  I
3a70: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 63 68  ndex *pIdx;.  ch
3a80: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c  ar *zName;.  sql
3a90: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
3aa0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ->db;.  Vdbe *v;
3ab0: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
3ac0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
3ad0: 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65  number to create
3ae0: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f   the table in */
3af0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b  .  Token *pName;
3b00: 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
3b10: 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  ed name of the t
3b20: 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a  able to create *
3b30: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  /..  /* The tabl
3b40: 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74  e or view name t
3b50: 6f 20 63 72 65 61 74 65 20 69 73 20 70 61 73 73  o create is pass
3b60: 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ed to this routi
3b70: 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20  ne via tokens.  
3b80: 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e  ** pName1 and pN
3b90: 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62  ame2. If the tab
3ba0: 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c  le name was full
3bb0: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72  y qualified, for
3bc0: 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   example:.  **. 
3bd0: 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
3be0: 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a   xxx.yyy (...);.
3bf0: 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20    ** .  ** Then 
3c00: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
3c10: 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65   "xxx" and pName
3c20: 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20  2 "yyy". On the 
3c30: 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20  other hand if.  
3c40: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  ** the table nam
3c50: 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71  e is not fully q
3c60: 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a  ualified, i.e.:.
3c70: 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45    **.  ** CREATE
3c80: 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b   TABLE yyy(...);
3c90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
3ca0: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
3cb0: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
3cc0: 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20  2 is ""..  **.  
3cd0: 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f  ** The call belo
3ce0: 77 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65  w sets the pName
3cf0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e   pointer to poin
3d00: 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28  t at the token (
3d10: 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70  pName1 or.  ** p
3d20: 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72  Name2) that stor
3d30: 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  es the unqualifi
3d40: 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54  ed table name. T
3d50: 68 65 20 76 61 72 69 61 62 6c 65 20 69 44 62 20  he variable iDb 
3d60: 69 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74  is.  ** set to t
3d70: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
3d80: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 74 68  database that th
3d90: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
3da0: 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72  is to be.  ** cr
3db0: 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20  eated in..  */. 
3dc0: 20 69 44 62 20 3d 20 72 65 73 6f 6c 76 65 53 63   iDb = resolveSc
3dd0: 68 65 6d 61 4e 61 6d 65 28 70 50 61 72 73 65 2c  hemaName(pParse,
3de0: 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
3df0: 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20   &pName);.  if( 
3e00: 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb<0 ) return;.
3e10: 20 20 69 66 28 20 69 73 54 65 6d 70 20 26 26 20    if( isTemp && 
3e20: 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  iDb>1 ){.    /* 
3e30: 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65  If creating a te
3e40: 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61  mp table, the na
3e50: 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75  me may not be qu
3e60: 61 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 73  alified */.    s
3e70: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3e80: 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72  Parse, "temporar
3e90: 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73  y table name mus
3ea0: 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64  t be unqualified
3eb0: 22 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  ");.    pParse->
3ec0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
3ed0: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  rn;.  }.  if( is
3ee0: 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a  Temp ) iDb = 1;.
3ef0: 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65  .  pParse->sName
3f00: 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a  Token = *pName;.
3f10: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
3f20: 33 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f  3TableNameFromTo
3f30: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66  ken(pName);.  if
3f40: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
3f50: 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 69  urn;.  if( db->i
3f60: 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54  nit.iDb==1 ) isT
3f70: 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  emp = 1;.#ifndef
3f80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
3f90: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73  HORIZATION.  ass
3fa0: 65 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31  ert( (isTemp & 1
3fb0: 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b  )==isTemp );.  {
3fc0: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
3fd0: 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64     char *zDb = d
3fe0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
3ff0: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
4000: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
4010: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
4020: 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
4030: 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29  isTemp), 0, zDb)
4040: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4050: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
4060: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
4070: 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
4080: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54  ){.      if( isT
4090: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63  emp ){.        c
40a0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
40b0: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20  ATE_TEMP_VIEW;. 
40c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
40d0: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
40e0: 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20  E_CREATE_VIEW;. 
40f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
4100: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 65  {.      if( isTe
4110: 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  mp ){.        co
4120: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
4130: 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20  TE_TEMP_TABLE;. 
4140: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4150: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
4160: 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a  E_CREATE_TABLE;.
4170: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4180: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
4190: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
41a0: 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a  ode, zName, 0, z
41b0: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Db) ){.      sql
41c0: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
41d0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
41e0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
41f0: 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 72 79 69    /* Before tryi
4200: 6e 67 20 74 6f 20 63 72 65 61 74 65 20 61 20 74  ng to create a t
4210: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
4220: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74  make sure the Bt
4230: 72 65 65 20 66 6f 72 0a 20 20 2a 2a 20 68 6f 6c  ree for.  ** hol
4240: 64 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74  ding temporary t
4250: 61 62 6c 65 73 20 69 73 20 6f 70 65 6e 2e 0a 20  ables is open.. 
4260: 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70   */.  if( isTemp
4270: 20 26 26 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70   && db->aDb[1].p
4280: 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65  Bt==0 && !pParse
4290: 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
42a0: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
42b0: 33 42 74 72 65 65 46 61 63 74 6f 72 79 28 64 62  3BtreeFactory(db
42c0: 2c 20 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45  , 0, 0, MAX_PAGE
42d0: 53 2c 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  S, &db->aDb[1].p
42e0: 42 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Bt);.    if( rc!
42f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4300: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4310: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
4320: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  ble to open a te
4330: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
4340: 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65   ".        "file
4350: 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d   for storing tem
4360: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b  porary tables");
4370: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
4380: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Err++;.      ret
4390: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
43a0: 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
43b0: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b  QLITE_InTrans ){
43c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
43d0: 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
43e0: 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  ns(db->aDb[1].pB
43f0: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
4400: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
4410: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
4420: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
4430: 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61 20  unable to get a 
4440: 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a  write lock on ".
4450: 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20 74            "the t
4460: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
4470: 65 20 66 69 6c 65 22 29 3b 0a 20 20 20 20 20 20  e file");.      
4480: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
4490: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
44a0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
44b0: 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64  new table name d
44c0: 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20  oes not collide 
44d0: 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67  with an existing
44e0: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
44f0: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 49 73 73 75  able name.  Issu
4500: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
4510: 67 65 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20  ge if it does.. 
4520: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 61   **.  ** If we a
4530: 72 65 20 72 65 2d 72 65 61 64 69 6e 67 20 74 68  re re-reading th
4540: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
4550: 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 6f 66  table because of
4560: 20 61 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 63   a schema.  ** c
4570: 68 61 6e 67 65 20 61 6e 64 20 61 20 6e 65 77 20  hange and a new 
4580: 70 65 72 6d 61 6e 65 6e 74 20 74 61 62 6c 65 20  permanent table 
4590: 69 73 20 66 6f 75 6e 64 20 77 68 6f 73 65 20 6e  is found whose n
45a0: 61 6d 65 20 63 6f 6c 6c 69 64 65 73 20 77 69 74  ame collides wit
45b0: 68 0a 20 20 2a 2a 20 61 6e 20 65 78 69 73 74 69  h.  ** an existi
45c0: 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
45d0: 6c 65 2c 20 74 68 61 74 20 69 73 20 6e 6f 74 20  le, that is not 
45e0: 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20  an error..  */. 
45f0: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
4600: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
4610: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Name, 0);.  if( 
4620: 70 54 61 62 6c 65 21 3d 30 20 26 26 20 28 70 54  pTable!=0 && (pT
4630: 61 62 6c 65 2d 3e 69 44 62 3d 3d 69 44 62 20 7c  able->iDb==iDb |
4640: 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  | !db->init.busy
4650: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
4660: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4670: 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61   "table %T alrea
4680: 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d  dy exists", pNam
4690: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
46a0: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ee(zName);.    r
46b0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
46c0: 20 28 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33   (pIdx = sqlite3
46d0: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
46e0: 61 6d 65 2c 20 30 29 29 21 3d 30 20 26 26 0a 20  ame, 0))!=0 &&. 
46f0: 20 20 20 20 20 20 20 20 20 28 70 49 64 78 2d 3e           (pIdx->
4700: 69 44 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69  iDb==0 || !db->i
4710: 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20  nit.busy) ){.   
4720: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
4730: 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
4740: 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e  is already an in
4750: 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  dex named %s", z
4760: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
4770: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
4780: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
4790: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 4d  pTable = sqliteM
47a0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61  alloc( sizeof(Ta
47b0: 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
47c0: 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  able==0 ){.    s
47d0: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
47e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
47f0: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  }.  pTable->zNam
4800: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61  e = zName;.  pTa
4810: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  ble->nCol = 0;. 
4820: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
4830: 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b  0;.  pTable->iPK
4840: 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c  ey = -1;.  pTabl
4850: 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  e->pIndex = 0;. 
4860: 20 70 54 61 62 6c 65 2d 3e 69 44 62 20 3d 20 69   pTable->iDb = i
4870: 44 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  Db;.  if( pParse
4880: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71  ->pNewTable ) sq
4890: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
48a0: 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65  (db, pParse->pNe
48b0: 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72 73  wTable);.  pPars
48c0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70  e->pNewTable = p
48d0: 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 42 65 67  Table;..  /* Beg
48e0: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  in generating th
48f0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
4900: 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c   insert the tabl
4910: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20  e record into.  
4920: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  ** the SQLITE_MA
4930: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74  STER table.  Not
4940: 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20  e in particular 
4950: 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20  that we must go 
4960: 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61  ahead.  ** and a
4970: 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f  llocate the reco
4980: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
4990: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f  e table entry no
49a0: 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20  w.  Before any. 
49b0: 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
49c0: 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72  or UNIQUE keywor
49d0: 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20  ds are parsed.  
49e0: 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77  Those keywords w
49f0: 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69  ill cause.  ** i
4a00: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65  ndices to be cre
4a10: 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62  ated and the tab
4a20: 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63  le record must c
4a30: 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a  ome before the .
4a40: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48    ** indices.  H
4a50: 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64  ence, the record
4a60: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
4a70: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c  table must be al
4a80: 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77  located.  ** now
4a90: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
4aa0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28  ->init.busy && (
4ab0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
4ac0: 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29  be(pParse))!=0 )
4ad0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
4ae0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
4af0: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
4b00: 3b 0a 20 20 20 20 69 66 28 20 21 69 73 54 65 6d  ;.    if( !isTem
4b10: 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 76  p ){.      /* Ev
4b20: 65 72 79 20 74 69 6d 65 20 61 20 6e 65 77 20 74  ery time a new t
4b30: 61 62 6c 65 20 69 73 20 63 72 65 61 74 65 64 20  able is created 
4b40: 74 68 65 20 66 69 6c 65 2d 66 6f 72 6d 61 74 0a  the file-format.
4b50: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 65 6e 63        ** and enc
4b60: 6f 64 69 6e 67 20 6d 65 74 61 2d 76 61 6c 75 65  oding meta-value
4b70: 73 20 61 72 65 20 73 65 74 20 69 6e 20 74 68 65  s are set in the
4b80: 20 64 61 74 61 62 61 73 65 2c 20 69 6e 0a 20 20   database, in.  
4b90: 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73      ** case this
4ba0: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 61   is the first ta
4bb0: 62 6c 65 20 63 72 65 61 74 65 64 2e 0a 20 20 20  ble created..   
4bc0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
4bd0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4be0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e  OP_Integer, db->
4bf0: 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 30 29 3b  file_format, 0);
4c00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4c10: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
4c20: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29  tCookie, iDb, 1)
4c30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4c40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
4c50: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 65 6e 63 2c  nteger, db->enc,
4c60: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
4c70: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4c80: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
4c90: 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 4);.    }.    
4ca0: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
4cb0: 72 54 61 62 6c 65 28 76 2c 20 69 44 62 29 3b 0a  rTable(v, iDb);.
4cc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4cd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65  ddOp(v, OP_NewRe
4ce0: 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  cno, 0, 0);.    
4cf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4d00: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
4d10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4d20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
4d30: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
4d40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4d50: 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65  p(v, OP_PutIntKe
4d60: 79 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  y, 0, 0);.  }.}.
4d70: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
4d80: 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74   column to the t
4d90: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62  able currently b
4da0: 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
4db0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  ..**.** The pars
4dc0: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
4dd0: 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65  utine once for e
4de0: 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61  ach column decla
4df0: 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43  ration.** in a C
4e00: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
4e10: 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53  ement.  sqlite3S
4e20: 74 61 72 74 54 61 62 6c 65 28 29 20 67 65 74 73  tartTable() gets
4e30: 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74   called.** first
4e40: 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67   to get things g
4e50: 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73  oing.  Then this
4e60: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
4e70: 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63  ed for each.** c
4e80: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  olumn..*/.void s
4e90: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28  qlite3AddColumn(
4ea0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
4eb0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
4ec0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
4ed0: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 30  i;.  char *z = 0
4ee0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
4ef0: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
4f00: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
4f10: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
4f20: 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67  qlite3SetNString
4f30: 28 26 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70  (&z, pName->z, p
4f40: 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 69  Name->n, 0);.  i
4f50: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
4f60: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f  ;.  sqlite3Dequo
4f70: 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 30  te(z);.  for(i=0
4f80: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
4f90: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
4fa0: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 70 2d 3e  e3StrICmp(z, p->
4fb0: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  aCol[i].zName)==
4fc0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
4fd0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4fe0: 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f  e, "duplicate co
4ff0: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20  lumn name: %s", 
5000: 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
5010: 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72  Free(z);.      r
5020: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
5030: 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20  .  if( (p->nCol 
5040: 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20  & 0x7)==0 ){.   
5050: 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20   Column *aNew;. 
5060: 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65     aNew = sqlite
5070: 52 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c  Realloc( p->aCol
5080: 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69  , (p->nCol+8)*si
5090: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
50a0: 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d  );.    if( aNew=
50b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
50c0: 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b   p->aCol = aNew;
50d0: 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70  .  }.  pCol = &p
50e0: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b  ->aCol[p->nCol];
50f0: 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20  .  memset(pCol, 
5100: 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  0, sizeof(p->aCo
5110: 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e  l[0]));.  pCol->
5120: 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f  zName = z;. .  /
5130: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
5140: 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c   type specified,
5150: 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68   columns have th
5160: 65 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69  e default affini
5170: 74 79 0a 20 20 2a 2a 20 27 4e 55 4d 45 52 49 43  ty.  ** 'NUMERIC
5180: 27 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  '. If there is a
5190: 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c   type specified,
51a0: 20 74 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64   then sqlite3Add
51b0: 43 6f 6c 75 6d 6e 54 79 70 65 28 29 0a 20 20 2a  ColumnType().  *
51c0: 2a 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  * will be called
51d0: 20 6e 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f   next to set pCo
51e0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72  l->affinity corr
51f0: 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43  ectly..  */.  pC
5200: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
5210: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
5220: 43 3b 0a 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c  C;.  pCol->pColl
5230: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
5240: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 70 2d 3e 6e  DfltColl;.  p->n
5250: 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Col++;.}../*.** 
5260: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5270: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
5280: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
5290: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
52a0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
52b0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
52c0: 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63    A "NOT NULL" c
52d0: 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a  onstraint has.**
52e0: 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20   been seen on a 
52f0: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f  column.  This ro
5300: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e  utine sets the n
5310: 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a  otNull flag on.*
5320: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72  * the column cur
5330: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
5340: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
5350: 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74  id sqlite3AddNot
5360: 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72  Null(Parse *pPar
5370: 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
5380: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
5390: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20  int i;.  if( (p 
53a0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
53b0: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
53c0: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
53d0: 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20  1;.  if( i>=0 ) 
53e0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75  p->aCol[i].notNu
53f0: 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a  ll = onError;.}.
5400: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
5410: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
5420: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
5430: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
5440: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
5450: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
5460: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69  tement.  The pFi
5470: 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  rst token is the
5480: 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20   first.** token 
5490: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  in the sequence 
54a0: 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64  of tokens that d
54b0: 65 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65  escribe the type
54c0: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   of the.** colum
54d0: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
54e0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
54f0: 20 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c    pLast is the l
5500: 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20  ast token.** in 
5510: 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55  the sequence.  U
5520: 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  se this informat
5530: 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ion to construct
5540: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61   a string.** tha
5550: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
5560: 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  ypename of the c
5570: 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20  olumn and store 
5580: 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69  that string.** i
5590: 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69  n zType..*/ .voi
55a0: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
55b0: 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  mnType(Parse *pP
55c0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 46 69  arse, Token *pFi
55d0: 72 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73  rst, Token *pLas
55e0: 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  t){.  Table *p;.
55f0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
5600: 74 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20  t n;.  char *z, 
5610: 2a 2a 70 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  **pz;.  Column *
5620: 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d  pCol;.  if( (p =
5630: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
5640: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
5650: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
5660: 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65  ;.  if( i<0 ) re
5670: 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26  turn;.  pCol = &
5680: 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 70 7a  p->aCol[i];.  pz
5690: 20 3d 20 26 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b   = &pCol->zType;
56a0: 0a 20 20 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e 20  .  n = pLast->n 
56b0: 2b 20 41 64 64 72 28 70 4c 61 73 74 2d 3e 7a 29  + Addr(pLast->z)
56c0: 20 2d 20 41 64 64 72 28 70 46 69 72 73 74 2d 3e   - Addr(pFirst->
56d0: 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 74  z);.  sqlite3Set
56e0: 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 46 69 72  NString(pz, pFir
56f0: 73 74 2d 3e 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20  st->z, n, 0);.  
5700: 7a 20 3d 20 2a 70 7a 3b 0a 20 20 69 66 28 20 7a  z = *pz;.  if( z
5710: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
5720: 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b  for(i=j=0; z[i];
5730: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63   i++){.    int c
5740: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 69 66 28   = z[i];.    if(
5750: 20 69 73 73 70 61 63 65 28 63 29 20 29 20 63 6f   isspace(c) ) co
5760: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b  ntinue;.    z[j+
5770: 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b  +] = c;.  }.  z[
5780: 6a 5d 20 3d 20 30 3b 0a 2f 2f 20 20 70 43 6f 6c  j] = 0;.//  pCol
5790: 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 73 71  ->sortOrder = sq
57a0: 6c 69 74 65 33 43 6f 6c 6c 61 74 65 54 79 70 65  lite3CollateType
57b0: 28 7a 2c 20 6e 29 3b 0a 20 20 70 43 6f 6c 2d 3e  (z, n);.  pCol->
57c0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
57d0: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a  e3AffinityType(z
57e0: 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , n);.}../*.** T
57f0: 68 65 20 67 69 76 65 6e 20 74 6f 6b 65 6e 20 69  he given token i
5800: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  s the default va
5810: 6c 75 65 20 66 6f 72 20 74 68 65 20 6c 61 73 74  lue for the last
5820: 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f   column added to
5830: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 63 75  .** the table cu
5840: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
5850: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20  nstruction.  If 
5860: 22 6d 69 6e 75 73 46 6c 61 67 22 20 69 73 20 74  "minusFlag" is t
5870: 72 75 65 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73  rue, it.** means
5880: 20 74 68 65 20 76 61 6c 75 65 20 74 6f 6b 65 6e   the value token
5890: 20 77 61 73 20 70 72 65 63 65 64 65 64 20 62 79   was preceded by
58a0: 20 61 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a   a minus sign..*
58b0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
58c0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
58d0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
58e0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
58f0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
5900: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
5910: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
5920: 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56  lite3AddDefaultV
5930: 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  alue(Parse *pPar
5940: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c  se, Token *pVal,
5950: 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b   int minusFlag){
5960: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
5970: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 2a 70  nt i;.  char **p
5980: 7a 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  z;.  if( (p = pP
5990: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
59a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
59b0: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
59c0: 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
59d0: 6e 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43  n;.  pz = &p->aC
59e0: 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69  ol[i].zDflt;.  i
59f0: 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a  f( minusFlag ){.
5a00: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53      sqlite3SetNS
5a10: 74 72 69 6e 67 28 70 7a 2c 20 22 2d 22 2c 20 31  tring(pz, "-", 1
5a20: 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d  , pVal->z, pVal-
5a30: 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  >n, 0);.  }else{
5a40: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e  .    sqlite3SetN
5a50: 53 74 72 69 6e 67 28 70 7a 2c 20 70 56 61 6c 2d  String(pz, pVal-
5a60: 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b  >z, pVal->n, 0);
5a70: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
5a80: 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f  quote(*pz);.}../
5a90: 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74  *.** Designate t
5aa0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66  he PRIMARY KEY f
5ab0: 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70  or the table.  p
5ac0: 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
5ad0: 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63  f names .** of c
5ae0: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d  olumns that form
5af0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
5b00: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e  .  If pList is N
5b10: 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ULL, then the.**
5b20: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
5b30: 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  dded column of t
5b40: 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  he table is the 
5b50: 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a  primary key..**.
5b60: 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68  ** A table can h
5b70: 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  ave at most one 
5b80: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
5b90: 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
5ba0: 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d  dy has.** a prim
5bb0: 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69  ary key (and thi
5bc0: 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  s is the second 
5bd0: 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65  primary key) the
5be0: 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65  n create an.** e
5bf0: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rror..**.** If t
5c00: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
5c10: 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f  s on a single co
5c20: 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74  lumn whose datat
5c30: 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a  ype is INTEGER,.
5c40: 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  ** then we will 
5c50: 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20  try to use that 
5c60: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f  column as the ro
5c70: 77 20 69 64 2e 20 20 28 45 78 63 65 70 74 69 6f  w id.  (Exceptio
5c80: 6e 3a 0a 2a 2a 20 46 6f 72 20 62 61 63 6b 77 61  n:.** For backwa
5c90: 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
5ca0: 79 20 77 69 74 68 20 6f 6c 64 65 72 20 64 61 74  y with older dat
5cb0: 61 62 61 73 65 73 2c 20 64 6f 20 6e 6f 74 20 64  abases, do not d
5cc0: 6f 20 74 68 69 73 0a 2a 2a 20 69 66 20 74 68 65  o this.** if the
5cd0: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 76 65 72   file format ver
5ce0: 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 73 20 6c  sion number is l
5cf0: 65 73 73 20 74 68 61 6e 20 31 2e 29 20 20 53 65  ess than 1.)  Se
5d00: 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65  t the Table.iPKe
5d10: 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  y.** field of th
5d20: 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
5d30: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
5d40: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
5d50: 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
5d60: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e  MARY KEY column.
5d70: 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73    Table.iPKey is
5d80: 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68   set to -1 if th
5d90: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54  ere is.** no INT
5da0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
5db0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b  ..**.** If the k
5dc0: 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54  ey is not an INT
5dd0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
5de0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
5df0: 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20  unique.** index 
5e00: 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f  for the key.  No
5e10: 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
5e20: 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52  d for INTEGER PR
5e30: 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76  IMARY KEYs..*/.v
5e40: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72  oid sqlite3AddPr
5e50: 69 6d 61 72 79 4b 65 79 28 50 61 72 73 65 20 2a  imaryKey(Parse *
5e60: 70 50 61 72 73 65 2c 20 49 64 4c 69 73 74 20 2a  pParse, IdList *
5e70: 70 4c 69 73 74 2c 20 69 6e 74 20 6f 6e 45 72 72  pList, int onErr
5e80: 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  or){.  Table *pT
5e90: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
5ea0: 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  wTable;.  char *
5eb0: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zType = 0;.  int
5ec0: 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20   iCol = -1, i;. 
5ed0: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67   if( pTab==0 ) g
5ee0: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
5ef0: 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62  exit;.  if( pTab
5f00: 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a  ->hasPrimKey ){.
5f10: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5f20: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
5f30: 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22     "table \"%s\"
5f40: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
5f50: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c  ne primary key",
5f60: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
5f70: 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f     goto primary_
5f80: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  key_exit;.  }.  
5f90: 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79  pTab->hasPrimKey
5fa0: 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 1;.  if( pLis
5fb0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c  t==0 ){.    iCol
5fc0: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20   = pTab->nCol - 
5fd0: 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  1;.    pTab->aCo
5fe0: 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65  l[iCol].isPrimKe
5ff0: 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 1;.  }else{.
6000: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
6010: 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
6020: 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d  .      for(iCol=
6030: 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  0; iCol<pTab->nC
6040: 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
6050: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
6060: 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61  StrICmp(pList->a
6070: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  [i].zName, pTab-
6080: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
6090: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
60a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
60b0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
60c0: 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d    if( iCol<pTab-
60d0: 3e 6e 43 6f 6c 20 29 20 70 54 61 62 2d 3e 61 43  >nCol ) pTab->aC
60e0: 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b  ol[iCol].isPrimK
60f0: 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ey = 1;.    }.  
6100: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64    if( pList->nId
6110: 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a  >1 ) iCol = -1;.
6120: 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d    }.  if( iCol>=
6130: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
6140: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70  nCol ){.    zTyp
6150: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
6160: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a  Col].zType;.  }.
6170: 20 20 69 66 28 20 7a 54 79 70 65 20 26 26 20 73    if( zType && s
6180: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
6190: 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d  ype, "INTEGER")=
61a0: 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  =0 ){.    pTab->
61b0: 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20  iPKey = iCol;.  
61c0: 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20    pTab->keyConf 
61d0: 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 7d 65 6c  = onError;.  }el
61e0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  se{.    sqlite3C
61f0: 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  reateIndex(pPars
6200: 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73  e, 0, 0, 0, pLis
6210: 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30  t, onError, 0, 0
6220: 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30  );.    pList = 0
6230: 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b  ;.  }..primary_k
6240: 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ey_exit:.  sqlit
6250: 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  e3IdListDelete(p
6260: 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b  List);.  return;
6270: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6280: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 43 6f   a pointer to Co
6290: 6c 6c 53 65 71 20 67 69 76 65 6e 20 74 68 65 20  llSeq given the 
62a0: 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 6c 61 74  name of a collat
62b0: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
62c0: 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   If the collatin
62d0: 67 20 73 65 71 75 65 6e 63 65 20 64 69 64 20 6e  g sequence did n
62e0: 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78  ot previously ex
62f0: 69 73 74 2c 20 63 72 65 61 74 65 20 69 74 20 62  ist, create it b
6300: 75 74 0a 2a 2a 20 61 73 73 69 67 6e 20 69 74 20  ut.** assign it 
6310: 61 6e 20 4e 55 4c 4c 20 63 6f 6d 70 61 72 69 73  an NULL comparis
6320: 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  on function..*/.
6330: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
6340: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
6350: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
6360: 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e   char *zType, in
6370: 74 20 6e 54 79 70 65 29 7b 0a 20 20 43 6f 6c 6c  t nType){.  Coll
6380: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 73 71  Seq *pColl;.  sq
6390: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
63a0: 65 2d 3e 64 62 3b 0a 0a 20 20 70 43 6f 6c 6c 20  e->db;..  pColl 
63b0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
63c0: 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c  d(&db->aCollSeq,
63d0: 20 7a 54 79 70 65 2c 20 6e 54 79 70 65 29 3b 0a   zType, nType);.
63e0: 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29    if( pColl==0 )
63f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  {.    sqlite3Cha
6400: 6e 67 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63  ngeCollatingFunc
6410: 74 69 6f 6e 28 64 62 2c 20 7a 54 79 70 65 2c 20  tion(db, zType, 
6420: 6e 54 79 70 65 2c 20 30 2c 20 30 29 3b 0a 20 20  nType, 0, 0);.  
6430: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
6440: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
6450: 43 6f 6c 6c 53 65 71 2c 20 7a 54 79 70 65 2c 20  CollSeq, zType, 
6460: 6e 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 72 65  nType);.  }.  re
6470: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
6480: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c  *.** Set the col
6490: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
64a0: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
64b0: 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c  ntly parsed tabl
64c0: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74  e column.** to t
64d0: 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e  he CollSeq given
64e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
64f0: 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28  3AddCollateType(
6500: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
6510: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
6520: 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20  , int nType){.  
6530: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 6c  Table *p;.  Coll
6540: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 73 71  Seq *pColl;.  sq
6550: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
6560: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70  e->db;..  if( (p
6570: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
6580: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
6590: 6e 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  n;.  pColl = sql
65a0: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
65b0: 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 54 79 70  ->aCollSeq, zTyp
65c0: 65 2c 20 6e 54 79 70 65 29 3b 0a 20 20 69 66 28  e, nType);.  if(
65d0: 20 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20   pColl==0 ){.   
65e0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
65f0: 43 68 61 6e 67 65 43 6f 6c 6c 61 74 69 6e 67 46  ChangeCollatingF
6600: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 54 79 70  unction(db, zTyp
6610: 65 2c 20 6e 54 79 70 65 2c 20 30 2c 20 30 29 3b  e, nType, 0, 0);
6620: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 6f 6c 6c  .  }.  if( pColl
6630: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b   ){.    p->aCol[
6640: 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 70 43 6f 6c 6c  p->nCol-1].pColl
6650: 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 7d 0a   = pColl;.  }.}.
6660: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6f 72  ./*.** Create or
6670: 20 6d 6f 64 69 66 79 20 61 20 63 6f 6c 6c 61 74   modify a collat
6680: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 65 6e 74  ing sequence ent
6690: 72 79 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  ry in the sqlite
66a0: 2e 61 43 6f 6c 6c 53 65 71 0a 2a 2a 20 74 61 62  .aCollSeq.** tab
66b0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  le..**.** Once a
66c0: 6e 20 65 6e 74 72 79 20 69 73 20 61 64 64 65 64  n entry is added
66d0: 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 2e 61   to the sqlite.a
66e0: 43 6f 6c 6c 53 65 71 20 74 61 62 6c 65 2c 20 69  CollSeq table, i
66f0: 74 20 63 61 6e 20 6e 65 76 65 72 0a 2a 2a 20 62  t can never.** b
6700: 65 20 72 65 6d 6f 76 65 64 2c 20 74 68 6f 75 67  e removed, thoug
6710: 68 20 69 73 20 63 6f 6d 70 61 72 69 73 6f 6e 20  h is comparison 
6720: 66 75 6e 63 74 69 6f 6e 20 6f 72 20 75 73 65 72  function or user
6730: 20 64 61 74 61 20 63 61 6e 20 62 65 20 63 68 61   data can be cha
6740: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  nged..**.** Retu
6750: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
6760: 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  the collating fu
6770: 6e 63 74 69 6f 6e 20 74 68 61 74 20 77 61 73 20  nction that was 
6780: 63 72 65 61 74 65 64 20 6f 72 20 6d 6f 64 69 66  created or modif
6790: 69 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  ied..*/.CollSeq 
67a0: 2a 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f  *sqlite3ChangeCo
67b0: 6c 6c 61 74 69 6e 67 46 75 6e 63 74 69 6f 6e 28  llatingFunction(
67c0: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20  .  sqlite *db,  
67d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
67e0: 74 61 62 61 73 65 20 69 6e 74 6f 20 77 68 69 63  tabase into whic
67f0: 68 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  h to insert the 
6800: 63 6f 6c 6c 61 74 69 6f 6e 20 2a 2f 0a 20 20 63  collation */.  c
6810: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
6820: 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ,      /* Name o
6830: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  f the collation 
6840: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 20  */.  int nName, 
6850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6860: 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
6870: 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f  ters in zName */
6880: 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72 2c 20  .  void *pUser, 
6890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
68a0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
68b0: 78 43 6d 70 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  xCmp */.  int (*
68c0: 78 43 6d 70 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  xCmp)(void*,int,
68d0: 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
68e0: 63 6f 6e 73 74 20 76 6f 69 64 2a 29 20 2f 2a 20  const void*) /* 
68f0: 43 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  Comparison funct
6900: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 43 6f 6c 6c  ion */.){.  Coll
6910: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70  Seq *pColl;..  p
6920: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61  Coll = sqlite3Ha
6930: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c  shFind(&db->aCol
6940: 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  lSeq, zName, nNa
6950: 6d 65 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c  me);.  if( pColl
6960: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  ==0 ){.    pColl
6970: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
6980: 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c  aw( sizeof(*pCol
6990: 6c 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 20 29  l) + nName + 1 )
69a0: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d  ;.    if( pColl=
69b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
69c0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
69d0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 28  pColl->zName = (
69e0: 63 68 61 72 2a 29 26 70 43 6f 6c 6c 5b 31 5d 3b  char*)&pColl[1];
69f0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c  .    memcpy(pCol
6a00: 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  l->zName, zName,
6a10: 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 73   nName+1);.    s
6a20: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
6a30: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20  (&db->aCollSeq, 
6a40: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 4e  pColl->zName, nN
6a50: 61 6d 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d  ame, pColl);.  }
6a60: 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20  .  pColl->pUser 
6a70: 3d 20 70 55 73 65 72 3b 0a 20 20 70 43 6f 6c 6c  = pUser;.  pColl
6a80: 2d 3e 78 43 6d 70 20 3d 20 78 43 6d 70 3b 0a 20  ->xCmp = xCmp;. 
6a90: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
6aa0: 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65  ../*.** Scan the
6ab0: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d   column type nam
6ac0: 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20  e zType (length 
6ad0: 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72  nType) and retur
6ae0: 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61  n the.** associa
6af0: 74 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70  ted affinity typ
6b00: 65 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74  e..*/.char sqlit
6b10: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 63  e3AffinityType(c
6b20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
6b30: 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20  , int nType){.  
6b40: 69 6e 74 20 6e 2c 20 69 3b 0a 20 20 73 74 72 75  int n, i;.  stru
6b50: 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ct {.    const c
6b60: 68 61 72 20 2a 7a 53 75 62 3b 20 20 2f 2a 20 4b  har *zSub;  /* K
6b70: 65 79 77 6f 72 64 73 20 73 75 62 73 74 72 69 6e  eywords substrin
6b80: 67 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20  g to search for 
6b90: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 3b  */.    int nSub;
6ba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e            /* len
6bb0: 67 74 68 20 6f 66 20 7a 53 75 62 20 2a 2f 0a 20  gth of zSub */. 
6bc0: 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79     char affinity
6bd0: 3b 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74  ;     /* Affinit
6be0: 79 20 74 6f 20 72 65 74 75 72 6e 20 69 66 20 69  y to return if i
6bf0: 74 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 7d  t matches */.  }
6c00: 20 73 75 62 73 74 72 69 6e 67 73 5b 5d 20 3d 20   substrings[] = 
6c10: 7b 0a 20 20 20 20 7b 22 49 4e 54 22 2c 20 20 33  {.    {"INT",  3
6c20: 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  , SQLITE_AFF_INT
6c30: 45 47 45 52 7d 2c 0a 20 20 20 20 7b 22 43 48 41  EGER},.    {"CHA
6c40: 52 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46  R", 4, SQLITE_AF
6c50: 46 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22 43  F_TEXT},.    {"C
6c60: 4c 4f 42 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f  LOB", 4, SQLITE_
6c70: 41 46 46 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b  AFF_TEXT},.    {
6c80: 22 54 45 58 54 22 2c 20 34 2c 20 53 51 4c 49 54  "TEXT", 4, SQLIT
6c90: 45 5f 41 46 46 5f 54 45 58 54 7d 2c 0a 20 20 20  E_AFF_TEXT},.   
6ca0: 20 7b 22 42 4c 4f 42 22 2c 20 34 2c 20 53 51 4c   {"BLOB", 4, SQL
6cb0: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 7d 2c 0a 20  ITE_AFF_NONE},. 
6cc0: 20 7d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   };..  for(i=0; 
6cd0: 69 3c 73 69 7a 65 6f 66 28 73 75 62 73 74 72 69  i<sizeof(substri
6ce0: 6e 67 73 29 2f 73 69 7a 65 6f 66 28 73 75 62 73  ngs)/sizeof(subs
6cf0: 74 72 69 6e 67 73 5b 30 5d 29 3b 20 69 2b 2b 29  trings[0]); i++)
6d00: 7b 0a 20 20 20 20 69 6e 74 20 63 31 20 3d 20 73  {.    int c1 = s
6d10: 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 7a 53 75  ubstrings[i].zSu
6d20: 62 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20 63 32  b[0];.    int c2
6d30: 20 3d 20 74 6f 6c 6f 77 65 72 28 63 31 29 3b 0a   = tolower(c1);.
6d40: 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20      int limit = 
6d50: 6e 54 79 70 65 20 2d 20 73 75 62 73 74 72 69 6e  nType - substrin
6d60: 67 73 5b 69 5d 2e 6e 53 75 62 3b 0a 20 20 20 20  gs[i].nSub;.    
6d70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
6d80: 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 7a 53  substrings[i].zS
6d90: 75 62 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b  ub;.    for(n=0;
6da0: 20 6e 3c 3d 6c 69 6d 69 74 3b 20 6e 2b 2b 29 7b   n<=limit; n++){
6db0: 0a 20 20 20 20 20 20 69 6e 74 20 63 20 3d 20 7a  .      int c = z
6dc0: 54 79 70 65 5b 6e 5d 3b 0a 20 20 20 20 20 20 69  Type[n];.      i
6dd0: 66 28 20 28 63 3d 3d 63 31 20 7c 7c 20 63 3d 3d  f( (c==c1 || c==
6de0: 63 32 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  c2).            
6df0: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
6e00: 72 4e 49 43 6d 70 28 26 7a 54 79 70 65 5b 6e 5d  rNICmp(&zType[n]
6e10: 2c 20 7a 2c 20 73 75 62 73 74 72 69 6e 67 73 5b  , z, substrings[
6e20: 69 5d 2e 6e 53 75 62 29 20 29 7b 0a 20 20 20 20  i].nSub) ){.    
6e30: 20 20 20 20 72 65 74 75 72 6e 20 73 75 62 73 74      return subst
6e40: 72 69 6e 67 73 5b 69 5d 2e 61 66 66 69 6e 69 74  rings[i].affinit
6e50: 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  y;.      }.    }
6e60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
6e70: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
6e80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 65 20  ;.}../*.** Come 
6e90: 75 70 20 77 69 74 68 20 61 20 6e 65 77 20 72 61  up with a new ra
6ea0: 6e 64 6f 6d 20 76 61 6c 75 65 20 66 6f 72 20 74  ndom value for t
6eb0: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
6ec0: 2e 20 20 4d 61 6b 65 20 73 75 72 65 0a 2a 2a 20  .  Make sure.** 
6ed0: 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69 73  the new value is
6ee0: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
6ef0: 74 68 65 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54  the old..**.** T
6f00: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
6f10: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
6f20: 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73  rmine when the s
6f30: 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a  chema for the.**
6f40: 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
6f50: 73 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73  s.  After each s
6f60: 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68  chema change, th
6f70: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a  e cookie value.*
6f80: 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e  * changes.  When
6f90: 20 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74   a process first
6fa0: 20 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d   reads the schem
6fb0: 61 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65  a it records the
6fc0: 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65  .** cookie.  The
6fd0: 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65  reafter, wheneve
6fe0: 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63  r it goes to acc
6ff0: 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
7000: 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74  ,.** it checks t
7010: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b  he cookie to mak
7020: 65 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d  e sure the schem
7030: 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65  a has not change
7040: 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61  d.** since it wa
7050: 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a  s last read..**.
7060: 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20  ** This plan is 
7070: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62  not completely b
7080: 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74  ullet-proof.  It
7090: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
70a0: 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74  .** the schema t
70b0: 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c  o change multipl
70c0: 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20  e times and for 
70d0: 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65  the cookie to be
70e0: 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20  .** set back to 
70f0: 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75  prior value.  Bu
7100: 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  t schema changes
7110: 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a   are infrequent.
7120: 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61  ** and the proba
7130: 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e  bility of hittin
7140: 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69  g the same cooki
7150: 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a  e value is only.
7160: 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32  ** 1 chance in 2
7170: 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73  ^32.  So we're s
7180: 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76  afe enough..*/.v
7190: 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67  oid sqlite3Chang
71a0: 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 20 2a  eCookie(sqlite *
71b0: 64 62 2c 20 56 64 62 65 20 2a 76 2c 20 69 6e 74  db, Vdbe *v, int
71c0: 20 69 44 62 29 7b 0a 20 20 69 66 28 20 64 62 2d   iDb){.  if( db-
71d0: 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 3d 3d 64 62  >next_cookie==db
71e0: 2d 3e 61 44 62 5b 30 5d 2e 73 63 68 65 6d 61 5f  ->aDb[0].schema_
71f0: 63 6f 6f 6b 69 65 20 29 7b 0a 20 20 20 20 75 6e  cookie ){.    un
7200: 73 69 67 6e 65 64 20 63 68 61 72 20 72 3b 0a 20  signed char r;. 
7210: 20 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d     sqlite3Random
7220: 6e 65 73 73 28 31 2c 20 26 72 29 3b 0a 20 20 20  ness(1, &r);.   
7230: 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65   db->next_cookie
7240: 20 3d 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 63   = db->aDb[0].sc
7250: 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 2b 20 72 20  hema_cookie + r 
7260: 2b 20 31 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  + 1;.    db->fla
7270: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
7280: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20  ernChanges;.    
7290: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
72a0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
72b0: 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 2c  db->next_cookie,
72c0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
72d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
72e0: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
72f0: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
7300: 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d   Measure the num
7310: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
7320: 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70  s needed to outp
7330: 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  ut the given.** 
7340: 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65  identifier.  The
7350: 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64   number returned
7360: 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75   includes any qu
7370: 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74  otes used.** but
7380: 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64   does not includ
7390: 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69  e the null termi
73a0: 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  nator..*/.static
73b0: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
73c0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
73d0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20  .  int n;.  int 
73e0: 6e 65 65 64 51 75 6f 74 65 20 3d 20 30 3b 0a 20  needQuote = 0;. 
73f0: 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b   for(n=0; *z; n+
7400: 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, z++){.    if(
7410: 20 2a 7a 3d 3d 27 5c 27 27 20 29 7b 20 6e 2b 2b   *z=='\'' ){ n++
7420: 3b 20 6e 65 65 64 51 75 6f 74 65 3d 31 3b 20 7d  ; needQuote=1; }
7430: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20  .  }.  return n 
7440: 2b 20 6e 65 65 64 51 75 6f 74 65 2a 32 3b 0a 7d  + needQuote*2;.}
7450: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e  ../*.** Write an
7460: 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f   identifier onto
7470: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
7480: 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20 41  given string.  A
7490: 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72  dd.** quote char
74a0: 61 63 74 65 72 73 20 61 73 20 6e 65 65 64 65 64  acters as needed
74b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
74c0: 20 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a   identPut(char *
74d0: 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68  z, int *pIdx, ch
74e0: 61 72 20 2a 7a 49 64 65 6e 74 29 7b 0a 20 20 69  ar *zIdent){.  i
74f0: 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f  nt i, j, needQuo
7500: 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b  te;.  i = *pIdx;
7510: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65  .  for(j=0; zIde
7520: 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nt[j]; j++){.   
7530: 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49   if( !isalnum(zI
7540: 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65  dent[j]) && zIde
7550: 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65  nt[j]!='_' ) bre
7560: 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75  ak;.  }.  needQu
7570: 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d  ote =  zIdent[j]
7580: 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28 7a  !=0 || isdigit(z
7590: 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20  Ident[0]).      
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
75b0: 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64  qlite3KeywordCod
75c0: 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b  e(zIdent, j)!=TK
75d0: 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64 51  _ID;.  if( needQ
75e0: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
75f0: 27 5c 27 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  '\'';.  for(j=0;
7600: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
7610: 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a  {.    z[i++] = z
7620: 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66  Ident[j];.    if
7630: 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 5c 27  ( zIdent[j]=='\'
7640: 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27  ' ) z[i++] = '\'
7650: 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65  ';.  }.  if( nee
7660: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
7670: 3d 20 27 5c 27 27 3b 0a 20 20 7a 5b 69 5d 20 3d  = '\'';.  z[i] =
7680: 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b   0;.  *pIdx = i;
7690: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
76a0: 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  te a CREATE TABL
76b0: 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72  E statement appr
76c0: 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
76d0: 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20  given.** table. 
76e0: 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20   Memory to hold 
76f0: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  the text of the 
7700: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74  statement is obt
7710: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71  ained.** from sq
7720: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
7730: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
7740: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
7750: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
7760: 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61  c char *createTa
7770: 62 6c 65 53 74 6d 74 28 54 61 62 6c 65 20 2a 70  bleStmt(Table *p
7780: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e  ){.  int i, k, n
7790: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b  ;.  char *zStmt;
77a0: 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a  .  char *zSep, *
77b0: 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20  zSep2, *zEnd;.  
77c0: 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  n = 0;.  for(i=0
77d0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
77e0: 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e  ){.    n += iden
77f0: 74 4c 65 6e 67 74 68 28 70 2d 3e 61 43 6f 6c 5b  tLength(p->aCol[
7800: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
7810: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
7820: 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  h(p->zName);.  i
7830: 66 28 20 6e 3c 34 30 20 29 7b 0a 20 20 20 20 7a  f( n<40 ){.    z
7840: 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53  Sep = "";.    zS
7850: 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a  ep2 = ",";.    z
7860: 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c  End = ")";.  }el
7870: 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  se{.    zSep = "
7880: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32  \n  ";.    zSep2
7890: 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20   = ",\n  ";.    
78a0: 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20  zEnd = "\n)";.  
78b0: 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a  }.  n += 35 + 6*
78c0: 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74  p->nCol;.  zStmt
78d0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
78e0: 61 77 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a  aw( n );.  if( z
78f0: 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  Stmt==0 ) return
7900: 20 30 3b 0a 20 20 73 74 72 63 70 79 28 7a 53 74   0;.  strcpy(zSt
7910: 6d 74 2c 20 70 2d 3e 69 44 62 3d 3d 31 20 3f 20  mt, p->iDb==1 ? 
7920: 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42  "CREATE TEMP TAB
7930: 4c 45 20 22 20 3a 20 22 43 52 45 41 54 45 20 54  LE " : "CREATE T
7940: 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73  ABLE ");.  k = s
7950: 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20  trlen(zStmt);.  
7960: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
7970: 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  &k, p->zName);. 
7980: 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28   zStmt[k++] = '(
7990: 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ';.  for(i=0; i<
79a0: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
79b0: 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74     strcpy(&zStmt
79c0: 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20  [k], zSep);.    
79d0: 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74  k += strlen(&zSt
79e0: 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70  mt[k]);.    zSep
79f0: 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64   = zSep2;.    id
7a00: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
7a10: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  , p->aCol[i].zNa
7a20: 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 74 72 63 70  me);.  }.  strcp
7a30: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e  y(&zStmt[k], zEn
7a40: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74  d);.  return zSt
7a50: 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  mt;.}../*.** Thi
7a60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
7a70: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
7a80: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
7a90: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
7aa0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
7ab0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
7ac0: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
7ad0: 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63  re that other ac
7ae0: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61  tion routines ha
7af0: 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67  ve been building
7b00: 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
7b10: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  the internal has
7b20: 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69  h tables, assumi
7b30: 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76  ng no errors hav
7b40: 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a  e.** occurred..*
7b50: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f  *.** An entry fo
7b60: 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d  r the table is m
7b70: 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ade in the maste
7b80: 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c  r table on disk,
7b90: 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20   unless.** this 
7ba0: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
7bb0: 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74  able or db->init
7bc0: 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20  .busy==1.  When 
7bd0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
7be0: 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20  .** it means we 
7bf0: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
7c00: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
7c10: 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a  ble because we j
7c20: 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  ust.** connected
7c30: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
7c40: 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
7c50: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
7c60: 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e  ble has.** recen
7c70: 74 6c 79 20 63 68 61 6e 67 65 73 2c 20 73 6f 20  tly changes, so 
7c80: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
7c90: 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  is table already
7ca0: 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68   exists in.** th
7cb0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
7cc0: 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f  table.  We do no
7cd0: 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65  t want to create
7ce0: 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a   it again..**.**
7cf0: 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20   If the pSelect 
7d00: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
7d10: 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74  NULL, it means t
7d20: 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
7d30: 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74  .** was called t
7d40: 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65  o create a table
7d50: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
7d60: 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41  a .** "CREATE TA
7d70: 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  BLE ... AS SELEC
7d80: 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74  T ..." statement
7d90: 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  .  The column na
7da0: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  mes of.** the ne
7db0: 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74  w table will mat
7dc0: 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ch the result se
7dd0: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  t of the SELECT.
7de0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7df0: 45 6e 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a  EndTable(Parse *
7e00: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
7e10: 45 6e 64 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  End, Select *pSe
7e20: 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
7e30: 70 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  p;.  sqlite *db 
7e40: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
7e50: 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26   if( (pEnd==0 &&
7e60: 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20   pSelect==0) || 
7e70: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
7e80: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
7e90: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
7ea0: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
7eb0: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
7ec0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
7ed0: 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65   /* If the table
7ee0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 72   is generated fr
7ef0: 6f 6d 20 61 20 53 45 4c 45 43 54 2c 20 74 68 65  om a SELECT, the
7f00: 6e 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 0a  n construct the.
7f10: 20 20 2a 2a 20 6c 69 73 74 20 6f 66 20 63 6f 6c    ** list of col
7f20: 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 74 65 78  umns and the tex
7f30: 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  t of the table..
7f40: 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c 65    */.  if( pSele
7f50: 63 74 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  ct ){.    Table 
7f60: 2a 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74  *pSelTab = sqlit
7f70: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
7f80: 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ect(pParse, 0, p
7f90: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28  Select);.    if(
7fa0: 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65   pSelTab==0 ) re
7fb0: 74 75 72 6e 3b 0a 20 20 20 20 61 73 73 65 72 74  turn;.    assert
7fc0: 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ( p->aCol==0 );.
7fd0: 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53      p->nCol = pS
7fe0: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
7ff0: 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54   p->aCol = pSelT
8000: 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53  ab->aCol;.    pS
8010: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
8020: 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43  .    pSelTab->aC
8030: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ol = 0;.    sqli
8040: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30  te3DeleteTable(0
8050: 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 7d 0a  , pSelTab);.  }.
8060: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d  .  /* If the db-
8070: 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20  >init.busy is 1 
8080: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
8090: 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20  reading the SQL 
80a0: 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71  off the.  ** "sq
80b0: 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20  lite_master" or 
80c0: 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73  "sqlite_temp_mas
80d0: 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68  ter" table on th
80e0: 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20  e disk..  ** So 
80f0: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  do not write to 
8100: 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20  the disk again. 
8110: 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f   Extract the roo
8120: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  t page number.  
8130: 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ** for the table
8140: 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e   from the db->in
8150: 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64  it.newTnum field
8160: 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d  .  (The page num
8170: 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  ber.  ** should 
8180: 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68  have been put th
8190: 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74  ere by the sqlit
81a0: 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e  eOpenCb routine.
81b0: 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ).  */.  if( db-
81c0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
81d0: 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e    p->tnum = db->
81e0: 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20  init.newTnum;.  
81f0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69  }..  /* If not i
8200: 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65  nitializing, the
8210: 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72  n create a recor
8220: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  d for the new ta
8230: 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ble.  ** in the 
8240: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
8250: 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ble of the datab
8260: 61 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64  ase.  The record
8270: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72   number.  ** for
8280: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65   the new table e
8290: 6e 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65  ntry should alre
82a0: 61 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74  ady be on the st
82b0: 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ack..  **.  ** I
82c0: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
82d0: 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69  ORARY table, wri
82e0: 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74  te the entry int
82f0: 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a  o the auxiliary.
8300: 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61    ** file instea
8310: 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61  d of into the ma
8320: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
8330: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
8340: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
8350: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64     int n;.    Vd
8360: 62 65 20 2a 76 3b 0a 0a 20 20 20 20 76 20 3d 20  be *v;..    v = 
8370: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
8380: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
8390: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
83a0: 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63     if( p->pSelec
83b0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t==0 ){.      /*
83c0: 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65   A regular table
83d0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
83e0: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43  3VdbeOp3(v, OP_C
83f0: 72 65 61 74 65 54 61 62 6c 65 2c 20 30 2c 20 70  reateTable, 0, p
8400: 2d 3e 69 44 62 2c 20 28 63 68 61 72 2a 29 26 70  ->iDb, (char*)&p
8410: 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54  ->tnum, P3_POINT
8420: 45 52 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ER);.    }else{.
8430: 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20        /* A view 
8440: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
8450: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8460: 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a  Integer, 0, 0);.
8470: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e 75      }.    p->tnu
8480: 6d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  m = 0;.    sqlit
8490: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
84a0: 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20  P_Pull, 1, 0);. 
84b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
84c0: 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  3(v, OP_String, 
84d0: 30 2c 20 30 2c 20 70 2d 3e 70 53 65 6c 65 63 74  0, 0, p->pSelect
84e0: 3d 3d 30 3f 22 74 61 62 6c 65 22 3a 22 76 69 65  ==0?"table":"vie
84f0: 77 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  w", P3_STATIC);.
8500: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
8510: 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  p3(v, OP_String,
8520: 20 30 2c 20 30 2c 20 70 2d 3e 7a 4e 61 6d 65 2c   0, 0, p->zName,
8530: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
8540: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74  VdbeOp3(v, OP_St
8550: 72 69 6e 67 2c 20 30 2c 20 30 2c 20 70 2d 3e 7a  ring, 0, 0, p->z
8560: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  Name, 0);.    sq
8570: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
8580: 2c 20 4f 50 5f 44 75 70 2c 20 34 2c 20 30 29 3b  , OP_Dup, 4, 0);
8590: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
85a0: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
85b0: 7a 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53  z = createTableS
85c0: 74 6d 74 28 70 29 3b 0a 20 20 20 20 20 20 6e 20  tmt(p);.      n 
85d0: 3d 20 7a 20 3f 20 73 74 72 6c 65 6e 28 7a 29 20  = z ? strlen(z) 
85e0: 3a 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  : 0;.      sqlit
85f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
8600: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
8610: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8620: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
8630: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73  , z, n);.      s
8640: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
8650: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
8660: 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b  f( p->pSelect ){
8670: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8680: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74  VdbeOp3(v, OP_St
8690: 72 69 6e 67 2c 20 30 2c 20 30 2c 20 22 43 52 45  ring, 0, 0, "CRE
86a0: 41 54 45 20 56 49 45 57 20 22 2c 20 50 33 5f 53  ATE VIEW ", P3_S
86b0: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 65  TATIC);.      }e
86c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
86d0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
86e0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20  P_String, 0, 0, 
86f0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 2c  "CREATE TABLE ",
8700: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
8710: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
8720: 74 28 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20  t( pEnd!=0 );.  
8730: 20 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e      n = Addr(pEn
8740: 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 50 61  d->z) - Addr(pPa
8750: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
8760: 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71  z) + 1;.      sq
8770: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
8780: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
8790: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
87a0: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
87b0: 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61   -1, pParse->sNa
87c0: 6d 65 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a 20  meToken.z, n);. 
87d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
87e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 63  AddOp(v, OP_Conc
87f0: 61 74 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 7d  at, 2, 0);.    }
8800: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8810: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
8820: 63 6f 72 64 2c 20 35 2c 20 30 2c 20 22 74 74 74  cord, 5, 0, "ttt
8830: 69 74 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  it", P3_STATIC);
8840: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8850: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49  AddOp(v, OP_PutI
8860: 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20  ntKey, 0, 0);.  
8870: 20 20 69 66 28 20 21 70 2d 3e 69 44 62 20 29 7b    if( !p->iDb ){
8880: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
8890: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
88a0: 2c 20 70 2d 3e 69 44 62 29 3b 0a 20 20 20 20 7d  , p->iDb);.    }
88b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
88c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
88d0: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  e, 0, 0);.    if
88e0: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
88f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8900: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
8910: 72 2c 20 70 2d 3e 69 44 62 2c 20 30 29 3b 0a 20  r, p->iDb, 0);. 
8920: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8930: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
8940: 57 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20  Write, 1, 0);.  
8950: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
8960: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 2;.      sqli
8970: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
8980: 2c 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54  , pSelect, SRT_T
8990: 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30  able, 1, 0, 0, 0
89a0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
89b0: 73 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f  sqlite3EndWriteO
89c0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
89d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
89e0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65  the table to the
89f0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
8a00: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
8a10: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
8a20: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
8a30: 70 6c 61 69 6e 3d 3d 30 20 26 26 20 70 50 61 72  plain==0 && pPar
8a40: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
8a50: 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a     Table *pOld;.
8a60: 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b      FKey *pFKey;
8a70: 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  .    pOld = sqli
8a80: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64  te3HashInsert(&d
8a90: 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 74  b->aDb[p->iDb].t
8aa0: 62 6c 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20  blHash, .       
8ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ac0: 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73       p->zName, s
8ad0: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
8ae0: 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  1, p);.    if( p
8af0: 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
8b00: 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
8b10: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
8b20: 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
8b30: 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
8b40: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  */.      return;
8b50: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
8b60: 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70  FKey=p->pFKey; p
8b70: 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65  FKey; pFKey=pFKe
8b80: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20  y->pNextFrom){. 
8b90: 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73       int nTo = s
8ba0: 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f  trlen(pFKey->zTo
8bb0: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 4b  ) + 1;.      pFK
8bc0: 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71  ey->pNextTo = sq
8bd0: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
8be0: 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61  b->aDb[p->iDb].a
8bf0: 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f  FKey, pFKey->zTo
8c00: 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73 71  , nTo);.      sq
8c10: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
8c20: 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d  &db->aDb[p->iDb]
8c30: 2e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a  .aFKey, pFKey->z
8c40: 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b  To, nTo, pFKey);
8c50: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
8c60: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30  e->pNewTable = 0
8c70: 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65  ;.    db->nTable
8c80: 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  ++;.    db->flag
8c90: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
8ca0: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d  rnChanges;.  }.}
8cb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  ../*.** The pars
8cc0: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
8cd0: 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74  utine in order t
8ce0: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56  o create a new V
8cf0: 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  IEW.*/.void sqli
8d00: 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20  te3CreateView(. 
8d10: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
8d20: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
8d30: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
8d40: 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20  Token *pBegin,  
8d50: 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
8d60: 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
8d70: 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ns the statement
8d80: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
8d90: 6d 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  me,      /* The 
8da0: 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
8db0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
8dc0: 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63   view */.  Selec
8dd0: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a  t *pSelect,   /*
8de0: 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   A SELECT statem
8df0: 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ent that will be
8e00: 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65  come the new vie
8e10: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
8e20: 70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55  p         /* TRU
8e30: 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52  E for a TEMPORAR
8e40: 59 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54  Y view */.){.  T
8e50: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  able *p;.  int n
8e60: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
8e70: 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b  z;.  Token sEnd;
8e80: 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b  .  DbFixer sFix;
8e90: 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  ..  sqlite3Start
8ea0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 42  Table(pParse, pB
8eb0: 65 67 69 6e 2c 20 70 4e 61 6d 65 2c 20 30 2c 20  egin, pName, 0, 
8ec0: 69 73 54 65 6d 70 2c 20 31 29 3b 0a 20 20 70 20  isTemp, 1);.  p 
8ed0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
8ee0: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
8ef0: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
8f00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
8f10: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65  lectDelete(pSele
8f20: 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ct);.    return;
8f30: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
8f40: 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
8f50: 20 70 50 61 72 73 65 2c 20 70 2d 3e 69 44 62 2c   pParse, p->iDb,
8f60: 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a   "view", pName).
8f70: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 46 69      && sqlite3Fi
8f80: 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70  xSelect(&sFix, p
8f90: 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20 20  Select).  ){.   
8fa0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
8fb0: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
8fc0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
8fd0: 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79    /* Make a copy
8fe0: 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53   of the entire S
8ff0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
9000: 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
9010: 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73   view..  ** This
9020: 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20   will force all 
9030: 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a  the Expr.token.z
9040: 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79   values to be dy
9050: 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61  namically.  ** a
9060: 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20  llocated rather 
9070: 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68  than point to th
9080: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d  e input string -
9090: 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61   which means tha
90a0: 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c  t.  ** they will
90b0: 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74   persist after t
90c0: 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74  he current sqlit
90d0: 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72  e3_exec() call r
90e0: 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70  eturns..  */.  p
90f0: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
9100: 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 53 65  te3SelectDup(pSe
9110: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  lect);.  sqlite3
9120: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
9130: 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 21 70 50  lect);.  if( !pP
9140: 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  arse->db->init.b
9150: 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  usy ){.    sqlit
9160: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
9170: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b  ames(pParse, p);
9180: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
9190: 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
91a0: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
91b0: 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45  tement.  Make sE
91c0: 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a  nd point to.  **
91d0: 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20   the end..  */. 
91e0: 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e   sEnd = pParse->
91f0: 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66  sLastToken;.  if
9200: 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26  ( sEnd.z[0]!=0 &
9210: 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27  & sEnd.z[0]!=';'
9220: 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b   ){.    sEnd.z +
9230: 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20  = sEnd.n;.  }.  
9240: 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20  sEnd.n = 0;.  n 
9250: 3d 20 28 28 69 6e 74 29 73 45 6e 64 2e 7a 29 20  = ((int)sEnd.z) 
9260: 2d 20 28 69 6e 74 29 70 42 65 67 69 6e 2d 3e 7a  - (int)pBegin->z
9270: 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e  ;.  z = pBegin->
9280: 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  z;.  while( n>0 
9290: 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20  && (z[n-1]==';' 
92a0: 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31  || isspace(z[n-1
92b0: 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  ])) ){ n--; }.  
92c0: 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d  sEnd.z = &z[n-1]
92d0: 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a  ;.  sEnd.n = 1;.
92e0: 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65  .  /* Use sqlite
92f0: 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61  3EndTable() to a
9300: 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74  dd the view to t
9310: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
9320: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
9330: 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72  te3EndTable(pPar
9340: 73 65 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20  se, &sEnd, 0);. 
9350: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
9360: 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
9370: 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20  cture pTable is 
9380: 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20  really a VIEW.  
9390: 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65  Fill in the name
93a0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  s of.** the colu
93b0: 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20  mns of the view 
93c0: 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74  in the pTable st
93d0: 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e  ructure.  Return
93e0: 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
93f0: 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
9400: 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c   error is seen l
9410: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
9420: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
9430: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  >zErrMsg..*/.int
9440: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
9450: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65  olumnNames(Parse
9460: 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
9470: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 45 78 70 72  *pTable){.  Expr
9480: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
9490: 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20  Select *pSel;.  
94a0: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a  Table *pSelTab;.
94b0: 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a    int nErr = 0;.
94c0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
94d0: 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f 73  e );..  /* A pos
94e0: 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73  itive nCol means
94f0: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d   the columns nam
9500: 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77  es for this view
9510: 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64   are.  ** alread
9520: 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20  y known..  */.  
9530: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
9540: 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  >0 ) return 0;..
9550: 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20    /* A negative 
9560: 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61  nCol is a specia
9570: 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67  l marker meaning
9580: 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72   that we are cur
9590: 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69  rently.  ** tryi
95a0: 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ng to compute th
95b0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20  e column names. 
95c0: 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69   If we enter thi
95d0: 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20  s routine with. 
95e0: 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e   ** a negative n
95f0: 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77  Col, it means tw
9600: 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20  o or more views 
9610: 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b  form a loop, lik
9620: 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  e this:.  **.  *
9630: 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
9640: 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20  W one AS SELECT 
9650: 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a  * FROM two;.  **
9660: 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
9670: 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a   two AS SELECT *
9680: 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a   FROM one;.  **.
9690: 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74    ** Actually, t
96a0: 68 69 73 20 65 72 72 6f 72 20 69 73 20 63 61 75  his error is cau
96b0: 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61  ght previously a
96c0: 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  nd so the follow
96d0: 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68  ing test.  ** sh
96e0: 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c  ould always fail
96f0: 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c  .  But we will l
9700: 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65  eave it in place
9710: 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65   just to be safe
9720: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
9730: 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20  ble->nCol<0 ){. 
9740: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
9750: 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
9760: 20 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c   %s is circularl
9770: 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62  y defined", pTab
9780: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  le->zName);.    
9790: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
97a0: 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
97b0: 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
97c0: 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70   we need to comp
97d0: 75 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ute the table na
97e0: 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  mes..  */.  asse
97f0: 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  rt( pTable->pSel
9800: 65 63 74 20 29 3b 20 2f 2a 20 49 66 20 6e 43 6f  ect ); /* If nCo
9810: 6c 3d 3d 30 2c 20 74 68 65 6e 20 70 54 61 62 6c  l==0, then pTabl
9820: 65 20 6d 75 73 74 20 62 65 20 61 20 56 49 45 57  e must be a VIEW
9830: 20 2a 2f 0a 20 20 70 53 65 6c 20 3d 20 70 54 61   */.  pSel = pTa
9840: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20  ble->pSelect;.. 
9850: 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   /* Note that th
9860: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
9870: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
9880: 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64  ct() will expand
9890: 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c   any.  ** "*" el
98a0: 65 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20 6c  ements in this l
98b0: 69 73 74 2e 20 20 42 75 74 20 77 65 20 77 69 6c  ist.  But we wil
98c0: 6c 20 6e 65 65 64 20 74 6f 20 72 65 73 74 6f 72  l need to restor
98d0: 65 20 74 68 65 20 6c 69 73 74 0a 20 20 2a 2a 20  e the list.  ** 
98e0: 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
98f0: 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69  inal configurati
9900: 6f 6e 20 61 66 74 65 72 77 61 72 64 73 2c 20 73  on afterwards, s
9910: 6f 20 77 65 20 73 61 76 65 20 61 20 63 6f 70 79  o we save a copy
9920: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 6f 72 69   of.  ** the ori
9930: 67 69 6e 61 6c 20 69 6e 20 70 45 4c 69 73 74 2e  ginal in pEList.
9940: 0a 20 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  .  */.  pEList =
9950: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20   pSel->pEList;. 
9960: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20   pSel->pEList = 
9970: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
9980: 75 70 28 70 45 4c 69 73 74 29 3b 0a 20 20 69 66  up(pEList);.  if
9990: 28 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3d 3d  ( pSel->pEList==
99a0: 30 20 29 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70  0 ){.    pSel->p
99b0: 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a  EList = pEList;.
99c0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f      return 1;  /
99d0: 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20  * Malloc failed 
99e0: 2a 2f 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d  */.  }.  pTable-
99f0: 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 70 53  >nCol = -1;.  pS
9a00: 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
9a10: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
9a20: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c  (pParse, 0, pSel
9a30: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 54 61 62  );.  if( pSelTab
9a40: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9a50: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20  pTable->aCol==0 
9a60: 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  );.    pTable->n
9a70: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
9a80: 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  Col;.    pTable-
9a90: 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >aCol = pSelTab-
9aa0: 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54  >aCol;.    pSelT
9ab0: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
9ac0: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
9ad0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
9ae0: 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
9af0: 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 44 62 53  SelTab);.    DbS
9b00: 65 74 50 72 6f 70 65 72 74 79 28 70 50 61 72 73  etProperty(pPars
9b10: 65 2d 3e 64 62 2c 20 70 54 61 62 6c 65 2d 3e 69  e->db, pTable->i
9b20: 44 62 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  Db, DB_UnresetVi
9b30: 65 77 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ews);.  }else{. 
9b40: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
9b50: 3d 20 30 3b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b  = 0;.    nErr++;
9b60: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65  .  }.  sqlite3Se
9b70: 6c 65 63 74 55 6e 62 69 6e 64 28 70 53 65 6c 29  lectUnbind(pSel)
9b80: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
9b90: 69 73 74 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e  istDelete(pSel->
9ba0: 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 65 6c 2d  pEList);.  pSel-
9bb0: 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74  >pEList = pEList
9bc0: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  ;.  return nErr;
9bd0: 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61    .}../*.** Clea
9be0: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
9bf0: 65 73 20 66 72 6f 6d 20 74 68 65 20 56 49 45 57  es from the VIEW
9c00: 20 70 54 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54   pTable..**.** T
9c10: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
9c20: 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61  alled whenever a
9c30: 6e 79 20 6f 74 68 65 72 20 74 61 62 6c 65 20 6f  ny other table o
9c40: 72 20 76 69 65 77 20 69 73 20 6d 6f 64 69 66 69  r view is modifi
9c50: 65 64 2e 0a 2a 2a 20 54 68 65 20 76 69 65 77 20  ed..** The view 
9c60: 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73  passed into this
9c70: 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 64   routine might d
9c80: 65 70 65 6e 64 20 64 69 72 65 63 74 6c 79 20 6f  epend directly o
9c90: 72 20 69 6e 64 69 72 65 63 74 6c 79 0a 2a 2a 20  r indirectly.** 
9ca0: 6f 6e 20 74 68 65 20 6d 6f 64 69 66 69 65 64 20  on the modified 
9cb0: 6f 72 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65  or deleted table
9cc0: 20 73 6f 20 77 65 20 6e 65 65 64 20 74 6f 20 63   so we need to c
9cd0: 6c 65 61 72 20 74 68 65 20 6f 6c 64 20 63 6f 6c  lear the old col
9ce0: 75 6d 6e 0a 2a 2a 20 6e 61 6d 65 73 20 73 6f 20  umn.** names so 
9cf0: 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62  that they will b
9d00: 65 20 72 65 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f  e recomputed..*/
9d10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
9d20: 69 74 65 56 69 65 77 52 65 73 65 74 43 6f 6c 75  iteViewResetColu
9d30: 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a 70  mnNames(Table *p
9d40: 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Table){.  int i;
9d50: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
9d60: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
9d70: 65 21 3d 30 20 26 26 20 70 54 61 62 6c 65 2d 3e  e!=0 && pTable->
9d80: 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20  pSelect!=0 );.  
9d90: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(i=0, pCol=pT
9da0: 61 62 6c 65 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54  able->aCol; i<pT
9db0: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c  able->nCol; i++,
9dc0: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 71   pCol++){.    sq
9dd0: 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a  liteFree(pCol->z
9de0: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
9df0: 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 44 66 6c  eFree(pCol->zDfl
9e00: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  t);.    sqliteFr
9e10: 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b  ee(pCol->zType);
9e20: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
9e30: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b  e(pTable->aCol);
9e40: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
9e50: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  = 0;.  pTable->n
9e60: 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Col = 0;.}../*.*
9e70: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  * Clear the colu
9e80: 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76  mn names from ev
9e90: 65 72 79 20 56 49 45 57 20 69 6e 20 64 61 74 61  ery VIEW in data
9ea0: 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61  base idx..*/.sta
9eb0: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56  tic void sqliteV
9ec0: 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69  iewResetAll(sqli
9ed0: 74 65 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29  te *db, int idx)
9ee0: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
9ef0: 0a 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f  .  if( !DbHasPro
9f00: 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
9f10: 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20  B_UnresetViews) 
9f20: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
9f30: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
9f40: 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e  t(&db->aDb[idx].
9f50: 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d 73  tblHash); i; i=s
9f60: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
9f70: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
9f80: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
9f90: 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
9fa0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
9fb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 69 65  .      sqliteVie
9fc0: 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  wResetColumnName
9fd0: 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  s(pTab);.    }. 
9fe0: 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70   }.  DbClearProp
9ff0: 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42  erty(db, idx, DB
a000: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a  _UnresetViews);.
a010: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
a020: 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75 70 20   token, look up 
a030: 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 61  a table with tha
a040: 74 20 6e 61 6d 65 2e 20 20 49 66 20 6e 6f 74 20  t name.  If not 
a050: 66 6f 75 6e 64 2c 20 6c 65 61 76 65 0a 2a 2a 20  found, leave.** 
a060: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 74 68 65  an error for the
a070: 20 70 61 72 73 65 72 20 74 6f 20 66 69 6e 64 20   parser to find 
a080: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
a090: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
a0a0: 65 33 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e  e3TableFromToken
a0b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
a0c0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20  Token *pTok){.  
a0d0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 54  char *zName;.  T
a0e0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 7a 4e  able *pTab;.  zN
a0f0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 54 61 62  ame = sqlite3Tab
a100: 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  leNameFromToken(
a110: 70 54 6f 6b 29 3b 0a 20 20 69 66 28 20 7a 4e 61  pTok);.  if( zNa
a120: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  me==0 ) return 0
a130: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
a140: 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
a150: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  se->db, zName, 0
a160: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
a170: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54  zName);.  if( pT
a180: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ab==0 ){.    sql
a190: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
a1a0: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
a1b0: 62 6c 65 3a 20 25 54 22 2c 20 70 54 6f 6b 29 3b  ble: %T", pTok);
a1c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54  .  }.  return pT
a1d0: 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ab;.}../*.** Thi
a1e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
a1f0: 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  led to do the wo
a200: 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42  rk of a DROP TAB
a210: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
a220: 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61   pName is the na
a230: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
a240: 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a  to be dropped..*
a250: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
a260: 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
a270: 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
a280: 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65  pName, int isVie
a290: 77 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  w){.  Table *pTa
a2a0: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
a2b0: 69 6e 74 20 62 61 73 65 3b 0a 20 20 73 71 6c 69  int base;.  sqli
a2c0: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
a2d0: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
a2e0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
a2f0: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
a300: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67  alloc_failed ) g
a310: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
a320: 62 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ble;.  assert( p
a330: 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
a340: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
a350: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
a360: 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  rse, pName->a[0]
a370: 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
a380: 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
a390: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
a3a0: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
a3b0: 74 61 62 6c 65 3b 0a 20 20 69 44 62 20 3d 20 70  table;.  iDb = p
a3c0: 54 61 62 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65  Tab->iDb;.  asse
a3d0: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
a3e0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 23 69 66  b<db->nDb );.#if
a3f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a400: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
a410: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b   {.    int code;
a420: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
a430: 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
a440: 41 42 4c 45 28 70 54 61 62 2d 3e 69 44 62 29 3b  ABLE(pTab->iDb);
a450: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
a460: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70  *zDb = db->aDb[p
a470: 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b  Tab->iDb].zName;
a480: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
a490: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
a4a0: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
a4b0: 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b   zTab, 0, zDb)){
a4c0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
a4d0: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
a4e0: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
a4f0: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  w ){.      if( i
a500: 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
a510: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
a520: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20  ROP_TEMP_VIEW;. 
a530: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a540: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
a550: 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20  E_DROP_VIEW;.   
a560: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
a570: 20 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31        if( iDb==1
a580: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
a590: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
a5a0: 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
a5b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a5c0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
a5d0: 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  OP_TABLE;.      
a5e0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
a5f0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
a600: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
a610: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a  Tab->zName, 0, z
a620: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
a630: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
a640: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
a650: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
a660: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
a670: 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a  _DELETE, pTab->z
a680: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
a690: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
a6a0: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
a6b0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
a6c0: 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e  if( pTab->readOn
a6d0: 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ly ){.    sqlite
a6e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a6f0: 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
a700: 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
a710: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
a720: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
a730: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  +;.    goto exit
a740: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
a750: 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26  .  if( isView &&
a760: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
a770: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
a780: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
a790: 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45   "use DROP TABLE
a7a0: 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65   to delete table
a7b0: 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
a7c0: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
a7d0: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
a7e0: 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20  }.  if( !isView 
a7f0: 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
a800: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
a810: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
a820: 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20 74  "use DROP VIEW t
a830: 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25 73  o delete view %s
a840: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
a850: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
a860: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a  rop_table;.  }..
a870: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
a880: 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
a890: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
a8a0: 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a  master table.  *
a8b0: 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  * on disk..  */.
a8c0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
a8d0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
a8e0: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61  if( v ){.    sta
a8f0: 74 69 63 20 56 64 62 65 4f 70 4c 69 73 74 20 64  tic VdbeOpList d
a900: 72 6f 70 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20  ropTable[] = {. 
a910: 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64       { OP_Rewind
a920: 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28 31 30  ,     0, ADDR(10
a930: 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ), 0},.      { O
a940: 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c  P_String,     0,
a950: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   0,        0}, /
a960: 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 1 */.      { O
a970: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c  P_MemStore,   1,
a980: 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   1,        0},. 
a990: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61       { OP_MemLoa
a9a0: 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  d,    1, 0,     
a9b0: 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20     0}, /* 3 */. 
a9c0: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
a9d0: 2c 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20  ,     0, 2,     
a9e0: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
a9f0: 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 30 2c  P_Ne,         0,
aa00: 20 41 44 44 52 28 39 29 2c 20 20 30 7d 2c 0a 20   ADDR(9),  0},. 
aa10: 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65       { OP_Delete
aa20: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
aa30: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
aa40: 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c  P_Rewind,     0,
aa50: 20 41 44 44 52 28 31 30 29 2c 20 30 7d 2c 0a 20   ADDR(10), 0},. 
aa60: 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20       { OP_Goto, 
aa70: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 33 29        0, ADDR(3)
aa80: 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ,  0},.      { O
aa90: 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c  P_Next,       0,
aaa0: 20 41 44 44 52 28 33 29 2c 20 20 30 7d 2c 20 2f   ADDR(3),  0}, /
aab0: 2a 20 39 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  * 9 */.    };.  
aac0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
aad0: 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69     Trigger *pTri
aae0: 67 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  gger;.    sqlite
aaf0: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
ab00: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
ab10: 70 54 61 62 2d 3e 69 44 62 29 3b 0a 0a 20 20 20  pTab->iDb);..   
ab20: 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69   /* Drop all tri
ab30: 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64  ggers associated
ab40: 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
ab50: 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 2a 2f  being dropped */
ab60: 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20  .    pTrigger = 
ab70: 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a  pTab->pTrigger;.
ab80: 20 20 20 20 77 68 69 6c 65 28 20 70 54 72 69 67      while( pTrig
ab90: 67 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ger ){.      ass
aba0: 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 69  ert( pTrigger->i
abb0: 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 7c 7c  Db==pTab->iDb ||
abc0: 20 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d   pTrigger->iDb==
abd0: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
abe0: 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72  e3DropTriggerPtr
abf0: 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
ac00: 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  r, 1);.      if(
ac10: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
ac20: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 69   ){.        pTri
ac30: 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d  gger = pTrigger-
ac40: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65  >pNext;.      }e
ac50: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 72  lse{.        pTr
ac60: 69 67 67 65 72 20 3d 20 70 54 61 62 2d 3e 70 54  igger = pTab->pT
ac70: 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20 7d 0a  rigger;.      }.
ac80: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72      }..    /* Dr
ac90: 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41  op all SQLITE_MA
aca0: 53 54 45 52 20 65 6e 74 72 69 65 73 20 74 68 61  STER entries tha
acb0: 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 74  t refer to the t
acc0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  able */.    sqli
acd0: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
ace0: 6c 65 28 76 2c 20 70 54 61 62 2d 3e 69 44 62 29  le(v, pTab->iDb)
acf0: 3b 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c  ;.    base = sql
ad00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
ad10: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64  t(v, ArraySize(d
ad20: 72 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54  ropTable), dropT
ad30: 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  able);.    sqlit
ad40: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
ad50: 2c 20 62 61 73 65 2b 31 2c 20 70 54 61 62 2d 3e  , base+1, pTab->
ad60: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 0a 20 20 20 20  zName, 0);..    
ad70: 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49  /* Drop all SQLI
ad80: 54 45 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20 65  TE_TEMP_MASTER e
ad90: 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65  ntries that refe
ada0: 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a  r to the table *
adb0: 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  /.    if( pTab->
adc0: 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb!=1 ){.      
add0: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
ade0: 72 54 61 62 6c 65 28 76 2c 20 31 29 3b 0a 20 20  rTable(v, 1);.  
adf0: 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74      base = sqlit
ae00: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
ae10: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f  v, ArraySize(dro
ae20: 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54 61 62  pTable), dropTab
ae30: 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  le);.      sqlit
ae40: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
ae50: 2c 20 62 61 73 65 2b 31 2c 20 70 54 61 62 2d 3e  , base+1, pTab->
ae60: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d  zName, 0);.    }
ae70: 0a 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ..    if( pTab->
ae80: 69 44 62 21 3d 31 20 29 7b 20 20 2f 2a 20 54 65  iDb!=1 ){  /* Te
ae90: 6d 70 20 64 61 74 61 62 61 73 65 20 68 61 73 20  mp database has 
aea0: 6e 6f 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  no schema cookie
aeb0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
aec0: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  3ChangeCookie(db
aed0: 2c 20 76 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b  , v, pTab->iDb);
aee0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
aef0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
af00: 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
af10: 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20      if( !isView 
af20: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
af30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
af40: 44 65 73 74 72 6f 79 2c 20 70 54 61 62 2d 3e 74  Destroy, pTab->t
af50: 6e 75 6d 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b  num, pTab->iDb);
af60: 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d  .      for(pIdx=
af70: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
af80: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
af90: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 73  Next){.        s
afa0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
afb0: 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70  v, OP_Destroy, p
afc0: 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 49 64 78 2d  Idx->tnum, pIdx-
afd0: 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  >iDb);.      }. 
afe0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
aff0: 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
b000: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a  n(pParse);.  }..
b010: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
b020: 69 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 63 72 69  in-memory descri
b030: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62  ption of the tab
b040: 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  le..  **.  ** Ex
b050: 63 65 70 74 69 6f 6e 3a 20 69 66 20 74 68 65 20  ception: if the 
b060: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65  SQL statement be
b070: 67 61 6e 20 77 69 74 68 20 74 68 65 20 45 58 50  gan with the EXP
b080: 4c 41 49 4e 20 6b 65 79 77 6f 72 64 2c 0a 20 20  LAIN keyword,.  
b090: 2a 2a 20 74 68 65 6e 20 6e 6f 20 63 68 61 6e 67  ** then no chang
b0a0: 65 73 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 64  es should be mad
b0b0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  e..  */.  if( !p
b0c0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
b0d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69  {.    sqliteUnli
b0e0: 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65  nkAndDeleteTable
b0f0: 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
b100: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
b110: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
b120: 73 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56  s;.  }.  sqliteV
b130: 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20  iewResetAll(db, 
b140: 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70  iDb);..exit_drop
b150: 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65  _table:.  sqlite
b160: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
b170: 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
b180: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
b190: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
b1a0: 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b   a new foreign k
b1b0: 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a  ey on the table.
b1c0: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  ** currently und
b1d0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
b1e0: 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72    pFromCol deter
b1f0: 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75  mines which colu
b200: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75  mns.** in the cu
b210: 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e  rrent table poin
b220: 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e  t to the foreign
b230: 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43   key.  If pFromC
b240: 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f  ol==0 then.** co
b250: 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f  nnect the key to
b260: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
b270: 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20   inserted.  pTo 
b280: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a  is the name of.*
b290: 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65  * the table refe
b2a0: 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c  rred to.  pToCol
b2b0: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 61   is a list of ta
b2c0: 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68 65  bles in the othe
b2d0: 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20 74  r.** pTo table t
b2e0: 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20  hat the foreign 
b2f0: 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  key points to.  
b300: 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61  flags contains a
b310: 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
b320: 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66  n about the conf
b330: 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
b340: 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69  algorithms speci
b350: 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  fied.** in the O
b360: 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44  N DELETE, ON UPD
b370: 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52  ATE and ON INSER
b380: 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  T clauses..**.**
b390: 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75   An FKey structu
b3a0: 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  re is created an
b3b0: 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  d added to the t
b3c0: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a  able currently.*
b3d0: 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  * under construc
b3e0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72  tion in the pPar
b3f0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69  se->pNewTable fi
b400: 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20 46 4b  eld.  The new FK
b410: 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e  ey.** is not lin
b420: 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b  ked into db->aFK
b430: 65 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ey at this point
b440: 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74   - that does not
b450: 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c   happen.** until
b460: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
b470: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ()..**.** The fo
b480: 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74  reign key is set
b490: 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70   for IMMEDIATE p
b4a0: 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75  rocessing.  A su
b4b0: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a  bsequent call.**
b4c0: 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72   to sqlite3Defer
b4d0: 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67  ForeignKey() mig
b4e0: 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74  ht change this t
b4f0: 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76  o DEFERRED..*/.v
b500: 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
b510: 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50  eForeignKey(.  P
b520: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
b530: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
b540: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 64 4c 69  ontext */.  IdLi
b550: 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 20  st *pFromCol,   
b560: 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
b570: 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70  his table that p
b580: 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61  oint to other ta
b590: 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
b5a0: 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  pTo,          /*
b5b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68   Name of the oth
b5c0: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 64  er table */.  Id
b5d0: 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20  List *pToCol,   
b5e0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e     /* Columns in
b5f0: 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
b600: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
b610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
b620: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
b630: 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f  n algorithms. */
b640: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d  .){.  Table *p =
b650: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
b660: 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  le;.  int nByte;
b670: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
b680: 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nCol;.  char *z;
b690: 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d  .  FKey *pFKey =
b6a0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
b6b0: 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
b6c0: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
b6d0: 45 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  Err ) goto fk_en
b6e0: 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  d;.  if( pFromCo
b6f0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  l==0 ){.    int 
b700: 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  iCol = p->nCol-1
b710: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  ;.    if( iCol<0
b720: 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
b730: 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26      if( pToCol &
b740: 26 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 31  & pToCol->nId!=1
b750: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b760: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
b770: 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  , "foreign key o
b780: 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22  n %s".         "
b790: 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63   should referenc
b7a0: 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d  e only one colum
b7b0: 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a  n of table %T",.
b7c0: 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c           p->aCol
b7d0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54  [iCol].zName, pT
b7e0: 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  o);.      goto f
b7f0: 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  k_end;.    }.   
b800: 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c   nCol = 1;.  }el
b810: 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26  se if( pToCol &&
b820: 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 70 46   pToCol->nId!=pF
b830: 72 6f 6d 43 6f 6c 2d 3e 6e 49 64 20 29 7b 0a 20  romCol->nId ){. 
b840: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
b850: 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
b860: 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f     "number of co
b870: 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
b880: 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
b890: 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
b8a0: 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c  f ".        "col
b8b0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
b8c0: 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a  renced table");.
b8d0: 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
b8e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
b8f0: 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  ol = pFromCol->n
b900: 49 64 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20  Id;.  }.  nByte 
b910: 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29  = sizeof(*pFKey)
b920: 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70   + nCol*sizeof(p
b930: 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b  FKey->aCol[0]) +
b940: 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69   pTo->n + 1;.  i
b950: 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
b960: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43   for(i=0; i<pToC
b970: 6f 6c 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  ol->nId; i++){. 
b980: 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74       nByte += st
b990: 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  rlen(pToCol->a[i
b9a0: 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ].zName) + 1;.  
b9b0: 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20    }.  }.  pFKey 
b9c0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
b9d0: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70  nByte );.  if( p
b9e0: 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 66  FKey==0 ) goto f
b9f0: 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d 3e  k_end;.  pFKey->
ba00: 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b  pFrom = p;.  pFK
ba10: 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20  ey->pNextFrom = 
ba20: 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20  p->pFKey;.  z = 
ba30: 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d  (char*)&pFKey[1]
ba40: 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20  ;.  pFKey->aCol 
ba50: 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61  = (struct sColMa
ba60: 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a  p*)z;.  z += siz
ba70: 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d  eof(struct sColM
ba80: 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65  ap)*nCol;.  pFKe
ba90: 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65  y->zTo = z;.  me
baa0: 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20  mcpy(z, pTo->z, 
bab0: 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f  pTo->n);.  z[pTo
bac0: 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d  ->n] = 0;.  z +=
bad0: 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b   pTo->n+1;.  pFK
bae0: 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b  ey->pNextTo = 0;
baf0: 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d  .  pFKey->nCol =
bb00: 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72   nCol;.  if( pFr
bb10: 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
bb20: 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69  pFKey->aCol[0].i
bb30: 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  From = p->nCol-1
bb40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
bb50: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
bb60: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
bb70: 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
bb80: 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  ; j<p->nCol; j++
bb90: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
bba0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d  qlite3StrICmp(p-
bbb0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[j].zName, 
bbc0: 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
bbd0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
bbe0: 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
bbf0: 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a  l[i].iFrom = j;.
bc00: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
bc10: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bc20: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d   }.      if( j>=
bc30: 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  p->nCol ){.     
bc40: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
bc50: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
bc60: 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63        "unknown c
bc70: 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20  olumn \"%s\" in 
bc80: 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
bc90: 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20  nition", .      
bca0: 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b      pFromCol->a[
bcb0: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
bcc0: 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
bcd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
bce0: 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  }.  if( pToCol )
bcf0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
bd00: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
bd10: 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65     int n = strle
bd20: 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  n(pToCol->a[i].z
bd30: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b  Name);.      pFK
bd40: 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c  ey->aCol[i].zCol
bd50: 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63   = z;.      memc
bd60: 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b  py(z, pToCol->a[
bd70: 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20  i].zName, n);.  
bd80: 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20      z[n] = 0;.  
bd90: 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20      z += n+1;.  
bda0: 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d    }.  }.  pFKey-
bdb0: 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b  >isDeferred = 0;
bdc0: 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65  .  pFKey->delete
bdd0: 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30  Conf = flags & 0
bde0: 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70  xff;.  pFKey->up
bdf0: 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67  dateConf = (flag
be00: 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b  s >> 8 ) & 0xff;
be10: 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74  .  pFKey->insert
be20: 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e  Conf = (flags >>
be30: 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20   16 ) & 0xff;.. 
be40: 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72   /* Link the for
be50: 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20  eign key to the 
be60: 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73  table as the las
be70: 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70  t step..  */.  p
be80: 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b  ->pFKey = pFKey;
be90: 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66  .  pFKey = 0;..f
bea0: 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46  k_end:.  sqliteF
beb0: 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 73 71  ree(pFKey);.  sq
bec0: 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
bed0: 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73  e(pFromCol);.  s
bee0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
bef0: 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f  te(pToCol);.}../
bf00: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
bf10: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
bf20: 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d   an INITIALLY IM
bf30: 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49  MEDIATE or INITI
bf40: 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a  ALLY DEFERRED.**
bf50: 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20   clause is seen 
bf60: 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72  as part of a for
bf70: 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
bf80: 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65  ion.  The isDefe
bf90: 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  rred.** paramete
bfa0: 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49  r is 1 for INITI
bfb0: 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e  ALLY DEFERRED an
bfc0: 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  d 0 for INITIALL
bfd0: 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20  Y IMMEDIATE..** 
bfe0: 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  The behavior of 
bff0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
c000: 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67  y created foreig
c010: 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65  n key is adjuste
c020: 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79  d.** accordingly
c030: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
c040: 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
c050: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
c060: 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b  int isDeferred){
c070: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
c080: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20    FKey *pFKey;. 
c090: 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61   if( (pTab = pPa
c0a0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
c0b0: 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70  =0 || (pFKey = p
c0c0: 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29  Tab->pFKey)==0 )
c0d0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79   return;.  pFKey
c0e0: 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 69  ->isDeferred = i
c0f0: 73 44 65 66 65 72 72 65 64 3b 0a 7d 0a 0a 2f 2a  sDeferred;.}../*
c100: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
c110: 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51   index for an SQ
c120: 4c 20 74 61 62 6c 65 2e 20 20 70 49 6e 64 65 78  L table.  pIndex
c130: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
c140: 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e  the index .** an
c150: 64 20 70 54 61 62 6c 65 20 69 73 20 74 68 65 20  d pTable is the 
c160: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
c170: 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
c180: 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77  indexed.  Both w
c190: 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20  ill .** be NULL 
c1a0: 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65  for a primary ke
c1b0: 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68  y or an index th
c1c0: 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f  at is created to
c1d0: 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e   satisfy a.** UN
c1e0: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
c1f0: 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20    If pTable and 
c200: 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c  pIndex are NULL,
c210: 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   use pParse->pNe
c220: 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65  wTable.** as the
c230: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
c240: 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70  exed.  pParse->p
c250: 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61  NewTable is a ta
c260: 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63  ble that is.** c
c270: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
c280: 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20  onstructed by a 
c290: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
c2a0: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  tement..**.** pL
c2b0: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
c2c0: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
c2d0: 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77  ndexed.  pList w
c2e0: 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74  ill be NULL if t
c2f0: 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d  his.** is a prim
c300: 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75  ary key or uniqu
c310: 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e-constraint on 
c320: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
c330: 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20  column added.** 
c340: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
c350: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
c360: 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a  struction.  .*/.
c370: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
c380: 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  teIndex(.  Parse
c390: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 41   *pParse,   /* A
c3a0: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
c3b0: 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20  bout this parse 
c3c0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
c3d0: 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70  e1,   /* First p
c3e0: 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
c3f0: 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
c400: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
c410: 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70  2,   /* Second p
c420: 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
c430: 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
c440: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 62 6c 4e  /.  Token *pTblN
c450: 61 6d 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ame, /* Name of 
c460: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 69 6e 64  the table to ind
c470: 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e  ex. Use pParse->
c480: 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a  pNewTable if 0 *
c490: 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73  /.  IdList *pLis
c4a0: 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  t,   /* A list o
c4b0: 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
c4c0: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
c4d0: 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a   onError,     /*
c4e0: 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67   OE_Abort, OE_Ig
c4f0: 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65  nore, OE_Replace
c500: 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a  , or OE_None */.
c510: 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c    Token *pStart,
c520: 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
c530: 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
c540: 6e 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ns a CREATE TABL
c550: 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  E statement */. 
c560: 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20   Token *pEnd    
c570: 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61    /* The ")" tha
c580: 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45  t closes the CRE
c590: 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
c5a0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ent */.){.  Tabl
c5b0: 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 2f 2a 20  e *pTab = 0; /* 
c5c0: 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  Table to be inde
c5d0: 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  xed */.  Index *
c5e0: 70 49 6e 64 65 78 3b 20 20 20 2f 2a 20 54 68 65  pIndex;   /* The
c5f0: 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65   index to be cre
c600: 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ated */.  char *
c610: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zName = 0;.  int
c620: 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e   i, j;.  Token n
c630: 75 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b  ullId;    /* Fak
c640: 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65  e token for an e
c650: 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a  mpty ID list */.
c660: 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20    DbFixer sFix; 
c670: 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e     /* For assign
c680: 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d  ing database nam
c690: 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a  es to pTable */.
c6a0: 20 20 69 6e 74 20 69 73 54 65 6d 70 3b 20 20 20    int isTemp;   
c6b0: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
c6c0: 20 74 65 6d 70 6f 72 61 72 79 20 69 6e 64 65 78   temporary index
c6d0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64 62   */.  sqlite *db
c6e0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
c6f0: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
c700: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
c710: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
c720: 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  t is being writt
c730: 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  en */.  Token *p
c740: 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 55 6e 71  Name = 0; /* Unq
c750: 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66  ualified name of
c760: 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72   the index to cr
c770: 65 61 74 65 20 2a 2f 0a 0a 2f 2a 0a 20 20 69 66  eate */../*.  if
c780: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
c790: 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  | sqlite3_malloc
c7a0: 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65  _failed ) goto e
c7b0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
c7c0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  ;.  if( db->init
c7d0: 2e 62 75 73 79 20 0a 20 20 20 20 20 26 26 20 73  .busy .     && s
c7e0: 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
c7f0: 46 69 78 2c 20 70 50 61 72 73 65 2c 20 64 62 2d  Fix, pParse, db-
c800: 3e 69 6e 69 74 2e 69 44 62 2c 20 22 69 6e 64 65  >init.iDb, "inde
c810: 78 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20 20  x", pName).     
c820: 26 26 20 73 71 6c 69 74 65 33 46 69 78 53 72 63  && sqlite3FixSrc
c830: 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54 61 62  List(&sFix, pTab
c840: 6c 65 29 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74  le).  ){.    got
c850: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
c860: 64 65 78 3b 0a 20 20 7d 0a 2a 2f 0a 0a 20 20 2f  dex;.  }.*/..  /
c870: 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
c880: 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
c890: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65   be indexed.  Re
c8a0: 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f  turn early if no
c8b0: 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
c8c0: 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
c8d0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 62  ){.    char *zTb
c8e0: 6c 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 55  lName;..    /* U
c8f0: 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20  se the two-part 
c900: 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65  index name to de
c910: 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61  termine the data
c920: 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20  base .    ** to 
c930: 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74  search for the t
c940: 61 62 6c 65 2e 20 49 66 20 6e 6f 20 64 61 74 61  able. If no data
c950: 62 61 73 65 20 6e 61 6d 65 20 69 73 20 73 70 65  base name is spe
c960: 63 69 66 69 65 64 2c 20 0a 20 20 20 20 2a 2a 20  cified, .    ** 
c970: 69 44 62 20 69 73 20 73 65 74 20 74 6f 20 30 2e  iDb is set to 0.
c980: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 65   In this case se
c990: 61 72 63 68 20 62 6f 74 68 20 74 68 65 20 74 65  arch both the te
c9a0: 6d 70 20 61 6e 64 20 6d 61 69 6e 0a 20 20 20 20  mp and main.    
c9b0: 2a 2a 20 64 61 74 61 62 61 73 65 73 20 66 6f 72  ** databases for
c9c0: 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
c9d0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
c9e0: 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70  ert( pName1 && p
c9f0: 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62  Name2 );.    iDb
ca00: 20 3d 20 72 65 73 6f 6c 76 65 53 63 68 65 6d 61   = resolveSchema
ca10: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
ca20: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
ca30: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44  ame);.    if( iD
ca40: 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  b<0 ) goto exit_
ca50: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20  create_index;.. 
ca60: 20 20 20 2f 2a 20 4e 6f 77 20 73 65 61 72 63 68     /* Now search
ca70: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69   for the table i
ca80: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
ca90: 44 62 2e 20 49 66 20 69 44 62 20 69 73 0a 20 20  Db. If iDb is.  
caa0: 20 20 2a 2a 20 7a 65 72 6f 2c 20 74 68 65 6e 20    ** zero, then 
cab0: 73 65 61 72 63 68 20 62 6f 74 68 20 74 68 65 20  search both the 
cac0: 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65 6d 70  "main" and "temp
cad0: 22 20 64 61 74 61 62 61 73 65 73 2e 0a 20 20 20  " databases..   
cae0: 20 2a 2f 0a 20 20 20 20 7a 54 62 6c 4e 61 6d 65   */.    zTblName
caf0: 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4e   = sqlite3TableN
cb00: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 62  ameFromToken(pTb
cb10: 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  lName);.    if( 
cb20: 21 7a 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20  !zTblName ){.   
cb30: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
cb40: 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  +;.      pParse-
cb50: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
cb60: 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  EM;.      goto e
cb70: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
cb80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
cb90: 72 74 28 20 70 4e 61 6d 65 31 21 3d 30 20 29 3b  rt( pName1!=0 );
cba0: 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d 30 20  .    if( iDb==0 
cbb0: 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
cbc0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
cbd0: 28 64 62 2c 20 7a 54 62 6c 4e 61 6d 65 2c 20 22  (db, zTblName, "
cbe0: 74 65 6d 70 22 29 3b 0a 20 20 20 20 7d 0a 20 20  temp");.    }.  
cbf0: 20 20 69 66 28 20 21 70 54 61 62 20 29 7b 0a 20    if( !pTab ){. 
cc00: 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69       pTab = sqli
cc10: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
cc20: 50 61 72 73 65 2c 20 7a 54 62 6c 4e 61 6d 65 2c  Parse, zTblName,
cc30: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
cc40: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
cc50: 73 71 6c 69 74 65 46 72 65 65 28 20 7a 54 62 6c  sqliteFree( zTbl
cc60: 4e 61 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20  Name );.    if( 
cc70: 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69  !pTab ) goto exi
cc80: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
cc90: 20 20 20 20 69 44 62 20 3d 20 70 54 61 62 2d 3e      iDb = pTab->
cca0: 69 44 62 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  iDb;.  }else{.  
ccb0: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d    assert( pName=
ccc0: 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d  =0 );.    pTab =
ccd0: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
cce0: 62 6c 65 3b 0a 20 20 20 20 69 44 62 20 3d 20 70  ble;.    iDb = p
ccf0: 54 61 62 2d 3e 69 44 62 3b 0a 20 20 7d 0a 0a 20  Tab->iDb;.  }.. 
cd00: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20   if( pTab==0 || 
cd10: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67  pParse->nErr ) g
cd20: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
cd30: 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61  index;.  if( pTa
cd40: 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  b->readOnly ){. 
cd50: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
cd60: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
cd70: 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
cd80: 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e  indexed", pTab->
cd90: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
cda0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
cdb0: 65 78 3b 0a 20 20 7d 0a 2f 2a 0a 20 20 69 66 28  ex;.  }./*.  if(
cdc0: 20 70 54 61 62 2d 3e 69 44 62 3e 3d 32 20 26 26   pTab->iDb>=2 &&
cdd0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
cde0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
cdf0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
ce00: 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
ce10: 6f 74 20 68 61 76 65 20 69 6e 64 69 63 65 73 20  ot have indices 
ce20: 61 64 64 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  added", pTab->zN
ce30: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
ce40: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
ce50: 3b 0a 20 20 7d 0a 2a 2f 0a 20 20 69 66 28 20 70  ;.  }.*/.  if( p
ce60: 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
ce70: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ce80: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65  Msg(pParse, "vie
ce90: 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  ws may not be in
cea0: 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74  dexed");.    got
ceb0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
cec0: 64 65 78 3b 0a 20 20 7d 0a 20 20 69 73 54 65 6d  dex;.  }.  isTem
ced0: 70 20 3d 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31  p = pTab->iDb==1
cee0: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  ;..  /*.  ** Fin
cef0: 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  d the name of th
cf00: 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73  e index.  Make s
cf10: 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74  ure there is not
cf20: 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72   already another
cf30: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
cf40: 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61  able with the sa
cf50: 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a  me name.  .  **.
cf60: 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20    ** Exception: 
cf70: 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69   If we are readi
cf80: 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ng the names of 
cf90: 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65  permanent indice
cfa0: 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  s from the.  ** 
cfb0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
cfc0: 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d  ble (because som
cfd0: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
cfe0: 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65  changed the sche
cff0: 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65  ma) and.  ** one
d000: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61   of the index na
d010: 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74  mes collides wit
d020: 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  h the name of a 
d030: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
d040: 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74  or.  ** index, t
d050: 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74  hen we will cont
d060: 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20  inue to process 
d070: 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a  this index..  **
d080: 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d  .  ** If pName==
d090: 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  0 it means that 
d0a0: 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c  we are.  ** deal
d0b0: 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61  ing with a prima
d0c0: 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45  ry key or UNIQUE
d0d0: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65   constraint.  We
d0e0: 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20   have to invent 
d0f0: 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d  our.  ** own nam
d100: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e  e..  */.  if( pN
d110: 61 6d 65 20 26 26 20 21 64 62 2d 3e 69 6e 69 74  ame && !db->init
d120: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64  .busy ){.    Ind
d130: 65 78 20 2a 70 49 53 61 6d 65 4e 61 6d 65 3b 20  ex *pISameName; 
d140: 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 69 6e     /* Another in
d150: 64 65 78 20 77 69 74 68 20 74 68 65 20 73 61 6d  dex with the sam
d160: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54 61  e name */.    Ta
d170: 62 6c 65 20 2a 70 54 53 61 6d 65 4e 61 6d 65 3b  ble *pTSameName;
d180: 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 77      /* A table w
d190: 69 74 68 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  ith same name as
d1a0: 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
d1b0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
d1c0: 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a  StrNDup(pName->z
d1d0: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  , pName->n);.   
d1e0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
d1f0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
d200: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
d210: 28 70 49 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71  (pISameName = sq
d220: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
d230: 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30  b, zName, 0))!=0
d240: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d250: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d260: 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65  , "index %s alre
d270: 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61  ady exists", zNa
d280: 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  me);.      goto 
d290: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
d2a0: 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
d2b0: 20 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73   (pTSameName = s
d2c0: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
d2d0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d  db, zName, 0))!=
d2e0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
d2f0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
d300: 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
d310: 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d  eady a table nam
d320: 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
d330: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
d340: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
d350: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
d360: 70 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pName==0 ){.    
d370: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
d380: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e     int n;.    In
d390: 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  dex *pLoop;.    
d3a0: 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e  for(pLoop=pTab->
d3b0: 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f  pIndex, n=1; pLo
d3c0: 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
d3d0: 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20  >pNext, n++){}. 
d3e0: 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
d3f0: 22 25 64 29 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e  "%d)",n);.    zN
d400: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ame = 0;.    sql
d410: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
d420: 4e 61 6d 65 2c 20 22 28 22 2c 20 70 54 61 62 2d  Name, "(", pTab-
d430: 3e 7a 4e 61 6d 65 2c 20 22 20 61 75 74 6f 69 6e  >zName, " autoin
d440: 64 65 78 20 22 2c 20 7a 42 75 66 2c 20 28 63 68  dex ", zBuf, (ch
d450: 61 72 2a 29 30 29 3b 0a 20 20 20 20 69 66 28 20  ar*)0);.    if( 
d460: 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
d470: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
d480: 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  x;.  }else{.    
d490: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
d4a0: 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20  rNDup(pName->z, 
d4b0: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 7d 0a 0a  pName->n);.  }..
d4c0: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61    /* Check for a
d4d0: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
d4e0: 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e  create an index.
d4f0: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
d500: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
d510: 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
d520: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
d530: 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e  = db->aDb[pTab->
d540: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
d550: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
d560: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
d570: 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45  ITE_INSERT, SCHE
d580: 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29  MA_TABLE(isTemp)
d590: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
d5a0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
d5b0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
d5c0: 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f  .    i = SQLITE_
d5d0: 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20  CREATE_INDEX;.  
d5e0: 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 20 69    if( isTemp ) i
d5f0: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
d600: 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
d610: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
d620: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c  Check(pParse, i,
d630: 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e   zName, pTab->zN
d640: 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ame, zDb) ){.   
d650: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
d660: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
d670: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
d680: 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69  * If pList==0, i
d690: 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75  t means this rou
d6a0: 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20  tine was called 
d6b0: 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72  to make a primar
d6c0: 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f  y.  ** key out o
d6d0: 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  f the last colum
d6e0: 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  n added to the t
d6f0: 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
d700: 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f  ruction..  ** So
d710: 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c   create a fake l
d720: 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  ist to simulate 
d730: 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  this..  */.  if(
d740: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
d750: 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62   nullId.z = pTab
d760: 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f  ->aCol[pTab->nCo
d770: 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  l-1].zName;.    
d780: 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65  nullId.n = strle
d790: 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20  n(nullId.z);.   
d7a0: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
d7b0: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  IdListAppend(0, 
d7c0: 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66  &nullId);.    if
d7d0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
d7e0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
d7f0: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a  dex;.  }..  /* .
d800: 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    ** Allocate th
d810: 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
d820: 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65  e. .  */.  pInde
d830: 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  x = sqliteMalloc
d840: 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20  ( sizeof(Index) 
d850: 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20  + strlen(zName) 
d860: 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20  + 1 +.          
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
d880: 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a  izeof(int) + siz
d890: 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29 2a 70  eof(CollSeq*))*p
d8a0: 4c 69 73 74 2d 3e 6e 49 64 20 29 3b 0a 20 20 69  List->nId );.  i
d8b0: 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 20 67  f( pIndex==0 ) g
d8c0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
d8d0: 69 6e 64 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d  index;.  pIndex-
d8e0: 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74  >aiColumn = (int
d8f0: 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  *)&pIndex->keyIn
d900: 66 6f 2e 61 43 6f 6c 6c 5b 70 4c 69 73 74 2d 3e  fo.aColl[pList->
d910: 6e 49 64 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  nId];.  pIndex->
d920: 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  zName = (char*)&
d930: 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
d940: 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b 0a 20 20  [pList->nId];.  
d950: 73 74 72 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a  strcpy(pIndex->z
d960: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Name, zName);.  
d970: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d  pIndex->pTable =
d980: 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d   pTab;.  pIndex-
d990: 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74  >nColumn = pList
d9a0: 2d 3e 6e 49 64 3b 0a 20 20 70 49 6e 64 65 78 2d  ->nId;.  pIndex-
d9b0: 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72  >onError = onErr
d9c0: 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75  or;.  pIndex->au
d9d0: 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d  toIndex = pName=
d9e0: 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44  =0;.  pIndex->iD
d9f0: 62 20 3d 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 53  b = iDb;..  /* S
da00: 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  can the names of
da10: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
da20: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
da30: 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a  indexed and.  **
da40: 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e   load the column
da50: 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68   indices into th
da60: 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  e Index structur
da70: 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72  e.  Report an er
da80: 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  ror.  ** if any 
da90: 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f  column is not fo
daa0: 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  und..  */.  for(
dab0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
dac0: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  d; i++){.    for
dad0: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
dae0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
daf0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
db00: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
db10: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
db20: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [j].zName)==0 ) 
db30: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
db40: 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
db50: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
db60: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
db70: 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
db80: 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s no column name
db90: 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  d %s",.        p
dba0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69 73  Tab->zName, pLis
dbb0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
dbc0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
dbd0: 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  (pIndex);.      
dbe0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
dbf0: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
dc00: 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
dc10: 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 70  mn[i] = j;.    p
dc20: 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
dc30: 43 6f 6c 6c 5b 69 5d 20 3d 20 70 54 61 62 2d 3e  Coll[i] = pTab->
dc40: 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20  aCol[j].pColl;. 
dc50: 20 7d 0a 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79   }.  pIndex->key
dc60: 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 4c  Info.nField = pL
dc70: 69 73 74 2d 3e 6e 49 64 3b 0a 0a 20 20 2f 2a 20  ist->nId;..  /* 
dc80: 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64  Link the new Ind
dc90: 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ex structure to 
dca0: 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f  its table and to
dcb0: 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20   the other.  ** 
dcc0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
dcd0: 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a  se structures. .
dce0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72    */.  if( !pPar
dcf0: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
dd00: 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
dd10: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
dd20: 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b  Insert(&db->aDb[
dd30: 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 69 64 78  pIndex->iDb].idx
dd40: 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20  Hash, .         
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd60: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73  pIndex->zName, s
dd70: 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e  trlen(pIndex->zN
dd80: 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b  ame)+1, pIndex);
dd90: 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
dda0: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
ddb0: 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c  Index );  /* Mal
ddc0: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
ddd0: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71  iled */.      sq
dde0: 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65 78 29  liteFree(pIndex)
ddf0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
de00: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
de10: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c      }.    db->fl
de20: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
de30: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d  ternChanges;.  }
de40: 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69  ..  /* When addi
de50: 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74  ng an index to t
de60: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63  he list of indic
de70: 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20  es for a table, 
de80: 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61  make.  ** sure a
de90: 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c  ll indices label
dea0: 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f  ed OE_Replace co
deb0: 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f  me after all tho
dec0: 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20  se labeled.  ** 
ded0: 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73  OE_Ignore.  This
dee0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
def0: 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70  r the correct op
df00: 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54  eration of UPDAT
df10: 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52  E.  ** and INSER
df20: 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 6e  T..  */.  if( on
df30: 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
df40: 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
df50: 78 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 70  x==0.       || p
df60: 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45  Tab->pIndex->onE
df70: 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
df80: 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  ){.    pIndex->p
df90: 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e  Next = pTab->pIn
dfa0: 64 65 78 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70  dex;.    pTab->p
dfb0: 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
dfc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64    }else{.    Ind
dfd0: 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61  ex *pOther = pTa
dfe0: 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 77  b->pIndex;.    w
dff0: 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e  hile( pOther->pN
e000: 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70  ext && pOther->p
e010: 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  Next->onError!=O
e020: 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20  E_Replace ){.   
e030: 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68     pOther = pOth
e040: 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  er->pNext;.    }
e050: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65  .    pIndex->pNe
e060: 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  xt = pOther->pNe
e070: 78 74 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d 3e  xt;.    pOther->
e080: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a  pNext = pIndex;.
e090: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
e0a0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
e0b0: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
e0c0: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
e0d0: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
e0e0: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
e0f0: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
e100: 73 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77  sk.  So do not w
e110: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
e120: 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78  .  ** again.  Ex
e130: 74 72 61 63 74 20 74 68 65 20 74 61 62 6c 65 20  tract the table 
e140: 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20  number from the 
e150: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
e160: 20 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69   field..  */.  i
e170: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
e180: 20 26 26 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20   && pTblName!=0 
e190: 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74  ){.    pIndex->t
e1a0: 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
e1b0: 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f  ewTnum;.  }..  /
e1c0: 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
e1d0: 74 2e 62 75 73 79 20 69 73 20 30 20 74 68 65 6e  t.busy is 0 then
e1e0: 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65   create the inde
e1f0: 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73  x on disk.  This
e200: 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77  .  ** involves w
e210: 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78  riting the index
e220: 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72   into the master
e230: 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69   table and filli
e240: 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ng in the.  ** i
e250: 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75  ndex with the cu
e260: 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74  rrent table cont
e270: 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ents..  **.  ** 
e280: 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  The db->init.bus
e290: 79 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20  y is 0 when the 
e2a0: 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72  user first enter
e2b0: 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58  s a CREATE INDEX
e2c0: 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20   .  ** command. 
e2d0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
e2e0: 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62  s 1 when a datab
e2f0: 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e  ase is opened an
e300: 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49  d .  ** CREATE I
e310: 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20  NDEX statements 
e320: 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20  are read out of 
e330: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
e340: 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c  .  In.  ** the l
e350: 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69  atter case the i
e360: 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
e370: 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69  sts on disk, whi
e380: 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77  ch is why.  ** w
e390: 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20  e don't want to 
e3a0: 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a  recreate it..  *
e3b0: 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61  *.  ** If pTblNa
e3c0: 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
e3d0: 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e  his index is gen
e3e0: 65 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d  erated as a prim
e3f0: 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20  ary key.  ** or 
e400: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
e410: 74 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41  t of a CREATE TA
e420: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
e430: 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a  Since the table.
e440: 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65    ** has just be
e450: 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63  en created, it c
e460: 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20  ontains no data 
e470: 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e  and the index in
e480: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a  itialization.  *
e490: 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b  * step can be sk
e4a0: 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
e4b0: 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  se if( db->init.
e4c0: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 69  busy==0 ){.    i
e4d0: 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt n;.    Vdbe *
e4e0: 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31 2c  v;.    int lbl1,
e4f0: 20 6c 62 6c 32 3b 0a 20 20 20 20 69 6e 74 20 69   lbl2;.    int i
e500: 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  ;..    v = sqlit
e510: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
e520: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
e530: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
e540: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
e550: 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
e560: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
e570: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
e580: 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
e590: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e5a0: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
e5b0: 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 7d 0a 20  v, iDb);.    }. 
e5c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e5d0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63  dOp(v, OP_NewRec
e5e0: 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  no, 0, 0);.    s
e5f0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
e600: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
e610: 2c 20 22 69 6e 64 65 78 22 2c 20 50 33 5f 53 54  , "index", P3_ST
e620: 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
e630: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
e640: 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20 70 49  String, 0, 0, pI
e650: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  ndex->zName, 0);
e660: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e670: 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op3(v, OP_String
e680: 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  , 0, 0, pTab->zN
e690: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ame, 0);.    sql
e6a0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
e6b0: 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 30  P_CreateIndex, 0
e6c0: 2c 20 69 44 62 2c 28 63 68 61 72 2a 29 26 70 49  , iDb,(char*)&pI
e6d0: 6e 64 65 78 2d 3e 74 6e 75 6d 2c 50 33 5f 50 4f  ndex->tnum,P3_PO
e6e0: 49 4e 54 45 52 29 3b 0a 20 20 20 20 70 49 6e 64  INTER);.    pInd
e6f0: 65 78 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20  ex->tnum = 0;.  
e700: 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29    if( pTblName )
e710: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
e720: 64 62 65 43 6f 64 65 28 76 2c 0a 20 20 20 20 20  dbeCode(v,.     
e730: 20 20 20 20 20 4f 50 5f 44 75 70 2c 20 20 20 20       OP_Dup,    
e740: 20 20 20 30 2c 20 20 20 20 20 20 30 2c 0a 20 20     0,      0,.  
e750: 20 20 20 20 20 20 20 20 4f 50 5f 49 6e 74 65 67          OP_Integ
e760: 65 72 2c 20 20 20 69 44 62 2c 20 20 20 20 30 2c  er,   iDb,    0,
e770: 0a 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 20  .      0);.     
e780: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
e790: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
e7a0: 20 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   1, 0,.         
e7b0: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
e7c0: 72 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49  r*)&pIndex->keyI
e7d0: 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29  nfo, P3_KEYINFO)
e7e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
e7f0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e800: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
e810: 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  ;.    if( pStart
e820: 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20 20   && pEnd ){.    
e830: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
e840: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 43 52  ngeP3(v, -1, "CR
e850: 45 41 54 45 20 49 4e 44 45 58 20 22 2c 20 6e 29  EATE INDEX ", n)
e860: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
e870: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
e880: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
e890: 20 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e      n = Addr(pEn
e8a0: 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 4e 61  d->z) - Addr(pNa
e8b0: 6d 65 2d 3e 7a 29 20 2b 20 31 3b 0a 20 20 20 20  me->z) + 1;.    
e8c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
e8d0: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 4e 61  ngeP3(v, -1, pNa
e8e0: 6d 65 2d 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  me->z, n);.     
e8f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e900: 70 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20  p(v, OP_Concat, 
e910: 32 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  2, 0);.    }.   
e920: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
e930: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
e940: 2c 20 35 2c 20 30 2c 20 22 74 74 74 69 74 22 2c  , 5, 0, "tttit",
e950: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
e960: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e970: 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65  p(v, OP_PutIntKe
e980: 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  y, 0, 0);.    if
e990: 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20  ( pTblName ){.  
e9a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e9b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
e9c0: 65 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20 30  er, pTab->iDb, 0
e9d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e9e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e9f0: 4f 70 65 6e 52 65 61 64 2c 20 32 2c 20 70 54 61  OpenRead, 2, pTa
ea00: 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20  b->tnum);.      
ea10: 2f 2a 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  /* VdbeComment((
ea20: 76 2c 20 22 25 73 22 2c 20 70 54 61 62 2d 3e 7a  v, "%s", pTab->z
ea30: 4e 61 6d 65 29 29 3b 20 2a 2f 0a 20 20 20 20 20  Name)); */.     
ea40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ea50: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
ea60: 6c 75 6d 6e 73 2c 20 32 2c 20 70 54 61 62 2d 3e  lumns, 2, pTab->
ea70: 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 6c 62 6c  nCol);.      lbl
ea80: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
ea90: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
eaa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
eab0: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
eac0: 2c 20 32 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20  , 2, lbl2);.    
ead0: 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 33    lbl1 = sqlite3
eae0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
eaf0: 52 65 63 6e 6f 2c 20 32 2c 20 30 29 3b 0a 20 20  Recno, 2, 0);.  
eb00: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
eb10: 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Index->nColumn; 
eb20: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
eb30: 74 20 69 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d  t iCol = pIndex-
eb40: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
eb50: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
eb60: 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 29 7b 0a 20  iPKey==iCol ){. 
eb70: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
eb80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
eb90: 44 75 70 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20  Dup, i, 0);.    
eba0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ebb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ebc0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
ebd0: 6d 6e 2c 20 32 2c 20 69 43 6f 6c 29 3b 0a 20 20  mn, 2, iCol);.  
ebe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ebf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ec00: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
ec10: 65 49 64 78 4b 65 79 2c 20 70 49 6e 64 65 78 2d  eIdxKey, pIndex-
ec20: 3e 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20  >nColumn, 0);.  
ec30: 20 20 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78      sqlite3Index
ec40: 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70  AffinityStr(v, p
ec50: 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 73 71  Index);.      sq
ec60: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
ec70: 4f 50 5f 49 64 78 50 75 74 2c 20 31 2c 20 70 49  OP_IdxPut, 1, pI
ec80: 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
ec90: 45 5f 4e 6f 6e 65 2c 0a 20 20 20 20 20 20 20 20  E_None,.        
eca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 69                "i
ecb0: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61  ndexed columns a
ecc0: 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20  re not unique", 
ecd0: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
ece0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ecf0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 32  Op(v, OP_Next, 2
ed00: 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 73  , lbl1);.      s
ed10: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
ed20: 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 32 29 3b  eLabel(v, lbl2);
ed30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ed40: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
ed50: 6f 73 65 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  ose, 2, 0);.    
ed60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ed70: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
ed80: 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 0);.    }.   
ed90: 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
eda0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69   ){.      if( !i
edb0: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
edc0: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
edd0: 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29  okie(db, v, iDb)
ede0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
edf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ee00: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
ee10: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
ee20: 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  e3EndWriteOperat
ee30: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ion(pParse);.   
ee40: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65   }.  }..  /* Cle
ee50: 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69  an up before exi
ee60: 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65  ting */.exit_cre
ee70: 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c  ate_index:.  sql
ee80: 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
ee90: 28 70 4c 69 73 74 29 3b 0a 20 20 2f 2a 20 73 71  (pList);.  /* sq
eea0: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
eeb0: 74 65 28 70 54 61 62 6c 65 29 3b 20 2a 2f 0a 20  te(pTable); */. 
eec0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
eed0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
eee0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
eef0: 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e  ine will drop an
ef00: 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20   existing named 
ef10: 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75  index.  This rou
ef20: 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tine.** implemen
ef30: 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45  ts the DROP INDE
ef40: 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  X statement..*/.
ef50: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
ef60: 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
ef70: 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e  rse, SrcList *pN
ef80: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
ef90: 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76  Index;.  Vdbe *v
efa0: 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
efb0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
efc0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
efd0: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
efe0: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
eff0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  rn;.  assert( pN
f000: 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
f010: 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
f020: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
f030: 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
f040: 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
f050: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
f060: 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20   pIndex==0 ){.  
f070: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
f080: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
f090: 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70  ch index: %S", p
f0a0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 67 6f  Name, 0);.    go
f0b0: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
f0c0: 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  ex;.  }.  if( pI
f0d0: 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20  ndex->autoIndex 
f0e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
f0f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
f100: 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
f110: 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20   with UNIQUE ". 
f120: 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59       "or PRIMARY
f130: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
f140: 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  cannot be droppe
f150: 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f  d", 0);.    goto
f160: 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
f170: 3b 0a 20 20 7d 0a 2f 2a 0a 20 20 69 66 28 20 70  ;.  }./*.  if( p
f180: 49 6e 64 65 78 2d 3e 69 44 62 3e 31 20 29 7b 0a  Index->iDb>1 ){.
f190: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
f1a0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
f1b0: 6e 6f 74 20 61 6c 74 65 72 20 73 63 68 65 6d 61  not alter schema
f1c0: 20 6f 66 20 61 74 74 61 63 68 65 64 20 22 0a 20   of attached ". 
f1d0: 20 20 20 20 20 20 22 64 61 74 61 62 61 73 65 73        "databases
f1e0: 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ", 0);.    goto 
f1f0: 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
f200: 0a 20 20 7d 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  .  }.*/.#ifndef 
f210: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
f220: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
f230: 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c    int code = SQL
f240: 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a  ITE_DROP_INDEX;.
f250: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
f260: 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
f270: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
f280: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
f290: 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61  pIndex->iDb].zNa
f2a0: 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
f2b0: 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
f2c0: 41 5f 54 41 42 4c 45 28 70 49 6e 64 65 78 2d 3e  A_TABLE(pIndex->
f2d0: 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71  iDb);.    if( sq
f2e0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
f2f0: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
f300: 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
f310: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
f320: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
f330: 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
f340: 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 29 20 63   pIndex->iDb ) c
f350: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
f360: 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  P_TEMP_INDEX;.  
f370: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
f380: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
f390: 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  ode, pIndex->zNa
f3a0: 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
f3b0: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
f3c0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
f3d0: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dex;.    }.  }.#
f3e0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
f3f0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
f400: 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e  ove the index an
f410: 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  d from the maste
f420: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d  r table */.  v =
f430: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
f440: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
f450: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56   ){.    static V
f460: 64 62 65 4f 70 4c 69 73 74 20 64 72 6f 70 49 6e  dbeOpList dropIn
f470: 64 65 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  dex[] = {.      
f480: 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20  { OP_Rewind,    
f490: 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30 7d 2c   0, ADDR(9), 0},
f4a0: 20 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72   .      { OP_Str
f4b0: 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ing,     0, 0,  
f4c0: 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f       0}, /* 1 */
f4d0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53  .      { OP_MemS
f4e0: 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20  tore,   1, 1,   
f4f0: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
f500: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31  OP_MemLoad,    1
f510: 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f  , 0,       0}, /
f520: 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 3 */.      { O
f530: 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c  P_Column,     0,
f540: 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20   1,       0},.  
f550: 20 20 20 20 7b 20 4f 50 5f 45 71 2c 20 20 20 20      { OP_Eq,    
f560: 20 20 20 20 20 30 2c 20 41 44 44 52 28 38 29 2c       0, ADDR(8),
f570: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
f580: 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41  Next,       0, A
f590: 44 44 52 28 33 29 2c 20 30 7d 2c 0a 20 20 20 20  DDR(3), 0},.    
f5a0: 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20    { OP_Goto,    
f5b0: 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30     0, ADDR(9), 0
f5c0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65  },.      { OP_De
f5d0: 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20  lete,     0, 0, 
f5e0: 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 38 20 2a        0}, /* 8 *
f5f0: 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  /.    };.    int
f600: 20 62 61 73 65 3b 0a 0a 20 20 20 20 73 71 6c 69   base;..    sqli
f610: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
f620: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
f630: 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a  , pIndex->iDb);.
f640: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d      sqlite3OpenM
f650: 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70 49  asterTable(v, pI
f660: 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20  ndex->iDb);.    
f670: 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  base = sqlite3Vd
f680: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
f690: 72 72 61 79 53 69 7a 65 28 64 72 6f 70 49 6e 64  rraySize(dropInd
f6a0: 65 78 29 2c 20 64 72 6f 70 49 6e 64 65 78 29 3b  ex), dropIndex);
f6b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f6c0: 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65  ChangeP3(v, base
f6d0: 2b 31 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  +1, pIndex->zNam
f6e0: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  e, 0);.    if( p
f6f0: 49 6e 64 65 78 2d 3e 69 44 62 21 3d 31 20 29 7b  Index->iDb!=1 ){
f700: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
f710: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
f720: 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a  , pIndex->iDb);.
f730: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
f740: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f750: 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20  _Close, 0, 0);. 
f760: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f770: 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  dOp(v, OP_Destro
f780: 79 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  y, pIndex->tnum,
f790: 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20   pIndex->iDb);. 
f7a0: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 57 72 69     sqlite3EndWri
f7b0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
f7c0: 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  se);.  }..  /* D
f7d0: 65 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  elete the in-mem
f7e0: 6f 72 79 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ory description 
f7f0: 6f 66 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  of this index.. 
f800: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
f810: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
f820: 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41    sqlite3UnlinkA
f830: 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62  ndDeleteIndex(db
f840: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 64  , pIndex);.    d
f850: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
f860: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
f870: 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70  ;.  }..exit_drop
f880: 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65  _index:.  sqlite
f890: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
f8a0: 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
f8b0: 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65  Append a new ele
f8c0: 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65  ment to the give
f8d0: 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74  n IdList.  Creat
f8e0: 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69  e a new IdList i
f8f0: 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a  f.** need be..**
f900: 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74  .** A new IdList
f910: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
f920: 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
f930: 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69  ) fails..*/.IdLi
f940: 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
f950: 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a  tAppend(IdList *
f960: 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
f970: 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69  oken){.  if( pLi
f980: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
f990: 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  st = sqliteMallo
f9a0: 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74  c( sizeof(IdList
f9b0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
f9c0: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
f9d0: 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
f9e0: 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  loc = 0;.  }.  i
f9f0: 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3e 3d 70  f( pList->nId>=p
fa00: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  List->nAlloc ){.
fa10: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
fa20: 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 70  t_item *a;.    p
fa30: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  List->nAlloc = p
fa40: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b  List->nAlloc*2 +
fa50: 20 35 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69   5;.    a = sqli
fa60: 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d  teRealloc(pList-
fa70: 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  >a, pList->nAllo
fa80: 63 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  c*sizeof(pList->
fa90: 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
faa0: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   a==0 ){.      s
fab0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
fac0: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  te(pList);.     
fad0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
fae0: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
faf0: 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  a;.  }.  memset(
fb00: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
fb10: 3e 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >nId], 0, sizeof
fb20: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
fb30: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
fb40: 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20      char **pz = 
fb50: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
fb60: 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >nId].zName;.   
fb70: 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69   sqlite3SetNStri
fb80: 6e 67 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a  ng(pz, pToken->z
fb90: 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b  , pToken->n, 0);
fba0: 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20  .    if( *pz==0 
fbb0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
fbc0: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  IdListDelete(pLi
fbd0: 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
fbe0: 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n 0;.    }else{.
fbf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
fc00: 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d  uote(*pz);.    }
fc10: 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e 49  .  }.  pList->nI
fc20: 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  d++;.  return pL
fc30: 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  ist;.}../*.** Ap
fc40: 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65  pend a new table
fc50: 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76   name to the giv
fc60: 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65  en SrcList.  Cre
fc70: 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73  ate a new SrcLis
fc80: 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
fc90: 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
fca0: 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
fcb0: 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20  SrcList even if 
fcc0: 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a  pToken is NULL..
fcd0: 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c  **.** A new SrcL
fce0: 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
fcf0: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c   or NULL if mall
fd00: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a  oc() fails..**.*
fd10: 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69  * If pDatabase i
fd20: 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d  s not null, it m
fd30: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61  eans that the ta
fd40: 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f  ble has an optio
fd50: 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  nal.** database 
fd60: 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69  name prefix.  Li
fd70: 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62  ke this:  "datab
fd80: 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65  ase.table".  The
fd90: 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f   pDatabase.** po
fda0: 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c  ints to the tabl
fdb0: 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70  e name and the p
fdc0: 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  Table points to 
fdd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
fde0: 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73  e..** The SrcLis
fdf0: 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c  t.a[].zName fiel
fe00: 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  d is filled with
fe10: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
fe20: 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63  which might.** c
fe30: 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20  ome from pTable 
fe40: 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73  (if pDatabase is
fe50: 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70   NULL) or from p
fe60: 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53  Database.  .** S
fe70: 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61  rcList.a[].zData
fe80: 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77  base is filled w
fe90: 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
fea0: 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   name from pTabl
feb0: 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55  e,.** or with NU
fec0: 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73  LL if no databas
fed0: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a  e is specified..
fee0: 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
fef0: 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69  ords, if call li
ff00: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
ff10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
ff20: 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c  cListAppend(A,B,
ff30: 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42  0);.**.** Then B
ff40: 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   is a table name
ff50: 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
ff60: 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63  e name is unspec
ff70: 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65  ified.  If calle
ff80: 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a  d.** like this:.
ff90: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
ffa0: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
ffb0: 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a  nd(A,B,C);.**.**
ffc0: 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74   Then C is the t
ffd0: 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20  able name and B 
ffe0: 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
fff0: 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  name..*/.SrcList
10000 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
10010 41 70 70 65 6e 64 28 53 72 63 4c 69 73 74 20 2a  Append(SrcList *
10020 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
10030 61 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70 44 61  able, Token *pDa
10040 74 61 62 61 73 65 29 7b 0a 20 20 69 66 28 20 70  tabase){.  if( p
10050 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
10060 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  List = sqliteMal
10070 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53 72 63 4c  loc( sizeof(SrcL
10080 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
10090 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
100a0 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  n 0;.    pList->
100b0 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a  nAlloc = 1;.  }.
100c0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 53 72    if( pList->nSr
100d0 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  c>=pList->nAlloc
100e0 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
100f0 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73 74  *pNew;.    pList
10100 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20  ->nAlloc *= 2;. 
10110 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
10120 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a 20  Realloc(pList,. 
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
10140 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20 28  zeof(*pList) + (
10150 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29  pList->nAlloc-1)
10160 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61  *sizeof(pList->a
10170 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
10180 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
10190 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
101a0 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
101b0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
101c0 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20    }.    pList = 
101d0 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  pNew;.  }.  mems
101e0 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69  et(&pList->a[pLi
101f0 73 74 2d 3e 6e 53 72 63 5d 2c 20 30 2c 20 73 69  st->nSrc], 0, si
10200 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
10210 29 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62  ));.  if( pDatab
10220 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65  ase && pDatabase
10230 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  ->z==0 ){.    pD
10240 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
10250 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
10260 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a 20 20   && pTable ){.  
10270 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d    Token *pTemp =
10280 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20   pDatabase;.    
10290 70 44 61 74 61 62 61 73 65 20 3d 20 70 54 61 62  pDatabase = pTab
102a0 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d  le;.    pTable =
102b0 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 69 66   pTemp;.  }.  if
102c0 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
102d0 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69  char **pz = &pLi
102e0 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
102f0 63 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71  c].zName;.    sq
10300 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28  lite3SetNString(
10310 70 7a 2c 20 70 54 61 62 6c 65 2d 3e 7a 2c 20 70  pz, pTable->z, p
10320 54 61 62 6c 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20  Table->n, 0);.  
10330 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a    if( *pz==0 ){.
10340 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
10350 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
10360 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
10370 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
10380 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
10390 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20  te(*pz);.    }. 
103a0 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61   }.  if( pDataba
103b0 73 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  se ){.    char *
103c0 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  *pz = &pList->a[
103d0 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a 44 61  pList->nSrc].zDa
103e0 74 61 62 61 73 65 3b 0a 20 20 20 20 73 71 6c 69  tabase;.    sqli
103f0 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a  te3SetNString(pz
10400 2c 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 2c 20  , pDatabase->z, 
10410 70 44 61 74 61 62 61 73 65 2d 3e 6e 2c 20 30 29  pDatabase->n, 0)
10420 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30  ;.    if( *pz==0
10430 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10440 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
10450 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
10460 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
10470 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
10480 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20  equote(*pz);.   
10490 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e   }.  }.  pList->
104a0 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 69  a[pList->nSrc].i
104b0 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70  Cursor = -1;.  p
104c0 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20  List->nSrc++;.  
104d0 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
104e0 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75  ./*.** Assign cu
104f0 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61 62  rsors to all tab
10500 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74  les in a SrcList
10510 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
10520 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
10530 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  sors(Parse *pPar
10540 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  se, SrcList *pLi
10550 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
10560 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
10570 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
10580 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
10590 5d 2e 69 43 75 72 73 6f 72 3c 30 20 29 7b 0a 20  ].iCursor<0 ){. 
105a0 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d       pList->a[i]
105b0 2e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  .iCursor = pPars
105c0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d  e->nTab++;.    }
105d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
105e0 64 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68  d an alias to th
105f0 65 20 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65  e last identifie
10600 72 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69  r on the given i
10610 64 65 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a  dentifier list..
10620 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
10630 72 63 4c 69 73 74 41 64 64 41 6c 69 61 73 28 53  rcListAddAlias(S
10640 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  rcList *pList, T
10650 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
10660 20 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c   if( pList && pL
10670 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20  ist->nSrc>0 ){. 
10680 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74     int i = pList
10690 2d 3e 6e 53 72 63 20 2d 20 31 3b 0a 20 20 20 20  ->nSrc - 1;.    
106a0 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e  sqlite3SetNStrin
106b0 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  g(&pList->a[i].z
106c0 41 6c 69 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a  Alias, pToken->z
106d0 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b  , pToken->n, 0);
106e0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
106f0 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ote(pList->a[i].
10700 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a  zAlias);.  }.}..
10710 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
10720 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  IdList..*/.void 
10730 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
10740 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  ete(IdList *pLis
10750 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
10760 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
10770 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
10780 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
10790 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ++){.    sqliteF
107a0 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
107b0 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zName);.  }.  sq
107c0 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
107d0 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  a);.  sqliteFree
107e0 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pList);.}../*.*
107f0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
10800 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74  ex in pList of t
10810 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61  he identifier na
10820 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e  med zId.  Return
10830 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f   -1.** if not fo
10840 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
10850 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49  te3IdListIndex(I
10860 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f  dList *pList, co
10870 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
10880 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
10890 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
108a0 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30  rn -1;.  for(i=0
108b0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
108c0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
108d0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
108e0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
108f0 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
10900 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
10910 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
10920 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
10930 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69   SrcList includi
10940 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74  ng all its subst
10950 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64  ructure..*/.void
10960 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
10970 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20 2a 70  elete(SrcList *p
10980 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
10990 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
109a0 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
109b0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  =0; i<pList->nSr
109c0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  c; i++){.    sql
109d0 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
109e0 5b 69 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [i].zDatabase);.
109f0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
10a00 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
10a10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
10a20 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  e(pList->a[i].zA
10a30 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lias);.    if( p
10a40 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20  List->a[i].pTab 
10a50 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  && pList->a[i].p
10a60 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74  Tab->isTransient
10a70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10a80 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  3DeleteTable(0, 
10a90 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  pList->a[i].pTab
10aa0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
10ab0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
10ac0 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  (pList->a[i].pSe
10ad0 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  lect);.    sqlit
10ae0 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 4c 69  e3ExprDelete(pLi
10af0 73 74 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20  st->a[i].pOn);. 
10b00 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
10b10 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b  Delete(pList->a[
10b20 69 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a  i].pUsing);.  }.
10b30 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
10b40 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  st);.}../*.** Be
10b50 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  gin a transactio
10b60 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
10b70 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  3BeginTransactio
10b80 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
10b90 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20   int onError){. 
10ba0 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20   sqlite *db;..  
10bb0 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
10bc0 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
10bd0 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
10be0 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
10bf0 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
10c00 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
10c10 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
10c20 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
10c30 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
10c40 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
10c50 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47  RANSACTION, "BEG
10c60 49 4e 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  IN", 0, 0) ) ret
10c70 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66  urn;.  if( db->f
10c80 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
10c90 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 73 71 6c  Trans ){.    sql
10ca0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
10cb0 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 73 74 61  rse, "cannot sta
10cc0 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
10cd0 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
10ce0 63 74 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74  ction");.    ret
10cf0 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
10d00 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
10d10 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
10d20 20 30 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72   0);.  if( !pPar
10d30 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
10d40 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
10d50 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a  SQLITE_InTrans;.
10d60 20 20 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20      db->onError 
10d70 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 7d  = onError;.  }.}
10d80 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
10d90 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
10da0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d  void sqlite3Comm
10db0 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  itTransaction(Pa
10dc0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
10dd0 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69  sqlite *db;..  i
10de0 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
10df0 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
10e00 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d  =0 || db->aDb[0]
10e10 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
10e20 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
10e30 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f  nErr || sqlite3_
10e40 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
10e50 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71  return;.  if( sq
10e60 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
10e70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
10e80 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d  ANSACTION, "COMM
10e90 49 54 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  IT", 0, 0) ) ret
10ea0 75 72 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e  urn;.  if( (db->
10eb0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
10ec0 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20  nTrans)==0 ){.  
10ed0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10ee0 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
10ef0 74 20 63 6f 6d 6d 69 74 20 2d 20 6e 6f 20 74 72  t commit - no tr
10f00 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
10f10 69 76 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ive");.    retur
10f20 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  n;.  }.  if( !pP
10f30 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
10f40 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  .    db->flags &
10f50 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e  = ~SQLITE_InTran
10f60 73 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  s;.  }.  sqlite3
10f70 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
10f80 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  n(pParse);.  if(
10f90 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
10fa0 6e 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6f 6e 45  n ){.    db->onE
10fb0 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c  rror = OE_Defaul
10fc0 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t;.  }.}../*.** 
10fd0 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  Rollback a trans
10fe0 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
10ff0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72  qlite3RollbackTr
11000 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
11010 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
11020 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  te *db;.  Vdbe *
11030 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  v;..  if( pParse
11040 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
11050 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
11060 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
11070 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
11080 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
11090 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
110a0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
110b0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
110c0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
110d0 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
110e0 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c  , "ROLLBACK", 0,
110f0 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   0) ) return;.  
11100 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
11110 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29   SQLITE_InTrans)
11120 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
11130 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
11140 65 2c 20 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62  e, "cannot rollb
11150 61 63 6b 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63  ack - no transac
11160 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 29  tion is active")
11170 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 0a 20  ;.    return; . 
11180 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
11190 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
111a0 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
111b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
111c0 28 76 2c 20 4f 50 5f 52 6f 6c 6c 62 61 63 6b 2c  (v, OP_Rollback,
111d0 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   0, 0);.  }.  if
111e0 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  ( !pParse->expla
111f0 69 6e 20 29 7b 0a 20 20 20 20 64 62 2d 3e 66 6c  in ){.    db->fl
11200 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
11210 6e 54 72 61 6e 73 3b 0a 20 20 20 20 64 62 2d 3e  nTrans;.    db->
11220 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66  onError = OE_Def
11230 61 75 6c 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ault;.  }.}../*.
11240 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
11250 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
11260 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d  verify the schem
11270 61 20 63 6f 6f 6b 69 65 20 66 6f 72 20 61 6c 6c  a cookie for all
11280 0a 2a 2a 20 6e 61 6d 65 64 20 64 61 74 61 62 61  .** named databa
11290 73 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 76 6f 69  se files..*/.voi
112a0 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  d sqlite3CodeVer
112b0 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20  ifySchema(Parse 
112c0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
112d0 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  ){.  sqlite *db 
112e0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
112f0 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
11300 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
11310 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
11320 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
11330 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  b );.  assert( d
11340 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21  b->aDb[iDb].pBt!
11350 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 44 62 21  =0 );.  if( iDb!
11360 3d 31 20 26 26 20 21 44 62 48 61 73 50 72 6f 70  =1 && !DbHasProp
11370 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42  erty(db, iDb, DB
11380 5f 43 6f 6f 6b 69 65 29 20 29 7b 0a 20 20 20 20  _Cookie) ){.    
11390 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
113a0 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f  (v, OP_VerifyCoo
113b0 6b 69 65 2c 20 69 44 62 2c 20 64 62 2d 3e 61 44  kie, iDb, db->aD
113c0 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f  b[iDb].schema_co
113d0 6f 6b 69 65 29 3b 0a 20 20 20 20 44 62 53 65 74  okie);.    DbSet
113e0 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62  Property(db, iDb
113f0 2c 20 44 42 5f 43 6f 6f 6b 69 65 29 3b 0a 20 20  , DB_Cookie);.  
11400 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
11410 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68  ate VDBE code th
11420 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20  at prepares for 
11430 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69  doing an operati
11440 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74  on that.** might
11450 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61   change the data
11460 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  base..**.** This
11470 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20   routine starts 
11480 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
11490 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  n if we are not 
114a0 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a  already within.*
114b0 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  * a transaction.
114c0 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65    If we are alre
114d0 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61  ady within a tra
114e0 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61  nsaction, then a
114f0 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69   checkpoint.** i
11500 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74  s set if the set
11510 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65  Statement parame
11520 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20  ter is true.  A 
11530 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
11540 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20  d.** be set for 
11550 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20  operations that 
11560 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20  might fail (due 
11570 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29  to a constraint)
11580 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20   part of.** the 
11590 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20  way through and 
115a0 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20  which will need 
115b0 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69  to undo some wri
115c0 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69  tes without havi
115d0 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63  ng to.** rollbac
115e0 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e  k the whole tran
115f0 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70  saction.  For op
11600 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61  erations where a
11610 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a  ll constraints.*
11620 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64  * can be checked
11630 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e   before any chan
11640 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
11650 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74  the database, it
11660 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63   is never.** nec
11670 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61  essary to undo a
11680 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63   write and the c
11690 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
116a0 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a   not be set..**.
116b0 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73 65  ** Only database
116c0 20 69 44 62 20 61 6e 64 20 74 68 65 20 74 65 6d   iDb and the tem
116d0 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d  p database are m
116e0 61 64 65 20 77 72 69 74 61 62 6c 65 20 62 79 20  ade writable by 
116f0 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66  this call..** If
11700 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68   iDb==0, then th
11710 65 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70 20  e main and temp 
11720 64 61 74 61 62 61 73 65 73 20 61 72 65 20 6d 61  databases are ma
11730 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20 49  de writable.   I
11740 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e  f.** iDb==1 then
11750 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20 64   only the temp d
11760 61 74 61 62 61 73 65 20 69 73 20 6d 61 64 65 20  atabase is made 
11770 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69 44  writable.  If iD
11780 62 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  b>1 then the.** 
11790 73 70 65 63 69 66 69 65 64 20 61 75 78 69 6c 69  specified auxili
117a0 61 72 79 20 64 61 74 61 62 61 73 65 20 61 6e 64  ary database and
117b0 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
117c0 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74  se are made writ
117d0 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  able..*/.void sq
117e0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
117f0 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  peration(Parse *
11800 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53  pParse, int setS
11810 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44  tatement, int iD
11820 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  b){.  Vdbe *v;. 
11830 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
11840 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
11850 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
11860 2c 20 69 44 62 2c 20 44 42 5f 4c 6f 63 6b 65 64  , iDb, DB_Locked
11870 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 20  ) ) return;.  v 
11880 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
11890 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
118a0 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
118b0 20 69 66 28 20 21 64 62 2d 3e 61 44 62 5b 69 44   if( !db->aDb[iD
118c0 62 5d 2e 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20  b].inTrans ){.  
118d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
118e0 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  Op(v, OP_Transac
118f0 74 69 6f 6e 2c 20 69 44 62 2c 20 30 29 3b 0a 20  tion, iDb, 0);. 
11900 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79     DbSetProperty
11910 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 4c 6f 63  (db, iDb, DB_Loc
11920 6b 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ked);.    sqlite
11930 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
11940 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
11950 20 20 20 20 69 66 28 20 69 44 62 21 3d 31 20 29      if( iDb!=1 )
11960 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
11970 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
11980 6f 6e 28 70 50 61 72 73 65 2c 20 73 65 74 53 74  on(pParse, setSt
11990 61 74 65 6d 65 6e 74 2c 20 31 29 3b 0a 20 20 20  atement, 1);.   
119a0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73   }.  }else if( s
119b0 65 74 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  etStatement ){. 
119c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
119d0 64 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74 65 6d  dOp(v, OP_Statem
119e0 65 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20  ent, iDb, 0);.  
119f0 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28    DbSetProperty(
11a00 64 62 2c 20 69 44 62 2c 20 44 42 5f 4c 6f 63 6b  db, iDb, DB_Lock
11a10 65 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ed);.  }.}../*.*
11a20 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
11a30 74 68 61 74 20 63 6f 6e 63 6c 75 64 65 73 20 61  that concludes a
11a40 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
11a50 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e 67 65   may have change
11a60 64 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  d.** the databas
11a70 65 2e 20 20 49 66 20 61 20 73 74 61 74 65 6d 65  e.  If a stateme
11a80 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
11a90 61 73 20 73 74 61 72 74 65 64 2c 20 74 68 65 6e  as started, then
11aa0 20 65 6d 69 74 0a 2a 2a 20 61 6e 20 4f 50 5f 43   emit.** an OP_C
11ab0 6f 6d 6d 69 74 20 74 68 61 74 20 77 69 6c 6c 20  ommit that will 
11ac0 63 61 75 73 65 20 74 68 65 20 63 68 61 6e 67 65  cause the change
11ad0 73 20 74 6f 20 62 65 20 63 6f 6d 6d 69 74 74 65  s to be committe
11ae0 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
11af0 20 4e 6f 74 65 20 74 68 61 74 20 63 68 65 63 6b   Note that check
11b00 70 6f 69 6e 74 73 20 61 72 65 20 61 75 74 6f 6d  points are autom
11b10 61 74 69 63 61 6c 6c 79 20 63 6f 6d 6d 69 74 74  atically committ
11b20 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
11b30 0a 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  .** a statement.
11b40 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
11b50 20 74 68 65 72 65 20 63 61 6e 20 62 65 20 6d 75   there can be mu
11b60 6c 74 69 70 6c 65 20 63 61 6c 6c 73 20 74 6f 20  ltiple calls to 
11b70 0a 2a 2a 20 73 71 6c 69 74 65 33 42 65 67 69 6e  .** sqlite3Begin
11b80 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 29  WriteOperation()
11b90 20 62 75 74 20 74 68 65 72 65 20 73 68 6f 75 6c   but there shoul
11ba0 64 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67  d only be a sing
11bb0 6c 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  le.** call to sq
11bc0 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65  lite3EndWriteOpe
11bd0 72 61 74 69 6f 6e 28 29 20 61 74 20 74 68 65 20  ration() at the 
11be0 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68  conclusion of th
11bf0 65 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  e statement..*/.
11c00 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 57  void sqlite3EndW
11c10 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61  riteOperation(Pa
11c20 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
11c30 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
11c40 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
11c50 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  db;.  if( pParse
11c60 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 20 72 65  ->trigStack ) re
11c70 74 75 72 6e 3b 20 2f 2a 20 69 66 20 74 68 69 73  turn; /* if this
11c80 20 69 73 20 69 6e 20 61 20 74 72 69 67 67 65 72   is in a trigger
11c90 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
11ca0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
11cb0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
11cc0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d  eturn;.  if( db-
11cd0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
11ce0 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 2f  InTrans ){.    /
11cf0 2a 20 41 20 42 45 47 49 4e 20 68 61 73 20 65 78  * A BEGIN has ex
11d00 65 63 75 74 65 64 2e 20 20 44 6f 20 6e 6f 74 20  ecuted.  Do not 
11d10 63 6f 6d 6d 69 74 20 75 6e 74 69 6c 20 77 65 20  commit until we 
11d20 73 65 65 20 61 6e 20 65 78 70 6c 69 63 69 74 0a  see an explicit.
11d30 20 20 20 20 2a 2a 20 43 4f 4d 4d 49 54 20 73 74      ** COMMIT st
11d40 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 7d 65  atement. */.  }e
11d50 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
11d60 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11d70 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 20  Commit, 0, 0);. 
11d80 20 7d 0a 7d 0a                                    }.}.