/ Hex Artifact Content
Login

Artifact 83303494ccad0ed1cea24f73c7db1f2669820ccd:


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: 32 30 39 20 32 30 30 34 2f 30 36 2f 30 38 20 30  209 2004/06/08 0
0300: 30 3a 30 32 3a 33 33 20 64 61 6e 69 65 6c 6b 31  0:02:33 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: 23 69 66 20 30 0a 20 20 69 66 28 28 64 62 2d 3e  #if 0.  if((db->
04c0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
04d0: 6e 69 74 69 61 6c 69 7a 65 64 29 3d 3d 30 20 26  nitialized)==0 &
04e0: 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  & db->init.busy=
04f0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  =0 ){.    int rc
0500: 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64   = sqlite3Init(d
0510: 62 2c 20 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  b, &pParse->zErr
0520: 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Msg);.    if( rc
0530: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
0540: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
0550: 3d 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 72  = rc;.      pPar
0560: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
0570: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66  }.  }.#endif.  f
0580: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
0590: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 43  b; i++){.    DbC
05a0: 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c  learProperty(db,
05b0: 20 69 2c 20 44 42 5f 4c 6f 63 6b 65 64 29 3b 0a   i, DB_Locked);.
05c0: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 61 44 62      if( !db->aDb
05d0: 5b 69 5d 2e 69 6e 54 72 61 6e 73 20 29 7b 0a 20  [i].inTrans ){. 
05e0: 20 20 20 20 20 44 62 43 6c 65 61 72 50 72 6f 70       DbClearProp
05f0: 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 43  erty(db, i, DB_C
0600: 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ookie);.    }.  
0610: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  }.  pParse->nVar
0620: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
0630: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0640: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0650: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0660: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0670: 61 72 73 65 64 20 61 6e 64 20 77 65 20 77 61 6e  arsed and we wan
0680: 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  t to execute the
0690: 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 69 6d   VDBE code to im
06a0: 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74  plement .** that
06b0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 50 72 69   statement.  Pri
06c0: 6f 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  or action routin
06d0: 65 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  es should have a
06e0: 6c 72 65 61 64 79 0a 2a 2a 20 63 6f 6e 73 74 72  lready.** constr
06f0: 75 63 74 65 64 20 56 44 42 45 20 63 6f 64 65 20  ucted VDBE code 
0700: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
0710: 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  f the SQL statem
0720: 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ent..** This rou
0730: 74 69 6e 65 20 6a 75 73 74 20 68 61 73 20 74 6f  tine just has to
0740: 20 65 78 65 63 75 74 65 20 74 68 65 20 56 44 42   execute the VDB
0750: 45 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  E code..**.** No
0760: 74 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72  te that if an er
0770: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74  ror occurred, it
0780: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
0790: 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44  se that.** no VD
07a0: 42 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65  BE code was gene
07b0: 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rated..*/.void s
07c0: 71 6c 69 74 65 33 45 78 65 63 28 50 61 72 73 65  qlite3Exec(Parse
07d0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
07e0: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
07f0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
0800: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
0810: 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 26 26 20  ..  if( v==0 && 
0820: 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  (v = sqlite3GetV
0830: 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20  dbe(pParse))!=0 
0840: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
0850: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 48 61  beAddOp(v, OP_Ha
0860: 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  lt, 0, 0);.  }. 
0870: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c   if( sqlite3_mal
0880: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
0890: 75 72 6e 3b 0a 20 20 69 66 28 20 76 20 26 26 20  urn;.  if( v && 
08a0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
08b0: 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74 72 61  ){.    FILE *tra
08c0: 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  ce = (db->flags 
08d0: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61  & SQLITE_VdbeTra
08e0: 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74 20  ce)!=0 ? stdout 
08f0: 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  : 0;.    sqlite3
0900: 56 64 62 65 54 72 61 63 65 28 76 2c 20 74 72 61  VdbeTrace(v, tra
0910: 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ce);.    sqlite3
0920: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76 2c  VdbeMakeReady(v,
0930: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 70   pParse->nVar, p
0940: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29 3b  Parse->explain);
0950: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
0960: 3d 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 3f  = pParse->nErr ?
0970: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a 20   SQLITE_ERROR : 
0980: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
0990: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
09a0: 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  sSet = 0;.  }els
09b0: 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63  e if( pParse->rc
09c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
09d0: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
09e0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
09f0: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  }.  pParse->nTab
0a00: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
0a10: 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72  nMem = 0;.  pPar
0a20: 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20  se->nSet = 0;.  
0a30: 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30  pParse->nAgg = 0
0a40: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  ;.  pParse->nVar
0a50: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c   = 0;.}../*.** L
0a60: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
0a70: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
0a80: 61 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a  at describes .**
0a90: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
0aa0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 67 69 76  tabase table giv
0ab0: 65 6e 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  en the name.** o
0ac0: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
0ad0: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
0ae0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
0af0: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 74 61 69  tabase.** contai
0b00: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
0b10: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
0b20: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
0b30: 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73   If zDatabase is
0b40: 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65   0, all database
0b50: 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66  s are searched f
0b60: 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  or the.** table 
0b70: 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d 61  and the first ma
0b80: 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69 73 20  tching table is 
0b90: 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63  returned.  (No c
0ba0: 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64  hecking.** for d
0bb0: 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65 20 6e  uplicate table n
0bc0: 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20  ames is done.)  
0bd0: 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72  The search order
0be0: 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73   is.** TEMP firs
0bf0: 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68  t, then MAIN, th
0c00: 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79  en any auxiliary
0c10: 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64   databases added
0c20: 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54  .** using the AT
0c30: 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  TACH command..**
0c40: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
0c50: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
0c60: 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  )..*/.Table *sql
0c70: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71  ite3FindTable(sq
0c80: 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73 74 20  lite *db, const 
0c90: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
0ca0: 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61  st char *zDataba
0cb0: 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20  se){.  Table *p 
0cc0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
0cd0: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
0ce0: 52 65 61 64 53 63 68 65 6d 61 28 64 62 29 3b 0a  ReadSchema(db);.
0cf0: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
0d00: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
0d10: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
0d20: 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f   int j = (i<2) ?
0d30: 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53   i^1 : i;   /* S
0d40: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
0d50: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66  e MAIN */.    if
0d60: 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26  ( zDatabase!=0 &
0d70: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
0d80: 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e  (zDatabase, db->
0d90: 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20  aDb[j].zName) ) 
0da0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20  continue;.    p 
0db0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
0dc0: 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62  d(&db->aDb[j].tb
0dd0: 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74  lHash, zName, st
0de0: 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a  rlen(zName)+1);.
0df0: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
0e00: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
0e10: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
0e20: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
0e30: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
0e40: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
0e50: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
0e60: 61 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ase table given 
0e70: 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74  the name.** of t
0e80: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f  hat table and (o
0e90: 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e  ptionally) the n
0ea0: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
0eb0: 61 73 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e  ase.** containin
0ec0: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  g the table.  Re
0ed0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
0ee0: 20 66 6f 75 6e 64 2e 0a 2a 2a 20 41 6c 73 6f 20   found..** Also 
0ef0: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
0f00: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
0f10: 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
0f20: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
0f30: 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
0f40: 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33  tine and sqlite3
0f50: 46 69 6e 64 54 61 62 6c 65 28 29 0a 2a 2a 20 69  FindTable().** i
0f60: 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  s that this rout
0f70: 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72  ine leaves an er
0f80: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
0f90: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 0a 2a  Parse->zErrMsg.*
0fa0: 2a 20 77 68 65 72 65 20 73 71 6c 69 74 65 33 46  * where sqlite3F
0fb0: 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20  indTable() does 
0fc0: 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  not..*/.Table *s
0fd0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
0fe0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
0ff0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1000: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
1010: 7a 44 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  zDbase){.  Table
1020: 20 2a 70 3b 0a 0a 20 20 70 20 3d 20 73 71 6c 69   *p;..  p = sqli
1030: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61  te3FindTable(pPa
1040: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  rse->db, zName, 
1050: 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  zDbase);.  if( p
1060: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  ==0 ){.    if( z
1070: 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73  Dbase ){.      s
1080: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1090: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
10a0: 74 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20 7a  table: %s.%s", z
10b0: 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  Dbase, zName);. 
10c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
10d0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50  ite3FindTable(pP
10e0: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  arse->db, zName,
10f0: 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)!=0 ){.      
1100: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1110: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 5c  pParse, "table \
1120: 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 69 6e 20  "%s\" is not in 
1130: 64 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22 22  database \"%s\""
1140: 2c 0a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  ,.         zName
1150: 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 20 20 7d  , zDbase);.    }
1160: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
1170: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1180: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  se, "no such tab
1190: 6c 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  le: %s", zName);
11a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
11b0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
11c0: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
11d0: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
11e0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a  hat describes .*
11f0: 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  * a particular i
1200: 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e  ndex given the n
1210: 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65  ame of that inde
1220: 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d  x.** and the nam
1230: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1240: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
1250: 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65  the index..** Re
1260: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
1270: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
1280: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
1290: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
12a0: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
12b0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64  the.** table and
12c0: 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
12d0: 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65 74  ing index is ret
12e0: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
12f0: 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c  king.** for dupl
1300: 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65  icate index name
1310: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
1320: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
1330: 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20  .** TEMP first, 
1340: 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20  then MAIN, then 
1350: 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61  any auxiliary da
1360: 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a  tabases added.**
1370: 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43   using the ATTAC
1380: 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e  H command..*/.In
1390: 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  dex *sqlite3Find
13a0: 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62  Index(sqlite *db
13b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
13c0: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
13d0: 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a  *zDb){.  Index *
13e0: 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  p = 0;.  int i;.
13f0: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
1400: 65 33 52 65 61 64 53 63 68 65 6d 61 28 64 62 29  e3ReadSchema(db)
1410: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ;.  for(i=0; rc=
1420: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
1430: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
1440: 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29     int j = (i<2)
1450: 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20   ? i^1 : i;  /* 
1460: 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f  Search TEMP befo
1470: 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69  re MAIN */.    i
1480: 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65  f( zDb && sqlite
1490: 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62  3StrICmp(zDb, db
14a0: 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20  ->aDb[j].zName) 
14b0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
14c0: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  p = sqlite3HashF
14d0: 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e  ind(&db->aDb[j].
14e0: 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  idxHash, zName, 
14f0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29  strlen(zName)+1)
1500: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72  ;.    if( p ) br
1510: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
1520: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n p;.}../*.** Re
1530: 6d 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20 69  move the given i
1540: 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e  ndex from the in
1550: 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c 20  dex hash table, 
1560: 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73 20  and free.** its 
1570: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
1580: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64  s..**.** The ind
1590: 65 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ex is removed fr
15a0: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
15b0: 68 61 73 68 20 74 61 62 6c 65 73 20 62 75 74 0a  hash tables but.
15c0: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c  ** it is not unl
15d0: 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 54  inked from the T
15e0: 61 62 6c 65 20 74 68 61 74 20 69 74 20 69 6e 64  able that it ind
15f0: 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69  exes..** Unlinki
1600: 6e 67 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c  ng from the Tabl
1610: 65 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 62  e must be done b
1620: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
1630: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
1640: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c  c void sqliteDel
1650: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 20  eteIndex(sqlite 
1660: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
1670: 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 0a    Index *pOld;..
1680: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
1690: 26 26 20 70 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29  && p->zName!=0 )
16a0: 3b 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74  ;.  pOld = sqlit
16b0: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  e3HashInsert(&db
16c0: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64  ->aDb[p->iDb].id
16d0: 78 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  xHash, p->zName,
16e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16f0: 20 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 65             strle
1700: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30  n(p->zName)+1, 0
1710: 29 3b 0a 20 20 69 66 28 20 70 4f 6c 64 21 3d 30  );.  if( pOld!=0
1720: 20 26 26 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20   && pOld!=p ){. 
1730: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
1740: 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d  sert(&db->aDb[p-
1750: 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70  >iDb].idxHash, p
1760: 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Old->zName,.    
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1780: 20 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e 7a 4e   strlen(pOld->zN
1790: 61 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b 0a 20  ame)+1, pOld);. 
17a0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6c   }.  if( p->zCol
17b0: 41 66 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Aff ){.    sqlit
17c0: 65 46 72 65 65 28 70 2d 3e 7a 43 6f 6c 41 66 66  eFree(p->zColAff
17d0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
17e0: 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ree(p);.}../*.**
17f0: 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65   Unlink the give
1800: 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73  n index from its
1810: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 6d   table, then rem
1820: 6f 76 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  ove.** the index
1830: 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20   from the index 
1840: 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66  hash table and f
1850: 72 65 65 20 69 74 73 20 6d 65 6d 6f 72 79 0a 2a  ree its memory.*
1860: 2a 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  * structures..*/
1870: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c  .void sqlite3Unl
1880: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65  inkAndDeleteInde
1890: 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e  x(sqlite *db, In
18a0: 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20  dex *pIndex){.  
18b0: 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  if( pIndex->pTab
18c0: 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64  le->pIndex==pInd
18d0: 65 78 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78  ex ){.    pIndex
18e0: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
18f0: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
1900: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49  ;.  }else{.    I
1910: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 66 6f 72  ndex *p;.    for
1920: 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  (p=pIndex->pTabl
1930: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20  e->pIndex; p && 
1940: 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78  p->pNext!=pIndex
1950: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a  ; p=p->pNext){}.
1960: 20 20 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e      if( p && p->
1970: 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b  pNext==pIndex ){
1980: 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20  .      p->pNext 
1990: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
19a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
19b0: 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64  iteDeleteIndex(d
19c0: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f  b, pIndex);.}../
19d0: 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73  *.** Erase all s
19e0: 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f  chema informatio
19f0: 6e 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65  n from the in-me
1a00: 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73  mory hash tables
1a10: 20 6f 66 0a 2a 2a 20 64 61 74 61 62 61 73 65 20   of.** database 
1a20: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69  connection.  Thi
1a30: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1a40: 6c 65 64 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d  led to reclaim m
1a50: 65 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20  emory.** before 
1a60: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  the connection c
1a70: 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61 6c  loses.  It is al
1a80: 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67  so called during
1a90: 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69   a rollback.** i
1aa0: 66 20 74 68 65 72 65 20 77 65 72 65 20 73 63 68  f there were sch
1ab0: 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72 69  ema changes duri
1ac0: 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ng the transacti
1ad0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  on..**.** If iDb
1ae0: 3c 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20 74  <=0 then reset t
1af0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
1b00: 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c  ma tables for al
1b10: 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  l database.** fi
1b20: 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20  les.  If iDb>=2 
1b30: 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69  then reset the i
1b40: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66  nternal schema f
1b50: 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73  or only the.** s
1b60: 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63  ingle file indic
1b70: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
1b80: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
1b90: 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65 20  alSchema(sqlite 
1ba0: 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  *db, int iDb){. 
1bb0: 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d   HashElem *pElem
1bc0: 3b 0a 20 20 48 61 73 68 20 74 65 6d 70 31 3b 0a  ;.  Hash temp1;.
1bd0: 20 20 48 61 73 68 20 74 65 6d 70 32 3b 0a 20 20    Hash temp2;.  
1be0: 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73 73  int i, j;..  ass
1bf0: 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
1c00: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
1c10: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
1c20: 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64  LITE_Initialized
1c30: 3b 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69  ;.  for(i=iDb; i
1c40: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
1c50: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
1c60: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 74  b->aDb[i];.    t
1c70: 65 6d 70 31 20 3d 20 70 44 62 2d 3e 74 62 6c 48  emp1 = pDb->tblH
1c80: 61 73 68 3b 0a 20 20 20 20 74 65 6d 70 32 20 3d  ash;.    temp2 =
1c90: 20 70 44 62 2d 3e 74 72 69 67 48 61 73 68 3b 0a   pDb->trigHash;.
1ca0: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
1cb0: 6e 69 74 28 26 70 44 62 2d 3e 74 72 69 67 48 61  nit(&pDb->trigHa
1cc0: 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f  sh, SQLITE_HASH_
1cd0: 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20  STRING, 0);.    
1ce0: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
1cf0: 28 26 70 44 62 2d 3e 61 46 4b 65 79 29 3b 0a 20  (&pDb->aFKey);. 
1d00: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c     sqlite3HashCl
1d10: 65 61 72 28 26 70 44 62 2d 3e 69 64 78 48 61 73  ear(&pDb->idxHas
1d20: 68 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65  h);.    for(pEle
1d30: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
1d40: 74 28 26 74 65 6d 70 32 29 3b 20 70 45 6c 65 6d  t(&temp2); pElem
1d50: 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
1d60: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
1d70: 20 20 20 20 20 20 54 72 69 67 67 65 72 20 2a 70        Trigger *p
1d80: 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65  Trigger = sqlite
1d90: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
1da0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
1db0: 6c 65 74 65 54 72 69 67 67 65 72 28 70 54 72 69  leteTrigger(pTri
1dc0: 67 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gger);.    }.   
1dd0: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
1de0: 72 28 26 74 65 6d 70 32 29 3b 0a 20 20 20 20 73  r(&temp2);.    s
1df0: 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
1e00: 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 53 51  pDb->tblHash, SQ
1e10: 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47  LITE_HASH_STRING
1e20: 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 70 45  , 0);.    for(pE
1e30: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
1e40: 72 73 74 28 26 74 65 6d 70 31 29 3b 20 70 45 6c  rst(&temp1); pEl
1e50: 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
1e60: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
1e70: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
1e80: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
1e90: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
1ea0: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
1eb0: 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b  Table(db, pTab);
1ec0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1ed0: 65 33 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d  e3HashClear(&tem
1ee0: 70 31 29 3b 0a 20 20 20 20 44 62 43 6c 65 61 72  p1);.    DbClear
1ef0: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20  Property(db, i, 
1f00: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1f10: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3e 30 20  ;.    if( iDb>0 
1f20: 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20  ) return;.  }.  
1f30: 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20 29  assert( iDb==0 )
1f40: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
1f50: 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43   ~SQLITE_InternC
1f60: 68 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20 49 66  hanges;..  /* If
1f70: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
1f80: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
1f90: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 73  tabase files has
1fa0: 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20   been closed,.  
1fb0: 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74  ** then remove t
1fc0: 68 65 6e 20 66 72 6f 6d 20 74 68 65 20 61 75 78  hen from the aux
1fd0: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
1fe0: 6c 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74  list.  We take t
1ff0: 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e  he.  ** opportun
2000: 69 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68  ity to do this h
2010: 65 72 65 20 73 69 6e 63 65 20 77 65 20 68 61 76  ere since we hav
2020: 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61  e just deleted a
2030: 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73  ll of the.  ** s
2040: 63 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65  chema hash table
2050: 73 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20  s and therefore 
2060: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d  do not have to m
2070: 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a  ake any changes.
2080: 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74    ** to any of t
2090: 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
20a0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  /.  for(i=0; i<d
20b0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
20c0: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
20d0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
20e0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
20f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
2100: 20 70 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44   pDb->pAux && pD
2110: 62 2d 3e 78 46 72 65 65 41 75 78 20 29 20 70 44  b->xFreeAux ) pD
2120: 62 2d 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d  b->xFreeAux(pDb-
2130: 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44  >pAux);.      pD
2140: 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20  b->pAux = 0;.   
2150: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a   }.  }.  for(i=j
2160: 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =2; i<db->nDb; i
2170: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
2180: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
2190: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
21a0: 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20  Db->pBt==0 ){.  
21b0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
21c0: 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db->zName);.    
21d0: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30    pDb->zName = 0
21e0: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
21f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2200: 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  j<i ){.      db-
2210: 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44  >aDb[j] = db->aD
2220: 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b[i];.    }.    
2230: 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  j++;.  }.  memse
2240: 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30  t(&db->aDb[j], 0
2250: 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69  , (db->nDb-j)*si
2260: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29  zeof(db->aDb[j])
2270: 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a  );.  db->nDb = j
2280: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c  ;.  if( db->nDb<
2290: 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64  =2 && db->aDb!=d
22a0: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a  b->aDbStatic ){.
22b0: 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61      memcpy(db->a
22c0: 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44  DbStatic, db->aD
22d0: 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b, 2*sizeof(db->
22e0: 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71  aDb[0]));.    sq
22f0: 6c 69 74 65 46 72 65 65 28 64 62 2d 3e 61 44 62  liteFree(db->aDb
2300: 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d  );.    db->aDb =
2310: 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a   db->aDbStatic;.
2320: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
2330: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2340: 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 20 72  led whenever a r
2350: 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20  ollback occurs. 
2360: 20 49 66 20 74 68 65 72 65 20 77 65 72 65 0a 2a   If there were.*
2370: 2a 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  * schema changes
2380: 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e   during the tran
2390: 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65  saction, then we
23a0: 20 68 61 76 65 20 74 6f 20 72 65 73 65 74 20 74   have to reset t
23b0: 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68  he.** internal h
23c0: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 72  ash tables and r
23d0: 65 6c 6f 61 64 20 74 68 65 6d 20 66 72 6f 6d 20  eload them from 
23e0: 64 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  disk..*/.void sq
23f0: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74  lite3RollbackInt
2400: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c  ernalChanges(sql
2410: 69 74 65 20 2a 64 62 29 7b 0a 20 20 69 66 28 20  ite *db){.  if( 
2420: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
2430: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
2440: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
2450: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
2460: 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d  ma(db, 0);.  }.}
2470: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2480: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
2490: 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63  hen a commit occ
24a0: 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
24b0: 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
24c0: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
24d0: 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 61 44 62   *db){.  db->aDb
24e0: 5b 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  [0].schema_cooki
24f0: 65 20 3d 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f  e = db->next_coo
2500: 6b 69 65 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  kie;.  db->flags
2510: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
2520: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
2530: 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d  .** Remove the m
2540: 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63  emory data struc
2550: 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64  tures associated
2560: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a   with the given.
2570: 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68  ** Table.  No ch
2580: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
2590: 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72  o disk by this r
25a0: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
25b0: 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20  is routine just 
25c0: 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61  deletes the data
25d0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20   structure.  It 
25e0: 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a  does not unlink.
25f0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74  ** the table dat
2600: 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  a structure from
2610: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
2620: 20 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65    Nor does it re
2630: 6d 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20  move.** foreign 
2640: 6b 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71  keys from the sq
2650: 6c 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20  lite.aFKey hash 
2660: 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64  table.  But it d
2670: 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d  oes destroy.** m
2680: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
2690: 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20   of the indices 
26a0: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
26b0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
26c0: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a   .** the table..
26d0: 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73  **.** Indices as
26e0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
26f0: 65 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69  e table are unli
2700: 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64  nked from the "d
2710: 62 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63  b".** data struc
2720: 74 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c  ture if db!=NULL
2730: 2e 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20  .  If db==NULL, 
2740: 69 6e 64 69 63 65 73 20 61 74 74 61 63 68 65 64  indices attached
2750: 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   to.** the table
2760: 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75   are deleted, bu
2770: 74 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  t it is assumed 
2780: 74 68 65 79 20 68 61 76 65 20 61 6c 72 65 61 64  they have alread
2790: 79 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b  y been.** unlink
27a0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
27b0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73  te3DeleteTable(s
27c0: 71 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65  qlite *db, Table
27d0: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74   *pTable){.  int
27e0: 20 69 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   i;.  Index *pIn
27f0: 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46  dex, *pNext;.  F
2800: 4b 65 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65  Key *pFKey, *pNe
2810: 78 74 46 4b 65 79 3b 0a 0a 20 20 69 66 28 20 70  xtFKey;..  if( p
2820: 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72  Table==0 ) retur
2830: 6e 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  n;..  /* Delete 
2840: 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f  all indices asso
2850: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
2860: 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f   table.  */.  fo
2870: 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c  r(pIndex = pTabl
2880: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  e->pIndex; pInde
2890: 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29  x; pIndex=pNext)
28a0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49  {.    pNext = pI
28b0: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
28c0: 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
28d0: 3e 69 44 62 3d 3d 70 54 61 62 6c 65 2d 3e 69 44  >iDb==pTable->iD
28e0: 62 20 7c 7c 20 28 70 54 61 62 6c 65 2d 3e 69 44  b || (pTable->iD
28f0: 62 3d 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e  b==0 && pIndex->
2900: 69 44 62 3d 3d 31 29 20 29 3b 0a 20 20 20 20 73  iDb==1) );.    s
2910: 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78  qliteDeleteIndex
2920: 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
2930: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  }..  /* Delete a
2940: 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  ll foreign keys 
2950: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2960: 74 68 69 73 20 74 61 62 6c 65 2e 20 20 54 68 65  this table.  The
2970: 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c   keys.  ** shoul
2980: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  d have already b
2990: 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  een unlinked fro
29a0: 6d 20 74 68 65 20 64 62 2d 3e 61 46 4b 65 79 20  m the db->aFKey 
29b0: 68 61 73 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f  hash table .  */
29c0: 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61  .  for(pFKey=pTa
29d0: 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65  ble->pFKey; pFKe
29e0: 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b  y; pFKey=pNextFK
29f0: 65 79 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b  ey){.    pNextFK
2a00: 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78  ey = pFKey->pNex
2a10: 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72  tFrom;.    asser
2a20: 74 28 20 70 54 61 62 6c 65 2d 3e 69 44 62 3c 64  t( pTable->iDb<d
2a30: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73  b->nDb );.    as
2a40: 73 65 72 74 28 20 73 71 6c 69 74 65 33 48 61 73  sert( sqlite3Has
2a50: 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70  hFind(&db->aDb[p
2a60: 54 61 62 6c 65 2d 3e 69 44 62 5d 2e 61 46 4b 65  Table->iDb].aFKe
2a70: 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
2a90: 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e  Key->zTo, strlen
2aa0: 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29 21  (pFKey->zTo)+1)!
2ab0: 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20 20 73 71  =pFKey );.    sq
2ac0: 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b  liteFree(pFKey);
2ad0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
2ae0: 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  e the Table stru
2af0: 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20  cture itself..  
2b00: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
2b10: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b  pTable->nCol; i+
2b20: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  +){.    sqliteFr
2b30: 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  ee(pTable->aCol[
2b40: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  i].zName);.    s
2b50: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
2b60: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 29  ->aCol[i].zDflt)
2b70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
2b80: 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d  (pTable->aCol[i]
2b90: 2e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73  .zType);.  }.  s
2ba0: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
2bb0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ->zName);.  sqli
2bc0: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
2bd0: 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 54 61 62  Col);.  if( pTab
2be0: 6c 65 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a 20  le->zColAff ){. 
2bf0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54     sqliteFree(pT
2c00: 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  able->zColAff);.
2c10: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
2c20: 65 63 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65  ectDelete(pTable
2c30: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  ->pSelect);.  sq
2c40: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 29  liteFree(pTable)
2c50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  ;.}../*.** Unlin
2c60: 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c  k the given tabl
2c70: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
2c80: 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64  tables and the d
2c90: 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62  elete the.** tab
2ca0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74  le structure wit
2cb0: 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65  h all its indice
2cc0: 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65  s and foreign ke
2cd0: 79 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ys..*/.static vo
2ce0: 69 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41  id sqliteUnlinkA
2cf0: 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  ndDeleteTable(sq
2d00: 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20  lite *db, Table 
2d10: 2a 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 4f  *p){.  Table *pO
2d20: 6c 64 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c  ld;.  FKey *pF1,
2d30: 20 2a 70 46 32 3b 0a 20 20 69 6e 74 20 69 20 3d   *pF2;.  int i =
2d40: 20 70 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65 72   p->iDb;.  asser
2d50: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 70 4f  t( db!=0 );.  pO
2d60: 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ld = sqlite3Hash
2d70: 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b  Insert(&db->aDb[
2d80: 69 5d 2e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a  i].tblHash, p->z
2d90: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e  Name, strlen(p->
2da0: 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20  zName)+1, 0);.  
2db0: 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20  assert( pOld==0 
2dc0: 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20  || pOld==p );.  
2dd0: 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79  for(pF1=p->pFKey
2de0: 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e  ; pF1; pF1=pF1->
2df0: 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20  pNextFrom){.    
2e00: 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e  int nTo = strlen
2e10: 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a  (pF1->zTo) + 1;.
2e20: 20 20 20 20 70 46 32 20 3d 20 73 71 6c 69 74 65      pF2 = sqlite
2e30: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
2e40: 44 62 5b 69 5d 2e 61 46 4b 65 79 2c 20 70 46 31  Db[i].aFKey, pF1
2e50: 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20  ->zTo, nTo);.   
2e60: 20 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29 7b   if( pF2==pF1 ){
2e70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61  .      sqlite3Ha
2e80: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44  shInsert(&db->aD
2e90: 62 5b 69 5d 2e 61 46 4b 65 79 2c 20 70 46 31 2d  b[i].aFKey, pF1-
2ea0: 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e  >zTo, nTo, pF1->
2eb0: 70 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 7d 65  pNextTo);.    }e
2ec0: 6c 73 65 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  lse{.      while
2ed0: 28 20 70 46 32 20 26 26 20 70 46 32 2d 3e 70 4e  ( pF2 && pF2->pN
2ee0: 65 78 74 54 6f 21 3d 70 46 31 20 29 7b 20 70 46  extTo!=pF1 ){ pF
2ef0: 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b 20  2=pF2->pNextTo; 
2f00: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46 32 20  }.      if( pF2 
2f10: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 32 2d 3e  ){.        pF2->
2f20: 70 4e 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70  pNextTo = pF1->p
2f30: 4e 65 78 74 54 6f 3b 0a 20 20 20 20 20 20 7d 0a  NextTo;.      }.
2f40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
2f50: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
2f60: 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
2f70: 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 6e 61  Construct the na
2f80: 6d 65 20 6f 66 20 61 20 75 73 65 72 20 74 61 62  me of a user tab
2f90: 6c 65 20 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d  le or index from
2fa0: 20 61 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20   a token..**.** 
2fb0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
2fc0: 65 20 6e 61 6d 65 20 69 73 20 6f 62 74 61 69 6e  e name is obtain
2fd0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ed from sqliteMa
2fe0: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 0a  lloc() and must.
2ff0: 2a 2a 20 62 65 20 66 72 65 65 64 20 62 79 20 74  ** be freed by t
3000: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
3010: 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  ion..*/.char *sq
3020: 6c 69 74 65 33 54 61 62 6c 65 4e 61 6d 65 46 72  lite3TableNameFr
3030: 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70  omToken(Token *p
3040: 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
3050: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
3060: 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70  NDup(pName->z, p
3070: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69  Name->n);.  sqli
3080: 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65  te3Dequote(zName
3090: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d  );.  return zNam
30a0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  e;.}../*.** Open
30b0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
30c0: 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20  er table stored 
30d0: 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  in database numb
30e0: 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72  er iDb for.** wr
30f0: 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65  iting. The table
3100: 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67   is opened using
3110: 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f   cursor 0..*/.vo
3120: 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61  id sqlite3OpenMa
3130: 73 74 65 72 54 61 62 6c 65 28 56 64 62 65 20 2a  sterTable(Vdbe *
3140: 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73  v, int iDb){.  s
3150: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3160: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
3170: 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  Db, 0);.  sqlite
3180: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3190: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d  _OpenWrite, 0, M
31a0: 41 53 54 45 52 5f 52 4f 4f 54 29 3b 0a 20 20 73  ASTER_ROOT);.  s
31b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
31c0: 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75  v, OP_SetNumColu
31d0: 6d 6e 73 2c 20 30 2c 20 35 29 3b 20 2f 2a 20 73  mns, 0, 5); /* s
31e0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 68 61 73  qlite_master has
31f0: 20 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a   5 columns */.}.
3200: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e  ./*.** The token
3210: 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73   *pName contains
3220: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
3230: 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20  atabase (either 
3240: 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65  "main" or.** "te
3250: 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20  mp" or the name 
3260: 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  of an attached d
3270: 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  b). This routine
3280: 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20   returns the.** 
3290: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d  index of the nam
32a0: 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64  ed database in d
32b0: 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20  b->aDb[], or -1 
32c0: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20  if the named db 
32d0: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
32e0: 73 74 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6e 64 44  st..*/.int findD
32f0: 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  b(sqlite3 *db, T
3300: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
3310: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
3320: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
3330: 29 7b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d 65  ){.    if( pName
3340: 2d 3e 6e 3d 3d 73 74 72 6c 65 6e 28 64 62 2d 3e  ->n==strlen(db->
3350: 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 20 26 26  aDb[i].zName) &&
3360: 20 0a 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c   .        0==sql
3370: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 64 62 2d  ite3StrNICmp(db-
3380: 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70  >aDb[i].zName, p
3390: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
33a0: 6e 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  n) ){.      retu
33b0: 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn i;.    }.  }.
33c0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
33d0: 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61  int sqlite3TwoPa
33e0: 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  rtName(.  Parse 
33f0: 2a 70 50 61 72 73 65 2c 20 0a 20 20 54 6f 6b 65  *pParse, .  Toke
3400: 6e 20 2a 70 4e 61 6d 65 31 2c 20 0a 20 20 54 6f  n *pName1, .  To
3410: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 0a 20 20  ken *pName2, .  
3420: 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 0a  Token **pUnqual.
3430: 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20  ){.  int iDb;.  
3440: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
3450: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
3460: 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65   pName2 && pName
3470: 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73  2->n>0 ){.    as
3480: 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
3490: 62 75 73 79 20 29 3b 0a 20 20 20 20 2a 70 55 6e  busy );.    *pUn
34a0: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20  qual = pName2;. 
34b0: 20 20 20 69 44 62 20 3d 20 66 69 6e 64 44 62 28     iDb = findDb(
34c0: 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  db, pName1);.   
34d0: 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20   if( iDb<0 ){.  
34e0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
34f0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b  Msg(pParse, "unk
3500: 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25 54  nown database %T
3510: 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  ", pName1);.    
3520: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
3530: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  ;.      return -
3540: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
3550: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
3560: 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c  ->init.iDb==0 ||
3570: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
3580: 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e  ;.    iDb = db->
3590: 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70  init.iDb;.    *p
35a0: 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b  Unqual = pName1;
35b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 44  .  }.  return iD
35c0: 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  b;.}../*.** Begi
35d0: 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61  n constructing a
35e0: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65   new table repre
35f0: 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d  sentation in mem
3600: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a  ory.  This is.**
3610: 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65   the first of se
3620: 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75  veral action rou
3630: 74 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63  tines that get c
3640: 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73  alled in respons
3650: 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45  e.** to a CREATE
3660: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
3670: 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72  .  In particular
3680: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
3690: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65  s called.** afte
36a0: 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20  r seeing tokens 
36b0: 22 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41  "CREATE" and "TA
36c0: 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62  BLE" and the tab
36d0: 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a 2a 2a  le name.  The.**
36e0: 20 70 53 74 61 72 74 20 74 6f 6b 65 6e 20 69 73   pStart token is
36f0: 20 74 68 65 20 43 52 45 41 54 45 20 61 6e 64 20   the CREATE and 
3700: 70 4e 61 6d 65 20 69 73 20 74 68 65 20 74 61 62  pName is the tab
3710: 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 73  le name.  The is
3720: 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20  Temp.** flag is 
3730: 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c  true if the tabl
3740: 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72  e should be stor
3750: 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69  ed in the auxili
3760: 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ary database.** 
3770: 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
3780: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
3790: 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
37a0: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65   is normally the
37b0: 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68   case.** when th
37c0: 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d  e "TEMP" or "TEM
37d0: 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20  PORARY" keyword 
37e0: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
37f0: 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20  n.** CREATE and 
3800: 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TABLE..**.** The
3810: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
3820: 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  d is initialized
3830: 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72   and put in pPar
3840: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a  se->pNewTable..*
3850: 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65  * As more of the
3860: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
3870: 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
3880: 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63  d, additional ac
3890: 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73  tion.** routines
38a0: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
38b0: 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f  to add more info
38c0: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
38d0: 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68  record..** At th
38e0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
38f0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
3900: 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33  ent, the sqlite3
3910: 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69  EndTable() routi
3920: 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
3930: 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
3940: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20  construction of 
3950: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65  the new table re
3960: 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  cord..*/.void sq
3970: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
3980: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3990: 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f  ,   /* Parser co
39a0: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
39b0: 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20 54   *pStart,   /* T
39c0: 68 65 20 22 43 52 45 41 54 45 22 20 74 6f 6b 65  he "CREATE" toke
39d0: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
39e0: 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74  ame1,   /* First
39f0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d   part of the nam
3a00: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
3a10: 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  r view */.  Toke
3a20: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20  n *pName2,   /* 
3a30: 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 74  Second part of t
3a40: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
3a50: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a  able or view */.
3a60: 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20    int isTemp,   
3a70: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
3a80: 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61 62  is is a TEMP tab
3a90: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  le */.  int isVi
3aa0: 65 77 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ew       /* True
3ab0: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49   if this is a VI
3ac0: 45 57 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  EW */.){.  Table
3ad0: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49 6e 64 65   *pTable;.  Inde
3ae0: 78 20 2a 70 49 64 78 3b 0a 20 20 63 68 61 72 20  x *pIdx;.  char 
3af0: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  *zName;.  sqlite
3b00: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
3b10: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
3b20: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
3b30: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
3b40: 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68  ber to create th
3b50: 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20  e table in */.  
3b60: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20  Token *pName;   
3b70: 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
3b80: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
3b90: 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a  e to create */..
3ba0: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f    /* The table o
3bb0: 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63  r view name to c
3bc0: 72 65 61 74 65 20 69 73 20 70 61 73 73 65 64 20  reate is passed 
3bd0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
3be0: 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20  via tokens.  ** 
3bf0: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
3c00: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
3c10: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
3c20: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
3c30: 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
3c40: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
3c50: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a  x.yyy (...);.  *
3c60: 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61  * .  ** Then pNa
3c70: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78  me1 is set to "x
3c80: 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22  xx" and pName2 "
3c90: 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68  yyy". On the oth
3ca0: 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20  er hand if.  ** 
3cb0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  the table name i
3cc0: 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c  s not fully qual
3cd0: 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a  ified, i.e.:.  *
3ce0: 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41  *.  ** CREATE TA
3cf0: 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20  BLE yyy(...);.  
3d00: 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61  **.  ** Then pNa
3d10: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
3d20: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
3d30: 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  s ""..  **.  ** 
3d40: 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73  The call below s
3d50: 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f  ets the pName po
3d60: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
3d70: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
3d80: 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d  me1 or.  ** pNam
3d90: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
3da0: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
3db0: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20  table name. The 
3dc0: 76 61 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a  variable iDb is.
3dd0: 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20    ** set to the 
3de0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  index of the dat
3df0: 61 62 61 73 65 20 74 68 61 74 20 74 68 65 20 74  abase that the t
3e00: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20  able or view is 
3e10: 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74  to be.  ** creat
3e20: 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44  ed in..  */.  iD
3e30: 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
3e40: 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
3e50: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
3e60: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44  pName);.  if( iD
3e70: 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
3e80: 69 66 28 20 69 73 54 65 6d 70 20 26 26 20 69 44  if( isTemp && iD
3e90: 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  b>1 ){.    /* If
3ea0: 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70   creating a temp
3eb0: 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65   table, the name
3ec0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c   may not be qual
3ed0: 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c  ified */.    sql
3ee0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3ef0: 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20  rse, "temporary 
3f00: 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20  table name must 
3f10: 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29  be unqualified")
3f20: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
3f30: 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
3f40: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 54 65  ;.  }.  if( isTe
3f50: 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20  mp ) iDb = 1;.. 
3f60: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
3f70: 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20  ken = *pName;.  
3f80: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 54  zName = sqlite3T
3f90: 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ableNameFromToke
3fa0: 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  n(pName);.  if( 
3fb0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
3fc0: 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  n;.  if( db->ini
3fd0: 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d  t.iDb==1 ) isTem
3fe0: 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  p = 1;.#ifndef S
3ff0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
4000: 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72  RIZATION.  asser
4010: 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d  t( (isTemp & 1)=
4020: 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20  =isTemp );.  {. 
4030: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
4040: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
4050: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
4060: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
4070: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
4080: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
4090: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73   SCHEMA_TABLE(is
40a0: 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29  Temp), 0, zDb) )
40b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
40c0: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ee(zName);.     
40d0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
40e0: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
40f0: 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 65 6d  .      if( isTem
4100: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
4110: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
4120: 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  E_TEMP_VIEW;.   
4130: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4140: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
4150: 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20  CREATE_VIEW;.   
4160: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
4170: 20 20 20 20 20 20 69 66 28 20 69 73 54 65 6d 70        if( isTemp
4180: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
4190: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
41a0: 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
41b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
41c0: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
41d0: 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20  CREATE_TABLE;.  
41e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
41f0: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
4200: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
4210: 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  e, zName, 0, zDb
4220: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
4230: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
4240: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
4250: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
4260: 2f 2a 20 42 65 66 6f 72 65 20 74 72 79 69 6e 67  /* Before trying
4270: 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 65 6d   to create a tem
4280: 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6d 61  porary table, ma
4290: 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 72 65  ke sure the Btre
42a0: 65 20 66 6f 72 0a 20 20 2a 2a 20 68 6f 6c 64 69  e for.  ** holdi
42b0: 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
42c0: 6c 65 73 20 69 73 20 6f 70 65 6e 2e 0a 20 20 2a  les is open..  *
42d0: 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 26  /.  if( isTemp &
42e0: 26 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  & db->aDb[1].pBt
42f0: 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ==0 && !pParse->
4300: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69  explain ){.    i
4310: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  nt rc = sqlite3B
4320: 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20  treeFactory(db, 
4330: 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c  0, 0, MAX_PAGES,
4340: 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74   &db->aDb[1].pBt
4350: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
4360: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4370: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4380: 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
4390: 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  e to open a temp
43a0: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22  orary database "
43b0: 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66  .        "file f
43c0: 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f  or storing tempo
43d0: 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20  rary tables");. 
43e0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
43f0: 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r++;.      retur
4400: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
4410: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 21 64 62   db->flags & !db
4420: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a  ->autoCommit ){.
4430: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
4440: 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
4450: 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  s(db->aDb[1].pBt
4460: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 1, 0);.      i
4470: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
4480: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4490: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
44a0: 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67  se, "unable to g
44b0: 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  et a write lock 
44c0: 6f 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  on ".          "
44d0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61  the temporary da
44e0: 74 61 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20  tabase file");. 
44f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
4500: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
4510: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
4520: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e   the new table n
4530: 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c  ame does not col
4540: 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69  lide with an exi
4550: 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78  sting.  ** index
4560: 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69   or table name i
4570: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
4580: 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65  ase.  Issue an e
4590: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a  rror message if.
45a0: 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 0a 20 20    ** it does..  
45b0: 2a 2f 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71  */.  pTable = sq
45c0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
45d0: 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44  b, zName, db->aD
45e0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  b[iDb].zName);. 
45f0: 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20   if( pTable ){. 
4600: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
4610: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
4620: 65 20 25 54 20 61 6c 72 65 61 64 79 20 65 78 69  e %T already exi
4630: 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  sts", pName);.  
4640: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
4650: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  me);.    return;
4660: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 49 64 78  .  }.  if( (pIdx
4670: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
4680: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  dex(db, zName, 0
4690: 29 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20  ))!=0 &&.       
46a0: 20 20 20 28 70 49 64 78 2d 3e 69 44 62 3d 3d 30     (pIdx->iDb==0
46b0: 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75   || !db->init.bu
46c0: 73 79 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sy) ){.    sqlit
46d0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
46e0: 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
46f0: 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61  eady an index na
4700: 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
4710: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
4720: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
4730: 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  rn;.  }.  pTable
4740: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
4750: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
4760: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ;.  if( pTable==
4770: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  0 ){.    sqliteF
4780: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
4790: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54  return;.  }.  pT
47a0: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e  able->zName = zN
47b0: 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  ame;.  pTable->n
47c0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  Col = 0;.  pTabl
47d0: 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  e->aCol = 0;.  p
47e0: 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d  Table->iPKey = -
47f0: 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49 6e  1;.  pTable->pIn
4800: 64 65 78 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  dex = 0;.  pTabl
4810: 65 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  e->iDb = iDb;.  
4820: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  if( pParse->pNew
4830: 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65 33 44  Table ) sqlite3D
4840: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
4850: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
4860: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  );.  pParse->pNe
4870: 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  wTable = pTable;
4880: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
4890: 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65  erating the code
48a0: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72   that will inser
48b0: 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f  t the table reco
48c0: 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65  rd into.  ** the
48d0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
48e0: 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70  able.  Note in p
48f0: 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20 77  articular that w
4900: 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a  e must go ahead.
4910: 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74    ** and allocat
4920: 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  e the record num
4930: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
4940: 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65  e entry now.  Be
4950: 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52  fore any.  ** PR
4960: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
4970: 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65  QUE keywords are
4980: 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20   parsed.  Those 
4990: 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61  keywords will ca
49a0: 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  use.  ** indices
49b0: 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 61   to be created a
49c0: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  nd the table rec
49d0: 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65  ord must come be
49e0: 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69  fore the .  ** i
49f0: 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20  ndices.  Hence, 
4a00: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
4a10: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
4a20: 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
4a30: 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f  d.  ** now..  */
4a40: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
4a50: 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73 71  .busy && (v = sq
4a60: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
4a70: 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  rse))!=0 ){.    
4a80: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
4a90: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
4aa0: 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 0, iDb);.    
4ab0: 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20  if( !isTemp ){. 
4ac0: 20 20 20 20 20 2f 2a 20 45 76 65 72 79 20 74 69       /* Every ti
4ad0: 6d 65 20 61 20 6e 65 77 20 74 61 62 6c 65 20 69  me a new table i
4ae0: 73 20 63 72 65 61 74 65 64 20 74 68 65 20 66 69  s created the fi
4af0: 6c 65 2d 66 6f 72 6d 61 74 0a 20 20 20 20 20 20  le-format.      
4b00: 2a 2a 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20  ** and encoding 
4b10: 6d 65 74 61 2d 76 61 6c 75 65 73 20 61 72 65 20  meta-values are 
4b20: 73 65 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  set in the datab
4b30: 61 73 65 2c 20 69 6e 0a 20 20 20 20 20 20 2a 2a  ase, in.      **
4b40: 20 63 61 73 65 20 74 68 69 73 20 69 73 20 74 68   case this is th
4b50: 65 20 66 69 72 73 74 20 74 61 62 6c 65 20 63 72  e first table cr
4b60: 65 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  eated..      */.
4b70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4b80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
4b90: 65 67 65 72 2c 20 64 62 2d 3e 66 69 6c 65 5f 66  eger, db->file_f
4ba0: 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 20  ormat, 0);.     
4bb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4bc0: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
4bd0: 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20  e, iDb, 1);.    
4be0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4bf0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
4c00: 2c 20 64 62 2d 3e 65 6e 63 2c 20 30 29 3b 0a 20  , db->enc, 0);. 
4c10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4c20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43  AddOp(v, OP_SetC
4c30: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 34 29 3b 0a  ookie, iDb, 4);.
4c40: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
4c50: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
4c60: 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  (v, iDb);.    sq
4c70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4c80: 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30  , OP_NewRecno, 0
4c90: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4ca0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4cb0: 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
4cc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4cd0: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  p(v, OP_String8,
4ce0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
4cf0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4d00: 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c  OP_PutIntKey, 0,
4d10: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
4d20: 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75  * Add a new colu
4d30: 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  mn to the table 
4d40: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
4d50: 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a  constructed..**.
4d60: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
4d70: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
4d80: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63   once for each c
4d90: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
4da0: 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45  n.** in a CREATE
4db0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
4dc0: 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  .  sqlite3StartT
4dd0: 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c  able() gets call
4de0: 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67  ed.** first to g
4df0: 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e  et things going.
4e00: 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74    Then this rout
4e10: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ine is called fo
4e20: 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e  r each.** column
4e30: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4e40: 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65  3AddColumn(Parse
4e50: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
4e60: 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  *pName){.  Table
4e70: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
4e80: 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 43  char *z = 0;.  C
4e90: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69  olumn *pCol;.  i
4ea0: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
4eb0: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
4ec0: 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
4ed0: 33 53 65 74 4e 53 74 72 69 6e 67 28 26 7a 2c 20  3SetNString(&z, 
4ee0: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
4ef0: 3e 6e 2c 20 30 29 3b 0a 20 20 69 66 28 20 7a 3d  >n, 0);.  if( z=
4f00: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
4f10: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29  qlite3Dequote(z)
4f20: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
4f30: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
4f40: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
4f50: 49 43 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b  ICmp(z, p->aCol[
4f60: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
4f70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
4f80: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
4f90: 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20  uplicate column 
4fa0: 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20  name: %s", z);. 
4fb0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
4fc0: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
4fd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
4fe0: 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37  ( (p->nCol & 0x7
4ff0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75  )==0 ){.    Colu
5000: 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e  mn *aNew;.    aN
5010: 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  ew = sqliteReall
5020: 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d  oc( p->aCol, (p-
5030: 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28  >nCol+8)*sizeof(
5040: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
5050: 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20    if( aNew==0 ) 
5060: 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 2d 3e 61  return;.    p->a
5070: 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a  Col = aNew;.  }.
5080: 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f    pCol = &p->aCo
5090: 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65  l[p->nCol];.  me
50a0: 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69  mset(pCol, 0, si
50b0: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
50c0: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  );.  pCol->zName
50d0: 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20   = z;. .  /* If 
50e0: 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65  there is no type
50f0: 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75   specified, colu
5100: 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66  mns have the def
5110: 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20  ault affinity.  
5120: 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68  ** 'NONE'. If th
5130: 65 72 65 20 69 73 20 61 20 74 79 70 65 20 73 70  ere is a type sp
5140: 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73 71  ecified, then sq
5150: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79  lite3AddColumnTy
5160: 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62  pe() will.  ** b
5170: 65 20 63 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f  e called next to
5180: 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e   set pCol->affin
5190: 69 74 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20  ity correctly.. 
51a0: 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69   */.  pCol->affi
51b0: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
51c0: 46 5f 4e 4f 4e 45 3b 0a 20 20 70 43 6f 6c 2d 3e  F_NONE;.  pCol->
51d0: 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
51e0: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
51f0: 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f   p->nCol++;.}../
5200: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5210: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
5220: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
5230: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
5240: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
5250: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
5260: 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55  ment.  A "NOT NU
5270: 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68  LL" constraint h
5280: 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20  as.** been seen 
5290: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  on a column.  Th
52a0: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
52b0: 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67  the notNull flag
52c0: 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   on.** the colum
52d0: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
52e0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
52f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
5300: 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20  ddNotNull(Parse 
5310: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45  *pParse, int onE
5320: 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a  rror){.  Table *
5330: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  p;.  int i;.  if
5340: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
5350: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
5360: 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e  eturn;.  i = p->
5370: 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e  nCol-1;.  if( i>
5380: 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  =0 ) p->aCol[i].
5390: 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f  notNull = onErro
53a0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  r;.}../*.** This
53b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
53c0: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
53d0: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
53e0: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
53f0: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
5400: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  E statement.  Th
5410: 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69  e pFirst token i
5420: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74  s the first.** t
5430: 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75  oken in the sequ
5440: 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74  ence of tokens t
5450: 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65  hat describe the
5460: 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20   type of the.** 
5470: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
5480: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
5490: 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20  ion.   pLast is 
54a0: 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a  the last token.*
54b0: 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63  * in the sequenc
54c0: 65 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66  e.  Use this inf
54d0: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73  ormation to cons
54e0: 74 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a  truct a string.*
54f0: 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  * that contains 
5500: 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20  the typename of 
5510: 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73  the column and s
5520: 74 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67  tore that string
5530: 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f  .** in zType..*/
5540: 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64   .void sqlite3Ad
5550: 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73  dColumnType(Pars
5560: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
5570: 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e 20   *pFirst, Token 
5580: 2a 70 4c 61 73 74 29 7b 0a 20 20 54 61 62 6c 65  *pLast){.  Table
5590: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b   *p;.  int i, j;
55a0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72  .  int n;.  char
55b0: 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20 20 43 6f 6c   *z, **pz;.  Col
55c0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28  umn *pCol;.  if(
55d0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
55e0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
55f0: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
5600: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30  Col-1;.  if( i<0
5610: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f   ) return;.  pCo
5620: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b  l = &p->aCol[i];
5630: 0a 20 20 70 7a 20 3d 20 26 70 43 6f 6c 2d 3e 7a  .  pz = &pCol->z
5640: 54 79 70 65 3b 0a 20 20 6e 20 3d 20 70 4c 61 73  Type;.  n = pLas
5650: 74 2d 3e 6e 20 2b 20 41 64 64 72 28 70 4c 61 73  t->n + Addr(pLas
5660: 74 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 46 69  t->z) - Addr(pFi
5670: 72 73 74 2d 3e 7a 29 3b 0a 20 20 73 71 6c 69 74  rst->z);.  sqlit
5680: 65 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c  e3SetNString(pz,
5690: 20 70 46 69 72 73 74 2d 3e 7a 2c 20 6e 2c 20 30   pFirst->z, n, 0
56a0: 29 3b 0a 20 20 7a 20 3d 20 2a 70 7a 3b 0a 20 20  );.  z = *pz;.  
56b0: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
56c0: 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  n;.  for(i=j=0; 
56d0: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
56e0: 69 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20  int c = z[i];.  
56f0: 20 20 69 66 28 20 69 73 73 70 61 63 65 28 63 29    if( isspace(c)
5700: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
5710: 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d   z[j++] = c;.  }
5720: 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 70  .  z[j] = 0;.  p
5730: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
5740: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
5750: 79 70 65 28 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a  ype(z, n);.}../*
5760: 0a 2a 2a 20 54 68 65 20 67 69 76 65 6e 20 74 6f  .** The given to
5770: 6b 65 6e 20 69 73 20 74 68 65 20 64 65 66 61 75  ken is the defau
5780: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
5790: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64   last column add
57a0: 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62  ed to.** the tab
57b0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
57c0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
57d0: 20 20 49 66 20 22 6d 69 6e 75 73 46 6c 61 67 22    If "minusFlag"
57e0: 20 69 73 20 74 72 75 65 2c 20 69 74 0a 2a 2a 20   is true, it.** 
57f0: 6d 65 61 6e 73 20 74 68 65 20 76 61 6c 75 65 20  means the value 
5800: 74 6f 6b 65 6e 20 77 61 73 20 70 72 65 63 65 64  token was preced
5810: 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69  ed by a minus si
5820: 67 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  gn..**.** This r
5830: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
5840: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
5850: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
5860: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
5870: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
5880: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
5890: 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66  id sqlite3AddDef
58a0: 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20  aultValue(Parse 
58b0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
58c0: 70 56 61 6c 2c 20 69 6e 74 20 6d 69 6e 75 73 46  pVal, int minusF
58d0: 6c 61 67 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  lag){.  Table *p
58e0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
58f0: 72 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20 28 70  r **pz;.  if( (p
5900: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
5910: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
5920: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
5930: 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20  -1;.  if( i<0 ) 
5940: 72 65 74 75 72 6e 3b 0a 20 20 70 7a 20 3d 20 26  return;.  pz = &
5950: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74  p->aCol[i].zDflt
5960: 3b 0a 20 20 69 66 28 20 6d 69 6e 75 73 46 6c 61  ;.  if( minusFla
5970: 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
5980: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 22  SetNString(pz, "
5990: 2d 22 2c 20 31 2c 20 70 56 61 6c 2d 3e 7a 2c 20  -", 1, pVal->z, 
59a0: 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d  pVal->n, 0);.  }
59b0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
59c0: 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20  3SetNString(pz, 
59d0: 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e  pVal->z, pVal->n
59e0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
59f0: 74 65 33 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b  te3Dequote(*pz);
5a00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e  .}../*.** Design
5a10: 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20  ate the PRIMARY 
5a20: 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c  KEY for the tabl
5a30: 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c  e.  pList is a l
5a40: 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a  ist of names .**
5a50: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   of columns that
5a60: 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72   form the primar
5a70: 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74  y key.  If pList
5a80: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
5a90: 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e  he.** most recen
5aa0: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
5ab0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   of the table is
5ac0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
5ad0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20  ..**.** A table 
5ae0: 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74  can have at most
5af0: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
5b00: 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  .  If the table 
5b10: 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61  already has.** a
5b20: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e   primary key (an
5b30: 64 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65  d this is the se
5b40: 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79  cond primary key
5b50: 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e  ) then create an
5b60: 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a  .** error..**.**
5b70: 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   If the PRIMARY 
5b80: 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67  KEY is on a sing
5b90: 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20  le column whose 
5ba0: 64 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45  datatype is INTE
5bb0: 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20  GER,.** then we 
5bc0: 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20  will try to use 
5bd0: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74  that column as t
5be0: 68 65 20 72 6f 77 20 69 64 2e 20 20 28 45 78 63  he row id.  (Exc
5bf0: 65 70 74 69 6f 6e 3a 0a 2a 2a 20 46 6f 72 20 62  eption:.** For b
5c00: 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
5c10: 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65  bility with olde
5c20: 72 20 64 61 74 61 62 61 73 65 73 2c 20 64 6f 20  r databases, do 
5c30: 6e 6f 74 20 64 6f 20 74 68 69 73 0a 2a 2a 20 69  not do this.** i
5c40: 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  f the file forma
5c50: 74 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  t version number
5c60: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2e   is less than 1.
5c70: 29 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65  )  Set the Table
5c80: 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20  .iPKey.** field 
5c90: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  of the table und
5ca0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
5cb0: 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20  to be the index 
5cc0: 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  of the.** INTEGE
5cd0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
5ce0: 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b  lumn.  Table.iPK
5cf0: 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20  ey is set to -1 
5d00: 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  if there is.** n
5d10: 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  o INTEGER PRIMAR
5d20: 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Y KEY..**.** If 
5d30: 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61  the key is not a
5d40: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
5d50: 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61  Y KEY, then crea
5d60: 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69  te a unique.** i
5d70: 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79  ndex for the key
5d80: 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63  .  No index is c
5d90: 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47  reated for INTEG
5da0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e  ER PRIMARY KEYs.
5db0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5dc0: 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 50 61  AddPrimaryKey(Pa
5dd0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 64 4c  rse *pParse, IdL
5de0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20  ist *pList, int 
5df0: 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c  onError){.  Tabl
5e00: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
5e10: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63  ->pNewTable;.  c
5e20: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  har *zType = 0;.
5e30: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c    int iCol = -1,
5e40: 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   i;.  if( pTab==
5e50: 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79  0 ) goto primary
5e60: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28  _key_exit;.  if(
5e70: 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65   pTab->hasPrimKe
5e80: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
5e90: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5ea0: 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c   .      "table \
5eb0: 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74  "%s\" has more t
5ec0: 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  han one primary 
5ed0: 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  key", pTab->zNam
5ee0: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69  e);.    goto pri
5ef0: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
5f00: 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73 50 72   }.  pTab->hasPr
5f10: 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66 28  imKey = 1;.  if(
5f20: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
5f30: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43   iCol = pTab->nC
5f40: 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62  ol - 1;.    pTab
5f50: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50  ->aCol[iCol].isP
5f60: 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65  rimKey = 1;.  }e
5f70: 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
5f80: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
5f90: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  i++){.      for(
5fa0: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
5fb0: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
5fc0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
5fd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
5fe0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
5ff0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
6000: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
6010: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6020: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6030: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
6040: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 20 70 54 61  pTab->nCol ) pTa
6050: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73  b->aCol[iCol].is
6060: 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20  PrimKey = 1;.   
6070: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74   }.    if( pList
6080: 2d 3e 6e 49 64 3e 31 20 29 20 69 43 6f 6c 20 3d  ->nId>1 ) iCol =
6090: 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69   -1;.  }.  if( i
60a0: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
60b0: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
60c0: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
60d0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
60e0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65  .  }.  if( zType
60f0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
6100: 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47  mp(zType, "INTEG
6110: 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ER")==0 ){.    p
6120: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f  Tab->iPKey = iCo
6130: 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79  l;.    pTab->key
6140: 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  Conf = onError;.
6150: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
6160: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
6170: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
6180: 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c   pList, onError,
6190: 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73   0, 0);.    pLis
61a0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d  t = 0;.  }..prim
61b0: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20  ary_key_exit:.  
61c0: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
61d0: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65  ete(pList);.  re
61e0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  turn;.}../*.** R
61f0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
6200: 74 6f 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e  to CollSeq given
6210: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63   the name of a c
6220: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
6230: 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6c  e..** If the col
6240: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
6250: 64 69 64 20 6e 6f 74 20 70 72 65 76 69 6f 75 73  did not previous
6260: 6c 79 20 65 78 69 73 74 2c 20 63 72 65 61 74 65  ly exist, create
6270: 20 69 74 20 62 75 74 0a 2a 2a 20 61 73 73 69 67   it but.** assig
6280: 6e 20 69 74 20 61 6e 20 4e 55 4c 4c 20 63 6f 6d  n it an NULL com
6290: 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
62a0: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
62b0: 6c 69 74 65 33 43 6f 6c 6c 61 74 65 54 79 70 65  lite3CollateType
62c0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
62d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
62e0: 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20  e, int nType){. 
62f0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
6300: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
6310: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 70  pParse->db;..  p
6320: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61  Coll = sqlite3Ha
6330: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c  shFind(&db->aCol
6340: 6c 53 65 71 2c 20 7a 54 79 70 65 2c 20 6e 54 79  lSeq, zType, nTy
6350: 70 65 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c  pe);.  if( pColl
6360: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
6370: 65 33 43 68 61 6e 67 65 43 6f 6c 6c 61 74 69 6e  e3ChangeCollatin
6380: 67 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 54  gFunction(db, zT
6390: 79 70 65 2c 20 6e 54 79 70 65 2c 20 30 2c 20 30  ype, nType, 0, 0
63a0: 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  );.    pColl = s
63b0: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
63c0: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 54  db->aCollSeq, zT
63d0: 79 70 65 2c 20 6e 54 79 70 65 29 3b 0a 20 20 7d  ype, nType);.  }
63e0: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
63f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
6400: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  e collation func
6410: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
6420: 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64   recently parsed
6430: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a   table column.**
6440: 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20   to the CollSeq 
6450: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
6460: 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65  qlite3AddCollate
6470: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
6480: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
6490: 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70 65  zType, int nType
64a0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
64b0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
64c0: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
64d0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
64e0: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
64f0: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
6500: 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 6c 20  return;.  pColl 
6510: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
6520: 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c  d(&db->aCollSeq,
6530: 20 7a 54 79 70 65 2c 20 6e 54 79 70 65 29 3b 0a   zType, nType);.
6540: 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29    if( pColl==0 )
6550: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
6560: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6c 6c 61  lite3ChangeColla
6570: 74 69 6e 67 46 75 6e 63 74 69 6f 6e 28 64 62 2c  tingFunction(db,
6580: 20 7a 54 79 70 65 2c 20 6e 54 79 70 65 2c 20 30   zType, nType, 0
6590: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
65a0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 2d 3e  pColl ){.    p->
65b0: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e  aCol[p->nCol-1].
65c0: 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20  pColl = pColl;. 
65d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61   }.}../*.** Crea
65e0: 74 65 20 6f 72 20 6d 6f 64 69 66 79 20 61 20 63  te or modify a c
65f0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
6600: 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 73  e entry in the s
6610: 71 6c 69 74 65 2e 61 43 6f 6c 6c 53 65 71 0a 2a  qlite.aCollSeq.*
6620: 2a 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f  * table..**.** O
6630: 6e 63 65 20 61 6e 20 65 6e 74 72 79 20 69 73 20  nce an entry is 
6640: 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c  added to the sql
6650: 69 74 65 2e 61 43 6f 6c 6c 53 65 71 20 74 61 62  ite.aCollSeq tab
6660: 6c 65 2c 20 69 74 20 63 61 6e 20 6e 65 76 65 72  le, it can never
6670: 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20  .** be removed, 
6680: 74 68 6f 75 67 68 20 69 73 20 63 6f 6d 70 61 72  though is compar
6690: 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 72  ison function or
66a0: 20 75 73 65 72 20 64 61 74 61 20 63 61 6e 20 62   user data can b
66b0: 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  e changed..**.**
66c0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
66d0: 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69  r to the collati
66e0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  ng function that
66f0: 20 77 61 73 20 63 72 65 61 74 65 64 20 6f 72 20   was created or 
6700: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 43 6f 6c  modified..*/.Col
6710: 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 43 68 61  lSeq *sqlite3Cha
6720: 6e 67 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63  ngeCollatingFunc
6730: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 20 2a  tion(.  sqlite *
6740: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
6750: 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e 74 6f  /* Database into
6760: 20 77 68 69 63 68 20 74 6f 20 69 6e 73 65 72 74   which to insert
6770: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 2a   the collation *
6780: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
6790: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e  zName,      /* N
67a0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61  ame of the colla
67b0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  tion */.  int nN
67c0: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
67d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
67e0: 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61  haracters in zNa
67f0: 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 55  me */.  void *pU
6800: 73 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ser,            
6810: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
6820: 74 20 74 6f 20 78 43 6d 70 20 2a 2f 0a 20 20 69  t to xCmp */.  i
6830: 6e 74 20 28 2a 78 43 6d 70 29 28 76 6f 69 64 2a  nt (*xCmp)(void*
6840: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
6850: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
6860: 29 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20  ) /* Comparison 
6870: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
6880: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
6890: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
68a0: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
68b0: 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65  >aCollSeq, zName
68c0: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , nName);.  if( 
68d0: 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  pColl==0 ){.    
68e0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61  pColl = sqliteMa
68f0: 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
6900: 2a 70 43 6f 6c 6c 29 20 2b 20 6e 4e 61 6d 65 20  *pColl) + nName 
6910: 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70  + 1 );.    if( p
6920: 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Coll==0 ){.     
6930: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
6940: 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  .    pColl->zNam
6950: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c  e = (char*)&pCol
6960: 6c 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  l[1];.    memcpy
6970: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a  (pColl->zName, z
6980: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a  Name, nName+1);.
6990: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
69a0: 6e 73 65 72 74 28 26 64 62 2d 3e 61 43 6f 6c 6c  nsert(&db->aColl
69b0: 53 65 71 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  Seq, pColl->zNam
69c0: 65 2c 20 6e 4e 61 6d 65 2c 20 70 43 6f 6c 6c 29  e, nName, pColl)
69d0: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 6c 2d 3e 70  ;.  }.  pColl->p
69e0: 55 73 65 72 20 3d 20 70 55 73 65 72 3b 0a 20 20  User = pUser;.  
69f0: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43  pColl->xCmp = xC
6a00: 6d 70 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 6f  mp;.  return pCo
6a10: 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61  ll;.}../*.** Sca
6a20: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  n the column typ
6a30: 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65  e name zType (le
6a40: 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20  ngth nType) and 
6a50: 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73  return the.** as
6a60: 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69 74  sociated affinit
6a70: 79 20 74 79 70 65 2e 0a 2a 2f 0a 63 68 61 72 20  y type..*/.char 
6a80: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
6a90: 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ype(const char *
6aa0: 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70 65  zType, int nType
6ab0: 29 7b 0a 20 20 69 6e 74 20 6e 2c 20 69 3b 0a 20  ){.  int n, i;. 
6ac0: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f   struct {.    co
6ad0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 62 3b 20  nst char *zSub; 
6ae0: 20 2f 2a 20 4b 65 79 77 6f 72 64 73 20 73 75 62   /* Keywords sub
6af0: 73 74 72 69 6e 67 20 74 6f 20 73 65 61 72 63 68  string to search
6b00: 20 66 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20   for */.    int 
6b10: 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 2f  nSub;          /
6b20: 2a 20 6c 65 6e 67 74 68 20 6f 66 20 7a 53 75 62  * length of zSub
6b30: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 61 66 66   */.    char aff
6b40: 69 6e 69 74 79 3b 20 20 20 20 20 2f 2a 20 41 66  inity;     /* Af
6b50: 66 69 6e 69 74 79 20 74 6f 20 72 65 74 75 72 6e  finity to return
6b60: 20 69 66 20 69 74 20 6d 61 74 63 68 65 73 20 2a   if it matches *
6b70: 2f 0a 20 20 7d 20 73 75 62 73 74 72 69 6e 67 73  /.  } substrings
6b80: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 22 49 4e 54  [] = {.    {"INT
6b90: 22 2c 20 20 33 2c 20 53 51 4c 49 54 45 5f 41 46  ",  3, SQLITE_AF
6ba0: 46 5f 49 4e 54 45 47 45 52 7d 2c 0a 20 20 20 20  F_INTEGER},.    
6bb0: 7b 22 43 48 41 52 22 2c 20 34 2c 20 53 51 4c 49  {"CHAR", 4, SQLI
6bc0: 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c 0a 20 20  TE_AFF_TEXT},.  
6bd0: 20 20 7b 22 43 4c 4f 42 22 2c 20 34 2c 20 53 51    {"CLOB", 4, SQ
6be0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c 0a  LITE_AFF_TEXT},.
6bf0: 20 20 20 20 7b 22 54 45 58 54 22 2c 20 34 2c 20      {"TEXT", 4, 
6c00: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 7d  SQLITE_AFF_TEXT}
6c10: 2c 0a 20 20 20 20 7b 22 42 4c 4f 42 22 2c 20 34  ,.    {"BLOB", 4
6c20: 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  , SQLITE_AFF_NON
6c30: 45 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20  E},.  };..  if( 
6c40: 6e 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nType==0 ){.    
6c50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
6c60: 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 66 6f  F_NONE;.  }.  fo
6c70: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
6c80: 73 75 62 73 74 72 69 6e 67 73 29 2f 73 69 7a 65  substrings)/size
6c90: 6f 66 28 73 75 62 73 74 72 69 6e 67 73 5b 30 5d  of(substrings[0]
6ca0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  ); i++){.    int
6cb0: 20 63 31 20 3d 20 73 75 62 73 74 72 69 6e 67 73   c1 = substrings
6cc0: 5b 69 5d 2e 7a 53 75 62 5b 30 5d 3b 0a 20 20 20  [i].zSub[0];.   
6cd0: 20 69 6e 74 20 63 32 20 3d 20 74 6f 6c 6f 77 65   int c2 = tolowe
6ce0: 72 28 63 31 29 3b 0a 20 20 20 20 69 6e 74 20 6c  r(c1);.    int l
6cf0: 69 6d 69 74 20 3d 20 6e 54 79 70 65 20 2d 20 73  imit = nType - s
6d00: 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 6e 53 75  ubstrings[i].nSu
6d10: 62 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  b;.    const cha
6d20: 72 20 2a 7a 20 3d 20 73 75 62 73 74 72 69 6e 67  r *z = substring
6d30: 73 5b 69 5d 2e 7a 53 75 62 3b 0a 20 20 20 20 66  s[i].zSub;.    f
6d40: 6f 72 28 6e 3d 30 3b 20 6e 3c 3d 6c 69 6d 69 74  or(n=0; n<=limit
6d50: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; n++){.      in
6d60: 74 20 63 20 3d 20 7a 54 79 70 65 5b 6e 5d 3b 0a  t c = zType[n];.
6d70: 20 20 20 20 20 20 69 66 28 20 28 63 3d 3d 63 31        if( (c==c1
6d80: 20 7c 7c 20 63 3d 3d 63 32 29 0a 20 20 20 20 20   || c==c2).     
6d90: 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
6da0: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 26 7a  lite3StrNICmp(&z
6db0: 54 79 70 65 5b 6e 5d 2c 20 7a 2c 20 73 75 62 73  Type[n], z, subs
6dc0: 74 72 69 6e 67 73 5b 69 5d 2e 6e 53 75 62 29 20  trings[i].nSub) 
6dd0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
6de0: 6e 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e  n substrings[i].
6df0: 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
6e00: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
6e10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
6e20: 4e 55 4d 45 52 49 43 3b 0a 7d 0a 0a 2f 2a 0a 2a  NUMERIC;.}../*.*
6e30: 2a 20 43 6f 6d 65 20 75 70 20 77 69 74 68 20 61  * Come up with a
6e40: 20 6e 65 77 20 72 61 6e 64 6f 6d 20 76 61 6c 75   new random valu
6e50: 65 20 66 6f 72 20 74 68 65 20 73 63 68 65 6d 61  e for the schema
6e60: 20 63 6f 6f 6b 69 65 2e 20 20 4d 61 6b 65 20 73   cookie.  Make s
6e70: 75 72 65 0a 2a 2a 20 74 68 65 20 6e 65 77 20 76  ure.** the new v
6e80: 61 6c 75 65 20 69 73 20 64 69 66 66 65 72 65 6e  alue is differen
6e90: 74 20 66 72 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a  t from the old..
6ea0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  **.** The schema
6eb0: 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20   cookie is used 
6ec0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
6ed0: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  n the schema for
6ee0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
6ef0: 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72   changes.  After
6f00: 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61   each schema cha
6f10: 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20  nge, the cookie 
6f20: 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73  value.** changes
6f30: 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73  .  When a proces
6f40: 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68  s first reads th
6f50: 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f  e schema it reco
6f60: 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69  rds the.** cooki
6f70: 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20  e.  Thereafter, 
6f80: 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73  whenever it goes
6f90: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
6fa0: 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63  atabase,.** it c
6fb0: 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65  hecks the cookie
6fc0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
6fd0: 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74  e schema has not
6fe0: 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63   changed.** sinc
6ff0: 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65  e it was last re
7000: 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70  ad..**.** This p
7010: 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c  lan is not compl
7020: 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f  etely bullet-pro
7030: 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69  of.  It is possi
7040: 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ble for.** the s
7050: 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20  chema to change 
7060: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61  multiple times a
7070: 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69  nd for the cooki
7080: 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62  e to be.** set b
7090: 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c  ack to prior val
70a0: 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20  ue.  But schema 
70b0: 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72  changes are infr
70c0: 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68  equent.** and th
70d0: 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
70e0: 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d   hitting the sam
70f0: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69  e cookie value i
7100: 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e  s only.** 1 chan
7110: 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20  ce in 2^32.  So 
7120: 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67  we're safe enoug
7130: 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  h..*/.void sqlit
7140: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73  e3ChangeCookie(s
7150: 71 6c 69 74 65 20 2a 64 62 2c 20 56 64 62 65 20  qlite *db, Vdbe 
7160: 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  *v, int iDb){.  
7170: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 72 3b  unsigned char r;
7180: 0a 20 20 69 6e 74 20 2a 70 53 63 68 65 6d 61 43  .  int *pSchemaC
7190: 6f 6f 6b 69 65 20 3d 20 26 28 64 62 2d 3e 61 44  ookie = &(db->aD
71a0: 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f  b[iDb].schema_co
71b0: 6f 6b 69 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65  okie);..  sqlite
71c0: 33 52 61 6e 64 6f 6d 6e 65 73 73 28 31 2c 20 26  3Randomness(1, &
71d0: 72 29 3b 0a 20 20 2a 70 53 63 68 65 6d 61 43 6f  r);.  *pSchemaCo
71e0: 6f 6b 69 65 20 3d 20 2a 70 53 63 68 65 6d 61 43  okie = *pSchemaC
71f0: 6f 6f 6b 69 65 20 2b 20 72 20 2b 20 31 3b 0a 20  ookie + r + 1;. 
7200: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
7210: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
7220: 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  es;.  sqlite3Vdb
7230: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
7240: 65 67 65 72 2c 20 2a 70 53 63 68 65 6d 61 43 6f  eger, *pSchemaCo
7250: 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69  okie, 0);.  sqli
7260: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
7270: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
7280: 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, 0);.}../*.** 
7290: 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62  Measure the numb
72a0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
72b0: 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75   needed to outpu
72c0: 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69  t the given.** i
72d0: 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20  dentifier.  The 
72e0: 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
72f0: 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f  includes any quo
7300: 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20  tes used.** but 
7310: 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  does not include
7320: 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e   the null termin
7330: 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
7340: 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28  int identLength(
7350: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
7360: 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e    int n;.  int n
7370: 65 65 64 51 75 6f 74 65 20 3d 20 30 3b 0a 20 20  eedQuote = 0;.  
7380: 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b  for(n=0; *z; n++
7390: 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , z++){.    if( 
73a0: 2a 7a 3d 3d 27 5c 27 27 20 29 7b 20 6e 2b 2b 3b  *z=='\'' ){ n++;
73b0: 20 6e 65 65 64 51 75 6f 74 65 3d 31 3b 20 7d 0a   needQuote=1; }.
73c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b    }.  return n +
73d0: 20 6e 65 65 64 51 75 6f 74 65 2a 32 3b 0a 7d 0a   needQuote*2;.}.
73e0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20  ./*.** Write an 
73f0: 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20  identifier onto 
7400: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 67  the end of the g
7410: 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20 41 64  iven string.  Ad
7420: 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61  d.** quote chara
7430: 63 74 65 72 73 20 61 73 20 6e 65 65 64 65 64 2e  cters as needed.
7440: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7450: 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a  identPut(char *z
7460: 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61  , int *pIdx, cha
7470: 72 20 2a 7a 49 64 65 6e 74 29 7b 0a 20 20 69 6e  r *zIdent){.  in
7480: 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74  t i, j, needQuot
7490: 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a  e;.  i = *pIdx;.
74a0: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
74b0: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
74c0: 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49 64  if( !isalnum(zId
74d0: 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e  ent[j]) && zIden
74e0: 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61  t[j]!='_' ) brea
74f0: 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f  k;.  }.  needQuo
7500: 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d 21  te =  zIdent[j]!
7510: 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28 7a 49  =0 || isdigit(zI
7520: 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20  dent[0]).       
7530: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
7540: 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65  lite3KeywordCode
7550: 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f  (zIdent, j)!=TK_
7560: 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64 51 75  ID;.  if( needQu
7570: 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  ote ) z[i++] = '
7580: 5c 27 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  \'';.  for(j=0; 
7590: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
75a0: 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49  .    z[i++] = zI
75b0: 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  dent[j];.    if(
75c0: 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 5c 27 27   zIdent[j]=='\''
75d0: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27   ) z[i++] = '\''
75e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64  ;.  }.  if( need
75f0: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
7600: 20 27 5c 27 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20   '\'';.  z[i] = 
7610: 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a  0;.  *pIdx = i;.
7620: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
7630: 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  e a CREATE TABLE
7640: 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f   statement appro
7650: 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67  priate for the g
7660: 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20  iven.** table.  
7670: 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74  Memory to hold t
7680: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73  he text of the s
7690: 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61  tatement is obta
76a0: 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c  ined.** from sql
76b0: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
76c0: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
76d0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
76e0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
76f0: 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62   char *createTab
7700: 6c 65 53 74 6d 74 28 54 61 62 6c 65 20 2a 70 29  leStmt(Table *p)
7710: 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b  {.  int i, k, n;
7720: 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a  .  char *zStmt;.
7730: 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a    char *zSep, *z
7740: 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 6e  Sep2, *zEnd;.  n
7750: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
7760: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
7770: 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74  {.    n += ident
7780: 4c 65 6e 67 74 68 28 70 2d 3e 61 43 6f 6c 5b 69  Length(p->aCol[i
7790: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ].zName);.    if
77a0: 28 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79  ( p->aCol[i].zTy
77b0: 70 65 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d  pe ){.      n +=
77c0: 20 28 73 74 72 6c 65 6e 28 70 2d 3e 61 43 6f 6c   (strlen(p->aCol
77d0: 5b 69 5d 2e 7a 54 79 70 65 29 20 2b 20 31 29 3b  [i].zType) + 1);
77e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e 20 2b  .    }.  }.  n +
77f0: 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d  = identLength(p-
7800: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e  >zName);.  if( n
7810: 3c 34 30 20 29 7b 0a 20 20 20 20 7a 53 65 70 20  <40 ){.    zSep 
7820: 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  = "";.    zSep2 
7830: 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20  = ",";.    zEnd 
7840: 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = ")";.  }else{.
7850: 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20      zSep = "\n  
7860: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
7870: 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64  ,\n  ";.    zEnd
7880: 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20   = "\n)";.  }.  
7890: 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e  n += 35 + 6*p->n
78a0: 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73  Col;.  zStmt = s
78b0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
78c0: 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74  n );.  if( zStmt
78d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
78e0: 20 20 73 74 72 63 70 79 28 7a 53 74 6d 74 2c 20    strcpy(zStmt, 
78f0: 70 2d 3e 69 44 62 3d 3d 31 20 3f 20 22 43 52 45  p->iDb==1 ? "CRE
7900: 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 22  ATE TEMP TABLE "
7910: 20 3a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45   : "CREATE TABLE
7920: 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65   ");.  k = strle
7930: 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e  n(zStmt);.  iden
7940: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
7950: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74  p->zName);.  zSt
7960: 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20  mt[k++] = '(';. 
7970: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
7980: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Col; i++){.    s
7990: 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c  trcpy(&zStmt[k],
79a0: 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d   zSep);.    k +=
79b0: 20 73 74 72 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b   strlen(&zStmt[k
79c0: 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a  ]);.    zSep = z
79d0: 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50  Sep2;.    identP
79e0: 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d  ut(zStmt, &k, p-
79f0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  >aCol[i].zName);
7a00: 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c  .    if( p->aCol
7a10: 5b 69 5d 2e 7a 54 79 70 65 20 29 7b 0a 20 20 20  [i].zType ){.   
7a20: 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20     zStmt[k++] = 
7a30: 27 20 27 3b 0a 20 20 20 20 20 20 73 74 72 63 70  ' ';.      strcp
7a40: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 70 2d 3e  y(&zStmt[k], p->
7a50: 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a  aCol[i].zType);.
7a60: 20 20 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65        k += strle
7a70: 6e 28 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79  n(p->aCol[i].zTy
7a80: 70 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pe);.    }.  }. 
7a90: 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b   strcpy(&zStmt[k
7aa0: 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75  ], zEnd);.  retu
7ab0: 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a  rn zStmt;.}../*.
7ac0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7ad0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70  is called to rep
7ae0: 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29  ort the final ")
7af0: 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65  " that terminate
7b00: 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41  s.** a CREATE TA
7b10: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
7b20: 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73  *.** The table s
7b30: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f 74  tructure that ot
7b40: 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  her action routi
7b50: 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62 75  nes have been bu
7b60: 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64  ilding.** is add
7b70: 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e  ed to the intern
7b80: 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20  al hash tables, 
7b90: 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f  assuming no erro
7ba0: 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72  rs have.** occur
7bb0: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e  red..**.** An en
7bc0: 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c  try for the tabl
7bd0: 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65  e is made in the
7be0: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e   master table on
7bf0: 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a   disk, unless.**
7c00: 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
7c10: 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62  rary table or db
7c20: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20  ->init.busy==1. 
7c30: 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62   When db->init.b
7c40: 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61  usy==1.** it mea
7c50: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
7c60: 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
7c70: 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73  ter table becaus
7c80: 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e  e we just.** con
7c90: 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64 61  nected to the da
7ca0: 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75 73  tabase or becaus
7cb0: 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
7cc0: 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a  ter table has.**
7cd0: 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65   recently change
7ce0: 73 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20  s, so the entry 
7cf0: 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 61  for this table a
7d00: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e  lready exists in
7d10: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  .** the sqlite_m
7d20: 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65  aster table.  We
7d30: 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20   do not want to 
7d40: 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e  create it again.
7d50: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53  .**.** If the pS
7d60: 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69  elect argument i
7d70: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d  s not NULL, it m
7d80: 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 72  eans that this r
7d90: 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61  outine.** was ca
7da0: 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
7db0: 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
7dc0: 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45   from a .** "CRE
7dd0: 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53  ATE TABLE ... AS
7de0: 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61   SELECT ..." sta
7df0: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c  tement.  The col
7e00: 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  umn names of.** 
7e10: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69  the new table wi
7e20: 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65 73  ll match the res
7e30: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
7e40: 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ELECT..*/.void s
7e50: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 50  qlite3EndTable(P
7e60: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
7e70: 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65 6c 65 63  ken *pEnd, Selec
7e80: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
7e90: 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74  able *p;.  sqlit
7ea0: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
7eb0: 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64  db;..  if( (pEnd
7ec0: 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d  ==0 && pSelect==
7ed0: 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  0) || pParse->nE
7ee0: 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
7ef0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
7f00: 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72  turn;.  p = pPar
7f10: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
7f20: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
7f30: 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  rn;..  assert( !
7f40: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
7f50: 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20   !pSelect );..  
7f60: 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  /* If the table 
7f70: 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  is generated fro
7f80: 6d 20 61 20 53 45 4c 45 43 54 2c 20 74 68 65 6e  m a SELECT, then
7f90: 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 0a 20   construct the. 
7fa0: 20 2a 2a 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75   ** list of colu
7fb0: 6d 6e 73 20 61 6e 64 20 74 68 65 20 74 65 78 74  mns and the text
7fc0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   of the table.. 
7fd0: 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c 65 63   */.  if( pSelec
7fe0: 74 20 29 7b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  t ){.  }..  /* I
7ff0: 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
8000: 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e  usy is 1 it mean
8010: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
8020: 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
8030: 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
8040: 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65  ster" or "sqlite
8050: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61  _temp_master" ta
8060: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
8070: 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20  .  ** So do not 
8080: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73  write to the dis
8090: 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63  k again.  Extrac
80a0: 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
80b0: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
80c0: 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
80d0: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  he db->init.newT
80e0: 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65  num field.  (The
80f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
8100: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  * should have be
8110: 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20  en put there by 
8120: 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62  the sqliteOpenCb
8130: 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a   routine.).  */.
8140: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
8150: 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e  usy ){.    p->tn
8160: 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
8170: 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  wTnum;.  }..  /*
8180: 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69   If not initiali
8190: 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74  zing, then creat
81a0: 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74  e a record for t
81b0: 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a  he new table.  *
81c0: 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  * in the SQLITE_
81d0: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20  MASTER table of 
81e0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
81f0: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
8200: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65  .  ** for the ne
8210: 77 20 74 61 62 6c 65 20 65 6e 74 72 79 20 73 68  w table entry sh
8220: 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
8230: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  on the stack..  
8240: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  **.  ** If this 
8250: 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74  is a TEMPORARY t
8260: 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20  able, write the 
8270: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61  entry into the a
8280: 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69  uxiliary.  ** fi
8290: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
82a0: 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
82b0: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
82c0: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
82d0: 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  busy ){.    int 
82e0: 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  n;.    Vdbe *v;.
82f0: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
8300: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
8310: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
8320: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 66 28  return;..    if(
8330: 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29   p->pSelect==0 )
8340: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67  {.      /* A reg
8350: 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ular table */.  
8360: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
8370: 70 33 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54  p3(v, OP_CreateT
8380: 61 62 6c 65 2c 20 30 2c 20 70 2d 3e 69 44 62 2c  able, 0, p->iDb,
8390: 20 28 63 68 61 72 2a 29 26 70 2d 3e 74 6e 75 6d   (char*)&p->tnum
83a0: 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20  , P3_POINTER);. 
83b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
83c0: 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20  /* A view */.   
83d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
83e0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
83f0: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  r, 0, 0);.    }.
8400: 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 30 3b      p->tnum = 0;
8410: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
8420: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
8430: 73 65 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20  se, 0, 0);..    
8440: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
8450: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 20  CREATE TABLE xx 
8460: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65  AS SELECT ..., e
8470: 78 65 63 75 74 65 20 74 68 65 20 53 45 4c 45 43  xecute the SELEC
8480: 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65  T.    ** stateme
8490: 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  nt to populate t
84a0: 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68  he new table. Th
84b0: 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  e root-page numb
84c0: 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  er for the.    *
84d0: 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6f  * new table is o
84e0: 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  n the top of the
84f0: 20 76 64 62 65 20 73 74 61 63 6b 2e 0a 20 20 20   vdbe stack..   
8500: 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20   **.    ** Once 
8510: 74 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62  the SELECT has b
8520: 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c  een coded by sql
8530: 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74  ite3Select(), it
8540: 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20   is in a.    ** 
8550: 73 75 69 74 61 62 6c 65 20 73 74 61 74 65 20 74  suitable state t
8560: 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 20  o query for the 
8570: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64  column names and
8580: 20 74 79 70 65 73 20 74 6f 20 62 65 20 75 73 65   types to be use
8590: 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  d.    ** by the 
85a0: 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  new table..    *
85b0: 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  /.    if( pSelec
85c0: 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  t ){.      Table
85d0: 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20 20 20 20   *pSelTab;.     
85e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
85f0: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
8600: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
8610: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
8620: 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e 69 44 62  _Integer, p->iDb
8630: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
8640: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
8650: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
8660: 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
8670: 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20  e->nTab = 2;.   
8680: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
8690: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
86a0: 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20  , SRT_Table, 1, 
86b0: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  0, 0, 0, 0);.   
86c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
86d0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
86e0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   1, 0);.      if
86f0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
8700: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65  0 ){.        pSe
8710: 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
8720: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
8730: 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 65  pParse, 0, pSele
8740: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ct);.        if(
8750: 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65   pSelTab==0 ) re
8760: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  turn;.        as
8770: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30  sert( p->aCol==0
8780: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   );.        p->n
8790: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
87a0: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  Col;.        p->
87b0: 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
87c0: 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53  aCol;.        pS
87d0: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
87e0: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
87f0: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
8800: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
8810: 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61  eTable(0, pSelTa
8820: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
8830: 7d 0a 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33  }.  .    sqlite3
8840: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
8850: 76 2c 20 70 2d 3e 69 44 62 29 3b 0a 0a 20 20 20  v, p->iDb);..   
8860: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
8870: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
8880: 2c 20 30 2c 20 70 2d 3e 70 53 65 6c 65 63 74 3d  , 0, p->pSelect=
8890: 3d 30 3f 22 74 61 62 6c 65 22 3a 22 76 69 65 77  =0?"table":"view
88a0: 22 2c 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  ",P3_STATIC);.  
88b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
88c0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
88d0: 30 2c 20 30 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  0, 0, p->zName, 
88e0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
88f0: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72  dbeOp3(v, OP_Str
8900: 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70 2d 3e 7a  ing8, 0, 0, p->z
8910: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  Name, 0);.    sq
8920: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
8930: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 33 2c 20 30 29  , OP_Pull, 3, 0)
8940: 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  ;..    if( pSele
8950: 63 74 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  ct ){.      char
8960: 20 2a 7a 20 3d 20 63 72 65 61 74 65 54 61 62 6c   *z = createTabl
8970: 65 53 74 6d 74 28 70 29 3b 0a 20 20 20 20 20 20  eStmt(p);.      
8980: 6e 20 3d 20 7a 20 3f 20 73 74 72 6c 65 6e 28 7a  n = z ? strlen(z
8990: 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  ) : 0;.      sql
89a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
89b0: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
89c0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
89d0: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
89e0: 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20   -1, z, n);.    
89f0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
8a00: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8a10: 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74    if( p->pSelect
8a20: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8a30: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
8a40: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20  _String8, 0, 0, 
8a50: 22 43 52 45 41 54 45 20 56 49 45 57 20 22 2c 20  "CREATE VIEW ", 
8a60: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
8a70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8a80: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
8a90: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
8aa0: 2c 20 30 2c 20 22 43 52 45 41 54 45 20 54 41 42  , 0, "CREATE TAB
8ab0: 4c 45 20 22 2c 20 50 33 5f 53 54 41 54 49 43 29  LE ", P3_STATIC)
8ac0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8ad0: 61 73 73 65 72 74 28 20 70 45 6e 64 21 3d 30 20  assert( pEnd!=0 
8ae0: 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 41 64 64  );.      n = Add
8af0: 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64  r(pEnd->z) - Add
8b00: 72 28 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  r(pParse->sNameT
8b10: 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20 20  oken.z) + 1;.   
8b20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8b30: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
8b40: 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  8, 0, 0);.      
8b50: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8b60: 65 50 33 28 76 2c 20 2d 31 2c 20 70 50 61 72 73  eP3(v, -1, pPars
8b70: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 2c  e->sNameToken.z,
8b80: 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   n);.      sqlit
8b90: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
8ba0: 50 5f 43 6f 6e 63 61 74 2c 20 32 2c 20 30 29 3b  P_Concat, 2, 0);
8bb0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
8bc0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
8bd0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30  MakeRecord, 5, 0
8be0: 2c 20 22 74 74 74 69 74 22 2c 20 50 33 5f 53 54  , "tttit", P3_ST
8bf0: 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
8c00: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
8c10: 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20  P_PutIntKey, 0, 
8c20: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  0);.    if( p->i
8c30: 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  Db!=1 ){.      s
8c40: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
8c50: 69 65 28 64 62 2c 20 76 2c 20 70 2d 3e 69 44 62  ie(db, v, p->iDb
8c60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
8c70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
8c80: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
8c90: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  ;..    sqlite3En
8ca0: 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
8cb0: 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20  pParse);.  }..  
8cc0: 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65  /* Add the table
8cd0: 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   to the in-memor
8ce0: 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
8cf0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
8d00: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
8d10: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 20  rse->explain==0 
8d20: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
8d30: 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  =0 ){.    Table 
8d40: 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65 79 20  *pOld;.    FKey 
8d50: 2a 70 46 4b 65 79 3b 0a 20 20 20 20 70 4f 6c 64  *pFKey;.    pOld
8d60: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
8d70: 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d  sert(&db->aDb[p-
8d80: 3e 69 44 62 5d 2e 74 62 6c 48 61 73 68 2c 20 0a  >iDb].tblHash, .
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8da0: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a              p->z
8db0: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e  Name, strlen(p->
8dc0: 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20  zName)+1, p);.  
8dd0: 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20    if( pOld ){.  
8de0: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
8df0: 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  Old );  /* Mallo
8e00: 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
8e10: 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e  ed inside HashIn
8e20: 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20  sert() */.      
8e30: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
8e40: 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70    for(pFKey=p->p
8e50: 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b  FKey; pFKey; pFK
8e60: 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  ey=pFKey->pNextF
8e70: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  rom){.      int 
8e80: 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b  nTo = strlen(pFK
8e90: 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20  ey->zTo) + 1;.  
8ea0: 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74      pFKey->pNext
8eb0: 54 6f 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  To = sqlite3Hash
8ec0: 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70 2d  Find(&db->aDb[p-
8ed0: 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 20 70 46 4b  >iDb].aFKey, pFK
8ee0: 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20  ey->zTo, nTo);. 
8ef0: 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68       sqlite3Hash
8f00: 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b  Insert(&db->aDb[
8f10: 70 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 20 70  p->iDb].aFKey, p
8f20: 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20  FKey->zTo, nTo, 
8f30: 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20  pFKey);.    }.  
8f40: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
8f50: 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  ble = 0;.    db-
8f60: 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64  >nTable++;.    d
8f70: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
8f80: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
8f90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
8fa0: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
8fb0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20  this routine in 
8fc0: 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20  order to create 
8fd0: 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f  a new VIEW.*/.vo
8fe0: 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
8ff0: 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70  View(.  Parse *p
9000: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68  Parse,     /* Th
9010: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
9020: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42  t */.  Token *pB
9030: 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65  egin,     /* The
9040: 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
9050: 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74  at begins the st
9060: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
9070: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
9080: 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
9090: 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
90a0: 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
90b0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
90c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
90d0: 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
90e0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
90f0: 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  w */.  Select *p
9100: 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53  Select,   /* A S
9110: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
9120: 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
9130: 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f   the new view */
9140: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 20 20  .  int isTemp   
9150: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f        /* TRUE fo
9160: 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69  r a TEMPORARY vi
9170: 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ew */.){.  Table
9180: 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20   *p;.  int n;.  
9190: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
91a0: 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44   Token sEnd;.  D
91b0: 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54  bFixer sFix;.  T
91c0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 0a 20 20  oken *pName;..  
91d0: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
91e0: 65 28 70 50 61 72 73 65 2c 20 70 42 65 67 69 6e  e(pParse, pBegin
91f0: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
9200: 2c 20 69 73 54 65 6d 70 2c 20 31 29 3b 0a 20 20  , isTemp, 1);.  
9210: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
9220: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
9230: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
9240: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
9250: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
9260: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
9270: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
9280: 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
9290: 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
92a0: 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69  e2, &pName);.  i
92b0: 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
92c0: 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
92d0: 20 70 2d 3e 69 44 62 2c 20 22 76 69 65 77 22 2c   p->iDb, "view",
92e0: 20 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20 73   pName).    && s
92f0: 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28  qlite3FixSelect(
9300: 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 0a  &sFix, pSelect).
9310: 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
9320: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
9330: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
9340: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  n;.  }..  /* Mak
9350: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
9360: 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74  entire SELECT st
9370: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
9380: 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
9390: 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f   ** This will fo
93a0: 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72  rce all the Expr
93b0: 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20  .token.z values 
93c0: 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
93d0: 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
93e0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69   rather than poi
93f0: 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20  nt to the input 
9400: 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d  string - which m
9410: 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  eans that.  ** t
9420: 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74  hey will persist
9430: 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65   after the curre
9440: 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  nt sqlite3_exec(
9450: 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a  ) call returns..
9460: 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63    */.  p->pSelec
9470: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
9480: 74 44 75 70 28 70 53 65 6c 65 63 74 29 3b 0a 20  tDup(pSelect);. 
9490: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
94a0: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
94b0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62   if( !pParse->db
94c0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
94d0: 20 20 20 73 71 6c 69 74 65 33 56 69 65 77 47 65     sqlite3ViewGe
94e0: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
94f0: 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20  rse, p);.  }..  
9500: 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e  /* Locate the en
9510: 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  d of the CREATE 
9520: 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20  VIEW statement. 
9530: 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74   Make sEnd point
9540: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64   to.  ** the end
9550: 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20  ..  */.  sEnd = 
9560: 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
9570: 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a  en;.  if( sEnd.z
9580: 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a  [0]!=0 && sEnd.z
9590: 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20  [0]!=';' ){.    
95a0: 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e  sEnd.z += sEnd.n
95b0: 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d  ;.  }.  sEnd.n =
95c0: 20 30 3b 0a 20 20 6e 20 3d 20 28 28 69 6e 74 29   0;.  n = ((int)
95d0: 73 45 6e 64 2e 7a 29 20 2d 20 28 69 6e 74 29 70  sEnd.z) - (int)p
95e0: 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20  Begin->z;.  z = 
95f0: 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69  pBegin->z;.  whi
9600: 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d  le( n>0 && (z[n-
9610: 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61  1]==';' || isspa
9620: 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e  ce(z[n-1])) ){ n
9630: 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d  --; }.  sEnd.z =
9640: 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64   &z[n-1];.  sEnd
9650: 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73  .n = 1;..  /* Us
9660: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
9670: 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76  e() to add the v
9680: 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54  iew to the SQLIT
9690: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a  E_MASTER table *
96a0: 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61  /.  sqlite3EndTa
96b0: 62 6c 65 28 70 50 61 72 73 65 2c 20 26 73 45 6e  ble(pParse, &sEn
96c0: 64 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b  d, 0);.  return;
96d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61  .}../*.** The Ta
96e0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54  ble structure pT
96f0: 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  able is really a
9700: 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20   VIEW.  Fill in 
9710: 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  the names of.** 
9720: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
9730: 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70  he view in the p
9740: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e  Table structure.
9750: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
9760: 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73  ber.** of errors
9770: 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  .  If an error i
9780: 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20  s seen leave an 
9790: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
97a0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
97b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
97c0: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
97d0: 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
97e0: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
97f0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  {.  ExprList *pE
9800: 4c 69 73 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  List;.  Select *
9810: 70 53 65 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70  pSel;.  Table *p
9820: 53 65 6c 54 61 62 3b 0a 20 20 69 6e 74 20 6e 45  SelTab;.  int nE
9830: 72 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  rr = 0;..  asser
9840: 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 20 20  t( pTable );..  
9850: 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43  /* A positive nC
9860: 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c  ol means the col
9870: 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74  umns names for t
9880: 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a  his view are.  *
9890: 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e  * already known.
98a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
98b0: 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74  le->nCol>0 ) ret
98c0: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e  urn 0;..  /* A n
98d0: 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20  egative nCol is 
98e0: 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72  a special marker
98f0: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65   meaning that we
9900: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20   are currently. 
9910: 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f   ** trying to co
9920: 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e  mpute the column
9930: 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65   names.  If we e
9940: 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  nter this routin
9950: 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65  e with.  ** a ne
9960: 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20  gative nCol, it 
9970: 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72  means two or mor
9980: 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c  e views form a l
9990: 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  oop, like this:.
99a0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52    **.  **     CR
99b0: 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53  EATE VIEW one AS
99c0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
99d0: 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  wo;.  **     CRE
99e0: 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20  ATE VIEW two AS 
99f0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e  SELECT * FROM on
9a00: 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74  e;.  **.  ** Act
9a10: 75 61 6c 6c 79 2c 20 74 68 69 73 20 65 72 72 6f  ually, this erro
9a20: 72 20 69 73 20 63 61 75 67 68 74 20 70 72 65 76  r is caught prev
9a30: 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20 74 68  iously and so th
9a40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
9a50: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77  .  ** should alw
9a60: 61 79 73 20 66 61 69 6c 2e 20 20 42 75 74 20 77  ays fail.  But w
9a70: 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 69 74 20  e will leave it 
9a80: 69 6e 20 70 6c 61 63 65 20 6a 75 73 74 20 74 6f  in place just to
9a90: 20 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20   be safe..  */. 
9aa0: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
9ab0: 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  l<0 ){.    sqlit
9ac0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9ad0: 65 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63  e, "view %s is c
9ae0: 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65  ircularly define
9af0: 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  d", pTable->zNam
9b00: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
9b10: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
9b20: 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
9b30: 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64  it means we need
9b40: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
9b50: 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  table names..  *
9b60: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
9b70: 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 20 2f  le->pSelect ); /
9b80: 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c 20 74 68  * If nCol==0, th
9b90: 65 6e 20 70 54 61 62 6c 65 20 6d 75 73 74 20 62  en pTable must b
9ba0: 65 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 70 53  e a VIEW */.  pS
9bb0: 65 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 70 53 65  el = pTable->pSe
9bc0: 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65  lect;..  /* Note
9bd0: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74   that the call t
9be0: 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  o sqlite3ResultS
9bf0: 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c  etOfSelect() wil
9c00: 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a  l expand any.  *
9c10: 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69  * "*" elements i
9c20: 6e 20 74 68 69 73 20 6c 69 73 74 2e 20 20 42 75  n this list.  Bu
9c30: 74 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  t we will need t
9c40: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 6c 69  o restore the li
9c50: 73 74 0a 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20  st.  ** back to 
9c60: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  its original con
9c70: 66 69 67 75 72 61 74 69 6f 6e 20 61 66 74 65 72  figuration after
9c80: 77 61 72 64 73 2c 20 73 6f 20 77 65 20 73 61 76  wards, so we sav
9c90: 65 20 61 20 63 6f 70 79 20 6f 66 0a 20 20 2a 2a  e a copy of.  **
9ca0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e   the original in
9cb0: 20 70 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20   pEList..  */.  
9cc0: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 2d 3e 70  pEList = pSel->p
9cd0: 45 4c 69 73 74 3b 0a 20 20 70 53 65 6c 2d 3e 70  EList;.  pSel->p
9ce0: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
9cf0: 78 70 72 4c 69 73 74 44 75 70 28 70 45 4c 69 73  xprListDup(pELis
9d00: 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 2d 3e  t);.  if( pSel->
9d10: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
9d20: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20   pSel->pEList = 
9d30: 70 45 4c 69 73 74 3b 0a 20 20 20 20 72 65 74 75  pEList;.    retu
9d40: 72 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  rn 1;  /* Malloc
9d50: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20   failed */.  }. 
9d60: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
9d70: 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d 20  -1;.  pSelTab = 
9d80: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
9d90: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
9da0: 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 69 66 28   0, pSel);.  if(
9db0: 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20   pSelTab ){.    
9dc0: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
9dd0: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70  aCol==0 );.    p
9de0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53  Table->nCol = pS
9df0: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
9e00: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
9e10: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
9e20: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
9e30: 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61   = 0;.    pSelTa
9e40: 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
9e50: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
9e60: 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b  ble(0, pSelTab);
9e70: 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72  .    DbSetProper
9e80: 74 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ty(pParse->db, p
9e90: 54 61 62 6c 65 2d 3e 69 44 62 2c 20 44 42 5f 55  Table->iDb, DB_U
9ea0: 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 20 20  nresetViews);.  
9eb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 6c  }else{.    pTabl
9ec0: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  e->nCol = 0;.   
9ed0: 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73   nErr++;.  }.  s
9ee0: 71 6c 69 74 65 33 53 65 6c 65 63 74 55 6e 62 69  qlite3SelectUnbi
9ef0: 6e 64 28 70 53 65 6c 29 3b 0a 20 20 73 71 6c 69  nd(pSel);.  sqli
9f00: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
9f10: 65 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b  e(pSel->pEList);
9f20: 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20  .  pSel->pEList 
9f30: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 72 65 74 75  = pEList;.  retu
9f40: 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a  rn nErr;  .}../*
9f50: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f  .** Clear the co
9f60: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
9f70: 74 68 65 20 56 49 45 57 20 70 54 61 62 6c 65 2e  the VIEW pTable.
9f80: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9f90: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
9fa0: 65 6e 65 76 65 72 20 61 6e 79 20 6f 74 68 65 72  enever any other
9fb0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69   table or view i
9fc0: 73 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 54  s modified..** T
9fd0: 68 65 20 76 69 65 77 20 70 61 73 73 65 64 20 69  he view passed i
9fe0: 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nto this routine
9ff0: 20 6d 69 67 68 74 20 64 65 70 65 6e 64 20 64 69   might depend di
a000: 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65  rectly or indire
a010: 63 74 6c 79 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d  ctly.** on the m
a020: 6f 64 69 66 69 65 64 20 6f 72 20 64 65 6c 65 74  odified or delet
a030: 65 64 20 74 61 62 6c 65 20 73 6f 20 77 65 20 6e  ed table so we n
a040: 65 65 64 20 74 6f 20 63 6c 65 61 72 20 74 68 65  eed to clear the
a050: 20 6f 6c 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e   old column.** n
a060: 61 6d 65 73 20 73 6f 20 74 68 61 74 20 74 68 65  ames so that the
a070: 79 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 6d 70  y will be recomp
a080: 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
a090: 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52  void sqliteViewR
a0a0: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
a0b0: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
a0c0: 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d    int i;.  Colum
a0d0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72  n *pCol;.  asser
a0e0: 74 28 20 70 54 61 62 6c 65 21 3d 30 20 26 26 20  t( pTable!=0 && 
a0f0: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 21  pTable->pSelect!
a100: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  =0 );.  for(i=0,
a110: 20 70 43 6f 6c 3d 70 54 61 62 6c 65 2d 3e 61 43   pCol=pTable->aC
a120: 6f 6c 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  ol; i<pTable->nC
a130: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
a140: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
a150: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pCol->zName);. 
a160: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43     sqliteFree(pC
a170: 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20  ol->zDflt);.    
a180: 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d  sqliteFree(pCol-
a190: 3e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73  >zType);.  }.  s
a1a0: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
a1b0: 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70 54 61 62 6c  ->aCol);.  pTabl
a1c0: 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  e->aCol = 0;.  p
a1d0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
a1e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
a1f0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
a200: 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57   from every VIEW
a210: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78   in database idx
a220: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a230: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
a240: 41 6c 6c 28 73 71 6c 69 74 65 20 2a 64 62 2c 20  All(sqlite *db, 
a250: 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68  int idx){.  Hash
a260: 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21  Elem *i;.  if( !
a270: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
a280: 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
a290: 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e  tViews) ) return
a2a0: 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
a2b0: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
a2c0: 44 62 5b 69 64 78 5d 2e 74 62 6c 48 61 73 68 29  Db[idx].tblHash)
a2d0: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
a2e0: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54  hNext(i)){.    T
a2f0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
a300: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
a310: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
a320: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73  elect ){.      s
a330: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 43 6f  qliteViewResetCo
a340: 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b  lumnNames(pTab);
a350: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43  .    }.  }.  DbC
a360: 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c  learProperty(db,
a370: 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
a380: 56 69 65 77 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Views);.}../*.**
a390: 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20   Given a token, 
a3a0: 6c 6f 6f 6b 20 75 70 20 61 20 74 61 62 6c 65 20  look up a table 
a3b0: 77 69 74 68 20 74 68 61 74 20 6e 61 6d 65 2e 20  with that name. 
a3c0: 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c   If not found, l
a3d0: 65 61 76 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  eave.** an error
a3e0: 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20   for the parser 
a3f0: 74 6f 20 66 69 6e 64 20 61 6e 64 20 72 65 74 75  to find and retu
a400: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c  rn NULL..*/.Tabl
a410: 65 20 2a 73 71 6c 69 74 65 33 54 61 62 6c 65 46  e *sqlite3TableF
a420: 72 6f 6d 54 6f 6b 65 6e 28 50 61 72 73 65 20 2a  romToken(Parse *
a430: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
a440: 54 6f 6b 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  Tok){.  char *zN
a450: 61 6d 65 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ame;.  Table *pT
a460: 61 62 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71  ab;.  zName = sq
a470: 6c 69 74 65 33 54 61 62 6c 65 4e 61 6d 65 46 72  lite3TableNameFr
a480: 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29 3b 0a 20  omToken(pTok);. 
a490: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
a4a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 54 61 62  return 0;.  pTab
a4b0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
a4c0: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
a4d0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c  zName, 0);.  sql
a4e0: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
a4f0: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
a500: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
a510: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
a520: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 54 22   such table: %T"
a530: 2c 20 70 54 6f 6b 29 3b 0a 20 20 7d 0a 20 20 72  , pTok);.  }.  r
a540: 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f  eturn pTab;.}../
a550: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a560: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64  e is called to d
a570: 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20  o the work of a 
a580: 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65  DROP TABLE state
a590: 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69  ment..** pName i
a5a0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
a5b0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72  e table to be dr
a5c0: 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  opped..*/.void s
a5d0: 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28  qlite3DropTable(
a5e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
a5f0: 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69  rcList *pName, i
a600: 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20 54 61  nt isView){.  Ta
a610: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62  ble *pTab;.  Vdb
a620: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 62 61 73 65  e *v;.  int base
a630: 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
a640: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
a650: 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70  nt iDb;..  if( p
a660: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
a670: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
a680: 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74  iled ) goto exit
a690: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 61  _drop_table;.  a
a6a0: 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
a6b0: 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20  rc==1 );.  pTab 
a6c0: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
a6d0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61  able(pParse, pNa
a6e0: 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
a6f0: 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
a700: 61 62 61 73 65 29 3b 0a 0a 20 20 69 66 28 20 70  abase);..  if( p
a710: 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  Tab==0 ) goto ex
a720: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
a730: 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62   iDb = pTab->iDb
a740: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
a750: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
a760: 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  b );.#ifndef SQL
a770: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
a780: 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
a790: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e  nt code;.    con
a7a0: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
a7b0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 54 61  SCHEMA_TABLE(pTa
a7c0: 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e  b->iDb);.    con
a7d0: 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
a7e0: 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62  b->aDb[pTab->iDb
a7f0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
a800: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
a810: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
a820: 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
a830: 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67  , zDb)){.      g
a840: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
a850: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ble;.    }.    i
a860: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
a870: 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b     if( iDb==1 ){
a880: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
a890: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
a8a0: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
a8b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
a8c0: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
a8d0: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
a8e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
a8f0: 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  ( iDb==1 ){.    
a900: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
a910: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
a920: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
a930: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
a940: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
a950: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a960: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
a970: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
a980: 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61   code, pTab->zNa
a990: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
a9a0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
a9b0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
a9c0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
a9d0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
a9e0: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
a9f0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c   pTab->zName, 0,
aa00: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
aa10: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
aa20: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ble;.    }.  }.#
aa30: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 54 61 62  endif.  if( pTab
aa40: 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
aa50: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
aa60: 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
aa70: 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64   %s may not be d
aa80: 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a  ropped", pTab->z
aa90: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 72 73  Name);.    pPars
aaa0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67  e->nErr++;.    g
aab0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
aac0: 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  ble;.  }.  if( i
aad0: 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
aae0: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
aaf0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
ab00: 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
ab10: 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65  OP TABLE to dele
ab20: 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54  te table %s", pT
ab30: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
ab40: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
ab50: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
ab60: 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d  !isView && pTab-
ab70: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
ab80: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
ab90: 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
aba0: 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65  P VIEW to delete
abb0: 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d   view %s", pTab-
abc0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
abd0: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
abe0: 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  e;.  }..  /* Gen
abf0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
ac00: 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66  move the table f
ac10: 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
ac20: 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73  able.  ** on dis
ac30: 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  k..  */.  v = sq
ac40: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
ac50: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
ac60: 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
ac70: 4f 70 4c 69 73 74 20 64 72 6f 70 54 61 62 6c 65  OpList dropTable
ac80: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f  [] = {.      { O
ac90: 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c  P_Rewind,     0,
aca0: 20 41 44 44 52 28 31 33 29 2c 20 30 7d 2c 0a 20   ADDR(13), 0},. 
acb0: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
acc0: 38 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  8,    0, 0,     
acd0: 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20     0}, /* 1 */. 
ace0: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f       { OP_MemSto
acf0: 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20  re,   1, 1,     
ad00: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
ad10: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c  P_MemLoad,    1,
ad20: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   0,        0}, /
ad30: 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 3 */.      { O
ad40: 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c  P_Column,     0,
ad50: 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   2,        0}, /
ad60: 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 2e  * sqlite_master.
ad70: 74 62 6c 5f 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  tbl_name */.    
ad80: 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20    { OP_Ne,      
ad90: 20 20 20 30 2c 20 41 44 44 52 28 31 32 29 2c 20     0, ADDR(12), 
ada0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53  0},.      { OP_S
adb0: 74 72 69 6e 67 38 2c 20 20 20 20 30 2c 20 30 2c  tring8,    0, 0,
adc0: 20 20 20 20 20 20 20 20 22 74 72 69 67 67 65 72          "trigger
add0: 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  "},.      { OP_C
ade0: 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 32 2c  olumn,     0, 2,
adf0: 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 73          0}, /* s
ae00: 71 6c 69 74 65 5f 6d 61 73 74 65 72 2e 74 79 70  qlite_master.typ
ae10: 65 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  e */.      { OP_
ae20: 45 71 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41  Eq,         0, A
ae30: 44 44 52 28 31 32 29 2c 20 30 7d 2c 0a 20 20 20  DDR(12), 0},.   
ae40: 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20     { OP_Delete, 
ae50: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
ae60: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
ae70: 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41  Rewind,     0, A
ae80: 44 44 52 28 31 33 29 2c 20 30 7d 2c 0a 20 20 20  DDR(13), 0},.   
ae90: 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20     { OP_Goto,   
aea0: 20 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20      0, ADDR(3), 
aeb0: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
aec0: 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41  Next,       0, A
aed0: 44 44 52 28 33 29 2c 20 20 30 7d 2c 20 2f 2a 20  DDR(3),  0}, /* 
aee0: 31 32 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20  12 */.    };.   
aef0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
af00: 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
af10: 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ger;.    sqlite3
af20: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
af30: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ion(pParse, 0, p
af40: 54 61 62 2d 3e 69 44 62 29 3b 0a 0a 20 20 20 20  Tab->iDb);..    
af50: 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67  /* Drop all trig
af60: 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  gers associated 
af70: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62  with the table b
af80: 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f  eing dropped. Co
af90: 64 65 0a 20 20 20 20 2a 2a 20 69 73 20 67 65 6e  de.    ** is gen
afa0: 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65  erated to remove
afb0: 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71   entries from sq
afc0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f  lite_master and/
afd0: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
afe0: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20  _temp_master if 
aff0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
b000: 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20  .    pTrigger = 
b010: 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a  pTab->pTrigger;.
b020: 20 20 20 20 77 68 69 6c 65 28 20 70 54 72 69 67      while( pTrig
b030: 67 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ger ){.      ass
b040: 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 69  ert( pTrigger->i
b050: 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 7c 7c  Db==pTab->iDb ||
b060: 20 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d   pTrigger->iDb==
b070: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
b080: 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72  e3DropTriggerPtr
b090: 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
b0a0: 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  r, 1);.      if(
b0b0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
b0c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 69   ){.        pTri
b0d0: 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d  gger = pTrigger-
b0e0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65  >pNext;.      }e
b0f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 72  lse{.        pTr
b100: 69 67 67 65 72 20 3d 20 70 54 61 62 2d 3e 70 54  igger = pTab->pT
b110: 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20 7d 0a  rigger;.      }.
b120: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72      }..    /* Dr
b130: 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41  op all SQLITE_MA
b140: 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69  STER table and i
b150: 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61  ndex entries tha
b160: 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20  t refer to the. 
b170: 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65     ** table. The
b180: 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f   program name lo
b190: 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ops through the 
b1a0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
b1b0: 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20   deletes.    ** 
b1c0: 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72  every row that r
b1d0: 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
b1e0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
b1f0: 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69  e as the one bei
b200: 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70 65  ng.    ** droppe
b210: 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20  d. Triggers are 
b220: 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74 65  handled seperate
b230: 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69  ly because a tri
b240: 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20 20  gger can be.    
b250: 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  ** created in th
b260: 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
b270: 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
b280: 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65   table in anothe
b290: 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  r.    ** databas
b2a0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
b2b0: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
b2c0: 61 62 6c 65 28 76 2c 20 70 54 61 62 2d 3e 69 44  able(v, pTab->iD
b2d0: 62 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20 73  b);.    base = s
b2e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
b2f0: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
b300: 28 64 72 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f  (dropTable), dro
b310: 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c  pTable);.    sql
b320: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
b330: 28 76 2c 20 62 61 73 65 2b 31 2c 20 70 54 61 62  (v, base+1, pTab
b340: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
b350: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
b360: 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70 54 61 62  okie(db, v, pTab
b370: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  ->iDb);.    sqli
b380: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b390: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
b3a0: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
b3b0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b3c0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b3d0: 5f 44 65 73 74 72 6f 79 2c 20 70 54 61 62 2d 3e  _Destroy, pTab->
b3e0: 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 69 44 62 29  tnum, pTab->iDb)
b3f0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78  ;.      for(pIdx
b400: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
b410: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
b420: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
b430: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b440: 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20  (v, OP_Destroy, 
b450: 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 49 64 78  pIdx->tnum, pIdx
b460: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a  ->iDb);.      }.
b470: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
b480: 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  3EndWriteOperati
b490: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  on(pParse);.  }.
b4a0: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65  .  /* Delete the
b4b0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 63 72   in-memory descr
b4c0: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61  iption of the ta
b4d0: 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ble..  **.  ** E
b4e0: 78 63 65 70 74 69 6f 6e 3a 20 69 66 20 74 68 65  xception: if the
b4f0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62   SQL statement b
b500: 65 67 61 6e 20 77 69 74 68 20 74 68 65 20 45 58  egan with the EX
b510: 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 2c 0a 20  PLAIN keyword,. 
b520: 20 2a 2a 20 74 68 65 6e 20 6e 6f 20 63 68 61 6e   ** then no chan
b530: 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 6d 61  ges should be ma
b540: 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  de..  */.  if( !
b550: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
b560: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c  ){.    sqliteUnl
b570: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c  inkAndDeleteTabl
b580: 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
b590: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
b5a0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
b5b0: 65 73 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  es;.  }.  sqlite
b5c0: 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c  ViewResetAll(db,
b5d0: 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f   iDb);..exit_dro
b5e0: 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74  p_table:.  sqlit
b5f0: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
b600: 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
b610: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
b620: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
b630: 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20  e a new foreign 
b640: 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  key on the table
b650: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
b660: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
b670: 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65  .  pFromCol dete
b680: 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c  rmines which col
b690: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63  umns.** in the c
b6a0: 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69  urrent table poi
b6b0: 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67  nt to the foreig
b6c0: 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d  n key.  If pFrom
b6d0: 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63  Col==0 then.** c
b6e0: 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74  onnect the key t
b6f0: 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  o the last colum
b700: 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f  n inserted.  pTo
b710: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a   is the name of.
b720: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66  ** the table ref
b730: 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f  erred to.  pToCo
b740: 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74  l is a list of t
b750: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68  ables in the oth
b760: 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20  er.** pTo table 
b770: 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e  that the foreign
b780: 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20   key points to. 
b790: 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20   flags contains 
b7a0: 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  all.** informati
b7b0: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  on about the con
b7c0: 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
b7d0: 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63   algorithms spec
b7e0: 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  ified.** in the 
b7f0: 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50  ON DELETE, ON UP
b800: 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45  DATE and ON INSE
b810: 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  RT clauses..**.*
b820: 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74  * An FKey struct
b830: 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61  ure is created a
b840: 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
b850: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a  table currently.
b860: 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ** under constru
b870: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61  ction in the pPa
b880: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66  rse->pNewTable f
b890: 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20 46  ield.  The new F
b8a0: 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69  Key.** is not li
b8b0: 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46  nked into db->aF
b8c0: 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e  Key at this poin
b8d0: 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  t - that does no
b8e0: 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69  t happen.** unti
b8f0: 6c 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  l sqlite3EndTabl
b900: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  e()..**.** The f
b910: 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65  oreign key is se
b920: 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20  t for IMMEDIATE 
b930: 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73  processing.  A s
b940: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a  ubsequent call.*
b950: 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65  * to sqlite3Defe
b960: 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69  rForeignKey() mi
b970: 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20  ght change this 
b980: 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a  to DEFERRED..*/.
b990: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
b9a0: 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20  teForeignKey(.  
b9b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b9c0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
b9d0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 64 4c  context */.  IdL
b9e0: 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20  ist *pFromCol,  
b9f0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
ba00: 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20  this table that 
ba10: 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74  point to other t
ba20: 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  able */.  Token 
ba30: 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  *pTo,          /
ba40: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74  * Name of the ot
ba50: 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49  her table */.  I
ba60: 64 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20  dList *pToCol,  
ba70: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69      /* Columns i
ba80: 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c  n the other tabl
ba90: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
bab0: 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
bac0: 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a  on algorithms. *
bad0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20  /.){.  Table *p 
bae0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
baf0: 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  ble;.  int nByte
bb00: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
bb10: 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a   nCol;.  char *z
bb20: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20  ;.  FKey *pFKey 
bb30: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
bb40: 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  pTo!=0 );.  if( 
bb50: 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
bb60: 6e 45 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65  nErr ) goto fk_e
bb70: 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43  nd;.  if( pFromC
bb80: 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ol==0 ){.    int
bb90: 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d   iCol = p->nCol-
bba0: 31 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  1;.    if( iCol<
bbb0: 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  0 ) goto fk_end;
bbc0: 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  .    if( pToCol 
bbd0: 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d  && pToCol->nId!=
bbe0: 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
bbf0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
bc00: 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20  e, "foreign key 
bc10: 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20 20  on %s".         
bc20: 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e  " should referen
bc30: 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75  ce only one colu
bc40: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c  mn of table %T",
bc50: 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  .         p->aCo
bc60: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70  l[iCol].zName, p
bc70: 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  To);.      goto 
bc80: 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  fk_end;.    }.  
bc90: 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65    nCol = 1;.  }e
bca0: 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26  lse if( pToCol &
bcb0: 26 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 70  & pToCol->nId!=p
bcc0: 46 72 6f 6d 43 6f 6c 2d 3e 6e 49 64 20 29 7b 0a  FromCol->nId ){.
bcd0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
bce0: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
bcf0: 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63      "number of c
bd00: 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67  olumns in foreig
bd10: 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d  n key does not m
bd20: 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20  atch the number 
bd30: 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f  of ".        "co
bd40: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66  lumns in the ref
bd50: 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b  erenced table");
bd60: 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
bd70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
bd80: 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Col = pFromCol->
bd90: 6e 49 64 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  nId;.  }.  nByte
bda0: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79   = sizeof(*pFKey
bdb0: 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28  ) + nCol*sizeof(
bdc0: 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20  pFKey->aCol[0]) 
bdd0: 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20  + pTo->n + 1;.  
bde0: 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
bdf0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f    for(i=0; i<pTo
be00: 43 6f 6c 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  Col->nId; i++){.
be10: 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73        nByte += s
be20: 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b  trlen(pToCol->a[
be30: 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
be40: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
be50: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
be60: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
be70: 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20  pFKey==0 ) goto 
be80: 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d  fk_end;.  pFKey-
be90: 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46  >pFrom = p;.  pF
bea0: 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d  Key->pNextFrom =
beb0: 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d   p->pFKey;.  z =
bec0: 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31   (char*)&pFKey[1
bed0: 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  ];.  pFKey->aCol
bee0: 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d   = (struct sColM
bef0: 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69  ap*)z;.  z += si
bf00: 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c  zeof(struct sCol
bf10: 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b  Map)*nCol;.  pFK
bf20: 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d  ey->zTo = z;.  m
bf30: 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c  emcpy(z, pTo->z,
bf40: 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54   pTo->n);.  z[pT
bf50: 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b  o->n] = 0;.  z +
bf60: 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46  = pTo->n+1;.  pF
bf70: 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30  Key->pNextTo = 0
bf80: 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20  ;.  pFKey->nCol 
bf90: 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46  = nCol;.  if( pF
bfa0: 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
bfb0: 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e   pFKey->aCol[0].
bfc0: 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  iFrom = p->nCol-
bfd0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
bfe0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
bff0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
c000: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
c010: 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b  0; j<p->nCol; j+
c020: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
c030: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
c040: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
c050: 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
c060: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
c070: 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43         pFKey->aC
c080: 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b  ol[i].iFrom = j;
c090: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
c0a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c0b0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e    }.      if( j>
c0c0: 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  =p->nCol ){.    
c0d0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
c0e0: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
c0f0: 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20         "unknown 
c100: 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e  column \"%s\" in
c110: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
c120: 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20  inition", .     
c130: 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61       pFromCol->a
c140: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
c150: 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
c160: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c170: 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20   }.  if( pToCol 
c180: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
c190: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
c1a0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
c1b0: 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  en(pToCol->a[i].
c1c0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46  zName);.      pF
c1d0: 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
c1e0: 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d  l = z;.      mem
c1f0: 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61  cpy(z, pToCol->a
c200: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  [i].zName, n);. 
c210: 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20       z[n] = 0;. 
c220: 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20       z += n+1;. 
c230: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
c240: 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30  ->isDeferred = 0
c250: 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74  ;.  pFKey->delet
c260: 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20  eConf = flags & 
c270: 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75  0xff;.  pFKey->u
c280: 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61  pdateConf = (fla
c290: 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66  gs >> 8 ) & 0xff
c2a0: 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72  ;.  pFKey->inser
c2b0: 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e  tConf = (flags >
c2c0: 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a  > 16 ) & 0xff;..
c2d0: 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f    /* Link the fo
c2e0: 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65  reign key to the
c2f0: 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61   table as the la
c300: 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  st step..  */.  
c310: 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79  p->pFKey = pFKey
c320: 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a  ;.  pFKey = 0;..
c330: 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  fk_end:.  sqlite
c340: 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 73  Free(pFKey);.  s
c350: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
c360: 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20  te(pFromCol);.  
c370: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
c380: 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a  ete(pToCol);.}..
c390: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
c3a0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
c3b0: 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49  n an INITIALLY I
c3c0: 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54  MMEDIATE or INIT
c3d0: 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a  IALLY DEFERRED.*
c3e0: 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e  * clause is seen
c3f0: 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f   as part of a fo
c400: 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
c410: 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66  tion.  The isDef
c420: 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74  erred.** paramet
c430: 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54  er is 1 for INIT
c440: 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61  IALLY DEFERRED a
c450: 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c  nd 0 for INITIAL
c460: 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a  LY IMMEDIATE..**
c470: 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   The behavior of
c480: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
c490: 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69  ly created forei
c4a0: 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74  gn key is adjust
c4b0: 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c  ed.** accordingl
c4c0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
c4d0: 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
c4e0: 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
c4f0: 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29   int isDeferred)
c500: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
c510: 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a  .  FKey *pFKey;.
c520: 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50    if( (pTab = pP
c530: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
c540: 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20  ==0 || (pFKey = 
c550: 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20  pTab->pFKey)==0 
c560: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65  ) return;.  pFKe
c570: 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
c580: 69 73 44 65 66 65 72 72 65 64 3b 0a 7d 0a 0a 2f  isDeferred;.}../
c590: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
c5a0: 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53  w index for an S
c5b0: 51 4c 20 74 61 62 6c 65 2e 20 20 70 49 6e 64 65  QL table.  pInde
c5c0: 78 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  x is the name of
c5d0: 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61   the index .** a
c5e0: 6e 64 20 70 54 61 62 6c 65 20 69 73 20 74 68 65  nd pTable is the
c5f0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
c600: 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
c610: 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20   indexed.  Both 
c620: 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c  will .** be NULL
c630: 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b   for a primary k
c640: 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74  ey or an index t
c650: 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74  hat is created t
c660: 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55  o satisfy a.** U
c670: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
c680: 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64  .  If pTable and
c690: 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c   pIndex are NULL
c6a0: 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  , use pParse->pN
c6b0: 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68  ewTable.** as th
c6c0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
c6d0: 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e  dexed.  pParse->
c6e0: 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74  pNewTable is a t
c6f0: 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  able that is.** 
c700: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
c710: 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61  constructed by a
c720: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
c730: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70  atement..**.** p
c740: 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
c750: 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
c760: 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20  indexed.  pList 
c770: 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  will be NULL if 
c780: 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69  this.** is a pri
c790: 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71  mary key or uniq
c7a0: 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  ue-constraint on
c7b0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
c7c0: 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a   column added.**
c7d0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
c7e0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
c7f0: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f  nstruction.  .*/
c800: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
c810: 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ateIndex(.  Pars
c820: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
c830: 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  All information 
c840: 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65  about this parse
c850: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
c860: 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20  me1,   /* First 
c870: 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
c880: 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
c890: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
c8a0: 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  e2,   /* Second 
c8b0: 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
c8c0: 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
c8d0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
c8e0: 62 6c 4e 61 6d 65 2c 20 2f 2a 20 4e 61 6d 65 20  blName, /* Name 
c8f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
c900: 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73  index. Use pPars
c910: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20  e->pNewTable if 
c920: 30 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70  0 */.  IdList *p
c930: 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73  List,   /* A lis
c940: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
c950: 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
c960: 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
c970: 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45   /* OE_Abort, OE
c980: 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c  _Ignore, OE_Repl
c990: 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20  ace, or OE_None 
c9a0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61  */.  Token *pSta
c9b0: 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 43 52 45  rt,   /* The CRE
c9c0: 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
c9d0: 65 67 69 6e 73 20 61 20 43 52 45 41 54 45 20 54  egins a CREATE T
c9e0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  ABLE statement *
c9f0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20  /.  Token *pEnd 
ca00: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20       /* The ")" 
ca10: 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20  that closes the 
ca20: 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
ca30: 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54  tement */.){.  T
ca40: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
ca50: 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69  /* Table to be i
ca60: 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ndexed */.  Inde
ca70: 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 2f 2a 20  x *pIndex;   /* 
ca80: 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
ca90: 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61  created */.  cha
caa0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
cab0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65  int i, j;.  Toke
cac0: 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 2f 2a 20  n nullId;    /* 
cad0: 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61  Fake token for a
cae0: 6e 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20  n empty ID list 
caf0: 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  */.  DbFixer sFi
cb00: 78 3b 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73  x;    /* For ass
cb10: 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  igning database 
cb20: 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20  names to pTable 
cb30: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 3b  */.  int isTemp;
cb40: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
cb50: 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 69 6e  r a temporary in
cb60: 64 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20  dex */.  sqlite 
cb70: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
cb80: 3b 0a 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  ;..  int iDb;   
cb90: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
cba0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
cbb0: 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 77 72  that is being wr
cbc0: 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  itten */.  Token
cbd0: 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20   *pName = 0; /* 
cbe0: 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
cbf0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f   of the index to
cc00: 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66   create */..  if
cc10: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
cc20: 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  | sqlite3_malloc
cc30: 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65  _failed ) goto e
cc40: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
cc50: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  ;..  /*.  ** Fin
cc60: 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  d the table that
cc70: 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
cc80: 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79  d.  Return early
cc90: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   if not found.. 
cca0: 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61   */.  if( pTblNa
ccb0: 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a  me!=0 ){..    /*
ccc0: 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72   Use the two-par
ccd0: 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20  t index name to 
cce0: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61  determine the da
ccf0: 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74  tabase .    ** t
cd00: 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65  o search for the
cd10: 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68   table. 'Fix' th
cd20: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  e table name to 
cd30: 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62  this db.    ** b
cd40: 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70  efore looking up
cd50: 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
cd60: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
cd70: 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20  Name1 && pName2 
cd80: 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  );.    iDb = sql
cd90: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
cda0: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
cdb0: 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
cdc0: 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29  .    if( iDb<0 )
cdd0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
cde0: 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20 2f 2a  e_index;..    /*
cdf0: 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61   If the index na
ce00: 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69  me was unqualifi
ce10: 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65  ed, check if the
ce20: 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
ce30: 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c  * is a temp tabl
ce40: 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68  e. If so, set th
ce50: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e  e database to 1.
ce60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 61 62  .    */.    pTab
ce70: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
ce80: 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  tLookup(pParse, 
ce90: 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 69  pTblName);.    i
cea0: 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61  f( pName2 && pNa
ceb0: 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61  me2->n==0 && pTa
cec0: 62 20 26 26 20 70 54 61 62 2d 3e 69 44 62 3d 3d  b && pTab->iDb==
ced0: 31 20 29 7b 0a 20 20 20 20 20 20 69 44 62 20 3d  1 ){.      iDb =
cee0: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   1;.    }..    i
cef0: 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
cf00: 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
cf10: 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70   iDb, "index", p
cf20: 4e 61 6d 65 29 20 26 26 0a 20 20 20 20 20 20 20  Name) &&.       
cf30: 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
cf40: 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61  st(&sFix, pTblNa
cf50: 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  me).    ){.     
cf60: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
cf70: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
cf80: 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
cf90: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
cfa0: 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61  rse, pTblName->a
cfb0: 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  [0].zName, .    
cfc0: 20 20 20 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b      pTblName->a[
cfd0: 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
cfe0: 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67     if( !pTab ) g
cff0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
d000: 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72  index;.    asser
d010: 74 28 20 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44  t( iDb==pTab->iD
d020: 62 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  b );.  }else{.  
d030: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d    assert( pName=
d040: 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d  =0 );.    pTab =
d050: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
d060: 62 6c 65 3b 0a 20 20 20 20 69 44 62 20 3d 20 70  ble;.    iDb = p
d070: 54 61 62 2d 3e 69 44 62 3b 0a 20 20 7d 0a 0a 20  Tab->iDb;.  }.. 
d080: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20   if( pTab==0 || 
d090: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67  pParse->nErr ) g
d0a0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
d0b0: 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61  index;.  if( pTa
d0c0: 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  b->readOnly ){. 
d0d0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
d0e0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
d0f0: 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
d100: 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e  indexed", pTab->
d110: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
d120: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
d130: 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54  ex;.  }.  if( pT
d140: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
d150: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
d160: 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
d170: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
d180: 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
d190: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
d1a0: 65 78 3b 0a 20 20 7d 0a 20 20 69 73 54 65 6d 70  ex;.  }.  isTemp
d1b0: 20 3d 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31 3b   = pTab->iDb==1;
d1c0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
d1d0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
d1e0: 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75   index.  Make su
d1f0: 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  re there is not 
d200: 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a  already another.
d210: 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
d220: 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ble with the sam
d230: 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20  e name.  .  **. 
d240: 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20   ** Exception:  
d250: 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  If we are readin
d260: 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70  g the names of p
d270: 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73  ermanent indices
d280: 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73   from the.  ** s
d290: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
d2a0: 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65  le (because some
d2b0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63   other process c
d2c0: 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d  hanged the schem
d2d0: 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20  a) and.  ** one 
d2e0: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  of the index nam
d2f0: 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68  es collides with
d300: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74   the name of a t
d310: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
d320: 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68  r.  ** index, th
d330: 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  en we will conti
d340: 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74  nue to process t
d350: 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a  his index..  **.
d360: 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30    ** If pName==0
d370: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
d380: 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69  e are.  ** deali
d390: 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72  ng with a primar
d3a0: 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20  y key or UNIQUE 
d3b0: 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20  constraint.  We 
d3c0: 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f  have to invent o
d3d0: 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65  ur.  ** own name
d3e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61  ..  */.  if( pNa
d3f0: 6d 65 20 26 26 20 21 64 62 2d 3e 69 6e 69 74 2e  me && !db->init.
d400: 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65  busy ){.    Inde
d410: 78 20 2a 70 49 53 61 6d 65 4e 61 6d 65 3b 20 20  x *pISameName;  
d420: 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 69 6e 64    /* Another ind
d430: 65 78 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ex with the same
d440: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54 61 62   name */.    Tab
d450: 6c 65 20 2a 70 54 53 61 6d 65 4e 61 6d 65 3b 20  le *pTSameName; 
d460: 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 77 69     /* A table wi
d470: 74 68 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  th same name as 
d480: 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
d490: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53   zName = sqliteS
d4a0: 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c  trNDup(pName->z,
d4b0: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
d4c0: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67  if( zName==0 ) g
d4d0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
d4e0: 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 28  index;.    if( (
d4f0: 70 49 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c  pISameName = sql
d500: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
d510: 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62  , zName, db->aDb
d520: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 29 21 3d 30  [iDb].zName))!=0
d530: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d540: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d550: 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65  , "index %s alre
d560: 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61  ady exists", zNa
d570: 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  me);.      goto 
d580: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
d590: 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
d5a0: 20 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73   (pTSameName = s
d5b0: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
d5c0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d  db, zName, 0))!=
d5d0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
d5e0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
d5f0: 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
d600: 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d  eady a table nam
d610: 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
d620: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
d630: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
d640: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
d650: 70 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pName==0 ){.    
d660: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
d670: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e     int n;.    In
d680: 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  dex *pLoop;.    
d690: 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e  for(pLoop=pTab->
d6a0: 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f  pIndex, n=1; pLo
d6b0: 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
d6c0: 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20  >pNext, n++){}. 
d6d0: 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
d6e0: 22 25 64 29 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e  "%d)",n);.    zN
d6f0: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ame = 0;.    sql
d700: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
d710: 4e 61 6d 65 2c 20 22 28 22 2c 20 70 54 61 62 2d  Name, "(", pTab-
d720: 3e 7a 4e 61 6d 65 2c 20 22 20 61 75 74 6f 69 6e  >zName, " autoin
d730: 64 65 78 20 22 2c 20 7a 42 75 66 2c 20 28 63 68  dex ", zBuf, (ch
d740: 61 72 2a 29 30 29 3b 0a 20 20 20 20 69 66 28 20  ar*)0);.    if( 
d750: 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
d760: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
d770: 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  x;.  }else{.    
d780: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
d790: 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20  rNDup(pName->z, 
d7a0: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 7d 0a 0a  pName->n);.  }..
d7b0: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61    /* Check for a
d7c0: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
d7d0: 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e  create an index.
d7e0: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
d7f0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
d800: 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
d810: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
d820: 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e  = db->aDb[pTab->
d830: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
d840: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
d850: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
d860: 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45  ITE_INSERT, SCHE
d870: 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29  MA_TABLE(isTemp)
d880: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
d890: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
d8a0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
d8b0: 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f  .    i = SQLITE_
d8c0: 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20  CREATE_INDEX;.  
d8d0: 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 20 69    if( isTemp ) i
d8e0: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
d8f0: 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
d900: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
d910: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c  Check(pParse, i,
d920: 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e   zName, pTab->zN
d930: 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ame, zDb) ){.   
d940: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
d950: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
d960: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
d970: 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69  * If pList==0, i
d980: 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75  t means this rou
d990: 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20  tine was called 
d9a0: 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72  to make a primar
d9b0: 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f  y.  ** key out o
d9c0: 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  f the last colum
d9d0: 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  n added to the t
d9e0: 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
d9f0: 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f  ruction..  ** So
da00: 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c   create a fake l
da10: 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  ist to simulate 
da20: 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  this..  */.  if(
da30: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
da40: 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62   nullId.z = pTab
da50: 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f  ->aCol[pTab->nCo
da60: 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  l-1].zName;.    
da70: 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65  nullId.n = strle
da80: 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20  n(nullId.z);.   
da90: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
daa0: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  IdListAppend(0, 
dab0: 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66  &nullId);.    if
dac0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
dad0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
dae0: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a  dex;.  }..  /* .
daf0: 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    ** Allocate th
db00: 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
db10: 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65  e. .  */.  pInde
db20: 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  x = sqliteMalloc
db30: 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20  ( sizeof(Index) 
db40: 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20  + strlen(zName) 
db50: 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20  + 1 +.          
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
db70: 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a  izeof(int) + siz
db80: 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29 2a 70  eof(CollSeq*))*p
db90: 4c 69 73 74 2d 3e 6e 49 64 20 29 3b 0a 20 20 69  List->nId );.  i
dba0: 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 20 67  f( pIndex==0 ) g
dbb0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
dbc0: 69 6e 64 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d  index;.  pIndex-
dbd0: 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74  >aiColumn = (int
dbe0: 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  *)&pIndex->keyIn
dbf0: 66 6f 2e 61 43 6f 6c 6c 5b 70 4c 69 73 74 2d 3e  fo.aColl[pList->
dc00: 6e 49 64 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  nId];.  pIndex->
dc10: 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  zName = (char*)&
dc20: 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
dc30: 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b 0a 20 20  [pList->nId];.  
dc40: 73 74 72 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a  strcpy(pIndex->z
dc50: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Name, zName);.  
dc60: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d  pIndex->pTable =
dc70: 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d   pTab;.  pIndex-
dc80: 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74  >nColumn = pList
dc90: 2d 3e 6e 49 64 3b 0a 20 20 70 49 6e 64 65 78 2d  ->nId;.  pIndex-
dca0: 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72  >onError = onErr
dcb0: 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75  or;.  pIndex->au
dcc0: 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d  toIndex = pName=
dcd0: 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44  =0;.  pIndex->iD
dce0: 62 20 3d 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 53  b = iDb;..  /* S
dcf0: 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  can the names of
dd00: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
dd10: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
dd20: 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a  indexed and.  **
dd30: 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e   load the column
dd40: 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68   indices into th
dd50: 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  e Index structur
dd60: 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72  e.  Report an er
dd70: 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  ror.  ** if any 
dd80: 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f  column is not fo
dd90: 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  und..  */.  for(
dda0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
ddb0: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  d; i++){.    for
ddc0: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
ddd0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
dde0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
ddf0: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
de00: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
de10: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [j].zName)==0 ) 
de20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
de30: 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
de40: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
de50: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
de60: 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
de70: 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s no column name
de80: 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  d %s",.        p
de90: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69 73  Tab->zName, pLis
dea0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
deb0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
dec0: 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  (pIndex);.      
ded0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
dee0: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
def0: 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
df00: 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 70  mn[i] = j;.    p
df10: 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
df20: 43 6f 6c 6c 5b 69 5d 20 3d 20 70 54 61 62 2d 3e  Coll[i] = pTab->
df30: 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20  aCol[j].pColl;. 
df40: 20 7d 0a 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79   }.  pIndex->key
df50: 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 4c  Info.nField = pL
df60: 69 73 74 2d 3e 6e 49 64 3b 0a 0a 20 20 2f 2a 20  ist->nId;..  /* 
df70: 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64  Link the new Ind
df80: 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ex structure to 
df90: 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f  its table and to
dfa0: 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20   the other.  ** 
dfb0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
dfc0: 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a  se structures. .
dfd0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72    */.  if( !pPar
dfe0: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
dff0: 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
e000: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
e010: 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b  Insert(&db->aDb[
e020: 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 69 64 78  pIndex->iDb].idx
e030: 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20  Hash, .         
e040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e050: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73  pIndex->zName, s
e060: 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e  trlen(pIndex->zN
e070: 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b  ame)+1, pIndex);
e080: 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
e090: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
e0a0: 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c  Index );  /* Mal
e0b0: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
e0c0: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71  iled */.      sq
e0d0: 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65 78 29  liteFree(pIndex)
e0e0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
e0f0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
e100: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c      }.    db->fl
e110: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
e120: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d  ternChanges;.  }
e130: 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69  ..  /* When addi
e140: 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74  ng an index to t
e150: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63  he list of indic
e160: 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20  es for a table, 
e170: 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61  make.  ** sure a
e180: 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c  ll indices label
e190: 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f  ed OE_Replace co
e1a0: 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f  me after all tho
e1b0: 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20  se labeled.  ** 
e1c0: 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73  OE_Ignore.  This
e1d0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
e1e0: 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70  r the correct op
e1f0: 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54  eration of UPDAT
e200: 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52  E.  ** and INSER
e210: 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 6e  T..  */.  if( on
e220: 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
e230: 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
e240: 78 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 70  x==0.       || p
e250: 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45  Tab->pIndex->onE
e260: 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
e270: 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  ){.    pIndex->p
e280: 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e  Next = pTab->pIn
e290: 64 65 78 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70  dex;.    pTab->p
e2a0: 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
e2b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64    }else{.    Ind
e2c0: 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61  ex *pOther = pTa
e2d0: 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 77  b->pIndex;.    w
e2e0: 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e  hile( pOther->pN
e2f0: 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70  ext && pOther->p
e300: 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  Next->onError!=O
e310: 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20  E_Replace ){.   
e320: 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68     pOther = pOth
e330: 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  er->pNext;.    }
e340: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65  .    pIndex->pNe
e350: 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  xt = pOther->pNe
e360: 78 74 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d 3e  xt;.    pOther->
e370: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a  pNext = pIndex;.
e380: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
e390: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
e3a0: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
e3b0: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
e3c0: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
e3d0: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
e3e0: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
e3f0: 73 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77  sk.  So do not w
e400: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
e410: 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78  .  ** again.  Ex
e420: 74 72 61 63 74 20 74 68 65 20 74 61 62 6c 65 20  tract the table 
e430: 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20  number from the 
e440: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
e450: 20 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69   field..  */.  i
e460: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
e470: 20 26 26 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20   && pTblName!=0 
e480: 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74  ){.    pIndex->t
e490: 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
e4a0: 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f  ewTnum;.  }..  /
e4b0: 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
e4c0: 74 2e 62 75 73 79 20 69 73 20 30 20 74 68 65 6e  t.busy is 0 then
e4d0: 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65   create the inde
e4e0: 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73  x on disk.  This
e4f0: 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77  .  ** involves w
e500: 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78  riting the index
e510: 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72   into the master
e520: 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69   table and filli
e530: 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ng in the.  ** i
e540: 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75  ndex with the cu
e550: 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74  rrent table cont
e560: 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ents..  **.  ** 
e570: 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  The db->init.bus
e580: 79 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20  y is 0 when the 
e590: 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72  user first enter
e5a0: 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58  s a CREATE INDEX
e5b0: 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20   .  ** command. 
e5c0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
e5d0: 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62  s 1 when a datab
e5e0: 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e  ase is opened an
e5f0: 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49  d .  ** CREATE I
e600: 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20  NDEX statements 
e610: 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20  are read out of 
e620: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
e630: 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c  .  In.  ** the l
e640: 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69  atter case the i
e650: 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
e660: 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69  sts on disk, whi
e670: 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77  ch is why.  ** w
e680: 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20  e don't want to 
e690: 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a  recreate it..  *
e6a0: 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61  *.  ** If pTblNa
e6b0: 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
e6c0: 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e  his index is gen
e6d0: 65 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d  erated as a prim
e6e0: 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20  ary key.  ** or 
e6f0: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
e700: 74 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41  t of a CREATE TA
e710: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
e720: 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a  Since the table.
e730: 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65    ** has just be
e740: 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63  en created, it c
e750: 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20  ontains no data 
e760: 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e  and the index in
e770: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a  itialization.  *
e780: 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b  * step can be sk
e790: 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
e7a0: 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  se if( db->init.
e7b0: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 69  busy==0 ){.    i
e7c0: 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt n;.    Vdbe *
e7d0: 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31 2c  v;.    int lbl1,
e7e0: 20 6c 62 6c 32 3b 0a 0a 20 20 20 20 76 20 3d 20   lbl2;..    v = 
e7f0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
e800: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
e810: 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  v==0 ) goto exit
e820: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
e830: 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21     if( pTblName!
e840: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
e850: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
e860: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
e870: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
e880: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
e890: 61 62 6c 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  able(v, iDb);.  
e8a0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
e8b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
e8c0: 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a  ewRecno, 0, 0);.
e8d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
e8e0: 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p3(v, OP_String8
e8f0: 2c 20 30 2c 20 30 2c 20 22 69 6e 64 65 78 22 2c  , 0, 0, "index",
e900: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
e910: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
e920: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
e930: 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  , 0, pIndex->zNa
e940: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  me, 0);.    sqli
e950: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
e960: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20  _String8, 0, 0, 
e970: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
e980: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e990: 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  Op3(v, OP_Create
e9a0: 49 6e 64 65 78 2c 20 30 2c 20 69 44 62 2c 28 63  Index, 0, iDb,(c
e9b0: 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 74 6e  har*)&pIndex->tn
e9c0: 75 6d 2c 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a  um,P3_POINTER);.
e9d0: 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
e9e0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 54   = 0;.    if( pT
e9f0: 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  blName ){.      
ea00: 73 71 6c 69 74 65 33 56 64 62 65 43 6f 64 65 28  sqlite3VdbeCode(
ea10: 76 2c 0a 20 20 20 20 20 20 20 20 20 20 4f 50 5f  v,.          OP_
ea20: 44 75 70 2c 20 20 20 20 20 20 20 30 2c 20 20 20  Dup,       0,   
ea30: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
ea40: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 69 44  OP_Integer,   iD
ea50: 62 2c 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30  b,    0,.      0
ea60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ea70: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
ea80: 65 6e 57 72 69 74 65 2c 20 31 2c 20 30 2c 0a 20  enWrite, 1, 0,. 
ea90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eaa0: 20 20 20 20 28 63 68 61 72 2a 29 26 70 49 6e 64      (char*)&pInd
eab0: 65 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f  ex->keyInfo, P3_
eac0: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 7d 0a  KEYINFO);.    }.
ead0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
eae0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
eaf0: 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  g8, 0, 0);.    i
eb00: 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e  f( pStart && pEn
eb10: 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
eb20: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
eb30: 2c 20 2d 31 2c 20 22 43 52 45 41 54 45 20 49 4e  , -1, "CREATE IN
eb40: 44 45 58 20 22 2c 20 50 33 5f 53 54 41 54 49 43  DEX ", P3_STATIC
eb50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
eb60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
eb70: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a  String8, 0, 0);.
eb80: 20 20 20 20 20 20 6e 20 3d 20 41 64 64 72 28 70        n = Addr(p
eb90: 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70  End->z) - Addr(p
eba0: 4e 61 6d 65 2d 3e 7a 29 20 2b 20 31 3b 0a 20 20  Name->z) + 1;.  
ebb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
ebc0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
ebd0: 4e 61 6d 65 2d 3e 7a 2c 20 6e 29 3b 0a 20 20 20  Name->z, n);.   
ebe0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ebf0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74  dOp(v, OP_Concat
ec00: 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 2, 0);.    }. 
ec10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
ec20: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
ec30: 72 64 2c 20 35 2c 20 30 2c 20 22 74 74 74 69 74  rd, 5, 0, "tttit
ec40: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
ec50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ec60: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74  dOp(v, OP_PutInt
ec70: 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Key, 0, 0);.    
ec80: 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a  if( pTblName ){.
ec90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
eca0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
ecb0: 65 67 65 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c  eger, pTab->iDb,
ecc0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
ecd0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ece0: 50 5f 4f 70 65 6e 52 65 61 64 2c 20 32 2c 20 70  P_OpenRead, 2, p
ecf0: 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20  Tab->tnum);.    
ed00: 20 20 2f 2a 20 56 64 62 65 43 6f 6d 6d 65 6e 74    /* VdbeComment
ed10: 28 28 76 2c 20 22 25 73 22 2c 20 70 54 61 62 2d  ((v, "%s", pTab-
ed20: 3e 7a 4e 61 6d 65 29 29 3b 20 2a 2f 0a 20 20 20  >zName)); */.   
ed30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ed40: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  dOp(v, OP_SetNum
ed50: 43 6f 6c 75 6d 6e 73 2c 20 32 2c 20 70 54 61 62  Columns, 2, pTab
ed60: 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 6c  ->nCol);.      l
ed70: 62 6c 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  bl2 = sqlite3Vdb
ed80: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
ed90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
eda0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
edb0: 6e 64 2c 20 32 2c 20 6c 62 6c 32 29 3b 0a 20 20  nd, 2, lbl2);.  
edc0: 20 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74      lbl1 = sqlit
edd0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
ede0: 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
edf0: 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
ee00: 4b 65 79 28 76 2c 20 70 49 6e 64 65 78 2c 20 32  Key(v, pIndex, 2
ee10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ee20: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 49 64  VdbeOp3(v, OP_Id
ee30: 78 50 75 74 2c 20 31 2c 20 70 49 6e 64 65 78 2d  xPut, 1, pIndex-
ee40: 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
ee50: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
ee60: 20 20 20 20 20 20 20 20 20 22 69 6e 64 65 78 65           "indexe
ee70: 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f  d columns are no
ee80: 74 20 75 6e 69 71 75 65 22 2c 20 50 33 5f 53 54  t unique", P3_ST
ee90: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
eea0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
eeb0: 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c 62 6c   OP_Next, 2, lbl
eec0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
eed0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
eee0: 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20  l(v, lbl2);.    
eef0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ef00: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
ef10: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 0);.      sql
ef20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ef30: 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29   OP_Close, 1, 0)
ef40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ef50: 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  pTblName!=0 ){. 
ef60: 20 20 20 20 20 69 66 28 20 21 69 73 54 65 6d 70       if( !isTemp
ef70: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
ef80: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
ef90: 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20  db, v, iDb);.   
efa0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
efb0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
efc0: 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
efd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
efe0: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
eff0: 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
f000: 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  }..  /* Clean up
f010: 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20   before exiting 
f020: 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69  */.exit_create_i
f030: 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 49  ndex:.  sqlite3I
f040: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  dListDelete(pLis
f050: 74 29 3b 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33  t);.  /* sqlite3
f060: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54  SrcListDelete(pT
f070: 61 62 6c 65 29 3b 20 2a 2f 0a 20 20 73 71 6c 69  able); */.  sqli
f080: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
f090: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
f0a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
f0b0: 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73  ill drop an exis
f0c0: 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78  ting named index
f0d0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
f0e0: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ** implements th
f0f0: 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61  e DROP INDEX sta
f100: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
f110: 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78  sqlite3DropIndex
f120: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
f130: 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 29 7b  SrcList *pName){
f140: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
f150: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
f160: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
f170: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
f180: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
f190: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
f1a0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
f1b0: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
f1c0: 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70 49 6e  nSrc==1 );.  pIn
f1d0: 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
f1e0: 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65  dIndex(db, pName
f1f0: 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e  ->a[0].zName, pN
f200: 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
f210: 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  ase);.  if( pInd
f220: 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ex==0 ){.    sql
f230: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
f240: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  rse, "no such in
f250: 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c  dex: %S", pName,
f260: 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78   0);.    goto ex
f270: 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
f280: 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d   }.  if( pIndex-
f290: 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20  >autoIndex ){.  
f2a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
f2b0: 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
f2c0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
f2d0: 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20   UNIQUE ".      
f2e0: 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20  "or PRIMARY KEY 
f2f0: 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f  constraint canno
f300: 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30  t be dropped", 0
f310: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
f320: 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
f330: 0a 2f 2a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  ./*.  if( pIndex
f340: 2d 3e 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 73  ->iDb>1 ){.    s
f350: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
f360: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 61  Parse, "cannot a
f370: 6c 74 65 72 20 73 63 68 65 6d 61 20 6f 66 20 61  lter schema of a
f380: 74 74 61 63 68 65 64 20 22 0a 20 20 20 20 20 20  ttached ".      
f390: 20 22 64 61 74 61 62 61 73 65 73 22 2c 20 30 29   "databases", 0)
f3a0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
f3b0: 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
f3c0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
f3d0: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
f3e0: 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
f3f0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
f400: 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54  ROP_INDEX;.    T
f410: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
f420: 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  dex->pTable;.   
f430: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
f440: 20 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65   = db->aDb[pInde
f450: 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  x->iDb].zName;. 
f460: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f470: 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
f480: 4c 45 28 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b  LE(pIndex->iDb);
f490: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
f4a0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
f4b0: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
f4c0: 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29   zTab, 0, zDb) )
f4d0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
f4e0: 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
f4f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 64    }.    if( pInd
f500: 65 78 2d 3e 69 44 62 20 29 20 63 6f 64 65 20 3d  ex->iDb ) code =
f510: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
f520: 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
f530: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
f540: 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
f550: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70  pIndex->zName, p
f560: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
f570: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
f580: 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
f590: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
f5a0: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
f5b0: 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
f5c0: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f  he index and fro
f5d0: 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
f5e0: 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  le */.  v = sqli
f5f0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
f600: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
f610: 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
f620: 4c 69 73 74 20 64 72 6f 70 49 6e 64 65 78 5b 5d  List dropIndex[]
f630: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f   = {.      { OP_
f640: 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41  Rewind,     0, A
f650: 44 44 52 28 39 29 2c 20 30 7d 2c 20 0a 20 20 20  DDR(9), 0}, .   
f660: 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c     { OP_String8,
f670: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
f680: 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20   0}, /* 1 */.   
f690: 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65     { OP_MemStore
f6a0: 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20  ,   1, 1,       
f6b0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d  0},.      { OP_M
f6c0: 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c  emLoad,    1, 0,
f6d0: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20         0}, /* 3 
f6e0: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  */.      { OP_Co
f6f0: 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20  lumn,     0, 1, 
f700: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
f710: 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20 20 20 20  { OP_Eq,        
f720: 20 30 2c 20 41 44 44 52 28 38 29 2c 20 30 7d 2c   0, ADDR(8), 0},
f730: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74  .      { OP_Next
f740: 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28  ,       0, ADDR(
f750: 33 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  3), 0},.      { 
f760: 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20 30  OP_Goto,       0
f770: 2c 20 41 44 44 52 28 39 29 2c 20 30 7d 2c 0a 20  , ADDR(9), 0},. 
f780: 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65       { OP_Delete
f790: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
f7a0: 20 20 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20    0}, /* 8 */.  
f7b0: 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 62 61 73    };.    int bas
f7c0: 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42  e;..    sqlite3B
f7d0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
f7e0: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70 49  on(pParse, 0, pI
f7f0: 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20  ndex->iDb);.    
f800: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
f810: 72 54 61 62 6c 65 28 76 2c 20 70 49 6e 64 65 78  rTable(v, pIndex
f820: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 62 61 73 65  ->iDb);.    base
f830: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
f840: 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
f850: 53 69 7a 65 28 64 72 6f 70 49 6e 64 65 78 29 2c  Size(dropIndex),
f860: 20 64 72 6f 70 49 6e 64 65 78 29 3b 0a 20 20 20   dropIndex);.   
f870: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
f880: 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31 2c 20  geP3(v, base+1, 
f890: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
f8a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  );.    if( pInde
f8b0: 78 2d 3e 69 44 62 21 3d 31 20 29 7b 0a 20 20 20  x->iDb!=1 ){.   
f8c0: 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
f8d0: 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70 49  Cookie(db, v, pI
f8e0: 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20  ndex->iDb);.    
f8f0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
f900: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
f910: 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  se, 0, 0);.    s
f920: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f930: 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70  v, OP_Destroy, p
f940: 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 70 49 6e  Index->tnum, pIn
f950: 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73  dex->iDb);.    s
f960: 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70  qlite3EndWriteOp
f970: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
f980: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
f990: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
f9a0: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
f9b0: 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a  his index..  */.
f9c0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65    if( !pParse->e
f9d0: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73 71  xplain ){.    sq
f9e0: 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65  lite3UnlinkAndDe
f9f0: 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49  leteIndex(db, pI
fa00: 6e 64 65 78 29 3b 0a 20 20 20 20 64 62 2d 3e 66  ndex);.    db->f
fa10: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
fa20: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
fa30: 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  }..exit_drop_ind
fa40: 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  ex:.  sqlite3Src
fa50: 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65  ListDelete(pName
fa60: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  );.}../*.** Appe
fa70: 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  nd a new element
fa80: 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64   to the given Id
fa90: 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20  List.  Create a 
faa0: 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a  new IdList if.**
fab0: 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20   need be..**.** 
fac0: 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20  A new IdList is 
fad0: 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
fae0: 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  L if malloc() fa
faf0: 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a  ils..*/.IdList *
fb00: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70  sqlite3IdListApp
fb10: 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  end(IdList *pLis
fb20: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
fb30: 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ){.  if( pList==
fb40: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
fb50: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
fb60: 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b  izeof(IdList) );
fb70: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
fb80: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
fb90: 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
fba0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
fbb0: 4c 69 73 74 2d 3e 6e 49 64 3e 3d 70 4c 69 73 74  List->nId>=pList
fbc0: 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
fbd0: 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74  struct IdList_it
fbe0: 65 6d 20 2a 61 3b 0a 20 20 20 20 70 4c 69 73 74  em *a;.    pList
fbf0: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4c 69 73 74  ->nAlloc = pList
fc00: 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a  ->nAlloc*2 + 5;.
fc10: 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52 65      a = sqliteRe
fc20: 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20  alloc(pList->a, 
fc30: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69  pList->nAlloc*si
fc40: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
fc50: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d  ) );.    if( a==
fc60: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
fc70: 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  e3IdListDelete(p
fc80: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
fc90: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
fca0: 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20   pList->a = a;. 
fcb0: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c 69   }.  memset(&pLi
fcc0: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64  st->a[pList->nId
fcd0: 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69  ], 0, sizeof(pLi
fce0: 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66  st->a[0]));.  if
fcf0: 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  ( pToken ){.    
fd00: 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69  char **pz = &pLi
fd10: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64  st->a[pList->nId
fd20: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c  ].zName;.    sql
fd30: 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 70  ite3SetNString(p
fd40: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54  z, pToken->z, pT
fd50: 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  oken->n, 0);.   
fd60: 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20   if( *pz==0 ){. 
fd70: 20 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69       sqlite3IdLi
fd80: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
fd90: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
fda0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
fdb0: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
fdc0: 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (*pz);.    }.  }
fdd0: 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b  .  pList->nId++;
fde0: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
fdf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
fe00: 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d   a new table nam
fe10: 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53  e to the given S
fe20: 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  rcList.  Create 
fe30: 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66  a new SrcList if
fe40: 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20  .** need be.  A 
fe50: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65  new entry is cre
fe60: 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c  ated in the SrcL
fe70: 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b  ist even if pTok
fe80: 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  en is NULL..**.*
fe90: 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74 20  * A new SrcList 
fea0: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
feb0: 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
fec0: 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   fails..**.** If
fed0: 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f   pDatabase is no
fee0: 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73  t null, it means
fef0: 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
ff00: 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a  has an optional.
ff10: 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ** database name
ff20: 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74   prefix.  Like t
ff30: 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e  his:  "database.
ff40: 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61  table".  The pDa
ff50: 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73  tabase.** points
ff60: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61   to the table na
ff70: 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c  me and the pTabl
ff80: 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
ff90: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
ffa0: 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b  * The SrcList.a[
ffb0: 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73  ].zName field is
ffc0: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
ffd0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63   table name whic
ffe0: 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20  h might.** come 
fff0: 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20  from pTable (if 
10000 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
10010 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61  L) or from pData
10020 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69  base.  .** SrcLi
10030 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65  st.a[].zDatabase
10040 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
10050 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
10060 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a  e from pTable,.*
10070 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69  * or with NULL i
10080 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73  f no database is
10090 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
100a0 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
100b0 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74  , if call like t
100c0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
100d0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
100e0 74 41 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b 0a  tAppend(A,B,0);.
100f0 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20  **.** Then B is 
10100 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  a table name and
10110 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
10120 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65  me is unspecifie
10130 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a  d.  If called.**
10140 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
10150 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
10160 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41  3SrcListAppend(A
10170 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,C);.**.** The
10180 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65  n C is the table
10190 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74   name and B is t
101a0 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
101b0 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
101c0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
101d0 6e 64 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  nd(SrcList *pLis
101e0 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  t, Token *pTable
101f0 2c 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61  , Token *pDataba
10200 73 65 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74  se){.  if( pList
10210 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
10220 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
10230 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29   sizeof(SrcList)
10240 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
10250 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
10260 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
10270 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  oc = 1;.  }.  if
10280 28 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70  ( pList->nSrc>=p
10290 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  List->nAlloc ){.
102a0 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65      SrcList *pNe
102b0 77 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  w;.    pList->nA
102c0 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70  lloc *= 2;.    p
102d0 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
102e0 6c 6f 63 28 70 4c 69 73 74 2c 0a 20 20 20 20 20  loc(pList,.     
102f0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
10300 28 2a 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73  (*pList) + (pLis
10310 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a  t->nAlloc-1)*siz
10320 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
10330 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77   );.    if( pNew
10340 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
10350 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
10360 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
10370 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
10380 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77      pList = pNew
10390 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
103a0 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
103b0 6e 53 72 63 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  nSrc], 0, sizeof
103c0 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
103d0 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
103e0 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d  && pDatabase->z=
103f0 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62  =0 ){.    pDatab
10400 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ase = 0;.  }.  i
10410 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20  f( pDatabase && 
10420 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f  pTable ){.    To
10430 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61  ken *pTemp = pDa
10440 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74  tabase;.    pDat
10450 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a  abase = pTable;.
10460 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65      pTable = pTe
10470 6d 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54  mp;.  }.  if( pT
10480 61 62 6c 65 20 29 7b 0a 20 20 20 20 63 68 61 72  able ){.    char
10490 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e   **pz = &pList->
104a0 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a  a[pList->nSrc].z
104b0 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Name;.    sqlite
104c0 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20  3SetNString(pz, 
104d0 70 54 61 62 6c 65 2d 3e 7a 2c 20 70 54 61 62 6c  pTable->z, pTabl
104e0 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66  e->n, 0);.    if
104f0 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  ( *pz==0 ){.    
10500 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
10510 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
10520 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
10530 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10540 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 2a  sqlite3Dequote(*
10550 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pz);.    }.  }. 
10560 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 29   if( pDatabase )
10570 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20  {.    char **pz 
10580 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
10590 74 2d 3e 6e 53 72 63 5d 2e 7a 44 61 74 61 62 61  t->nSrc].zDataba
105a0 73 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  se;.    sqlite3S
105b0 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 44  etNString(pz, pD
105c0 61 74 61 62 61 73 65 2d 3e 7a 2c 20 70 44 61 74  atabase->z, pDat
105d0 61 62 61 73 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20  abase->n, 0);.  
105e0 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a    if( *pz==0 ){.
105f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
10600 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
10610 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
10620 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
10630 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
10640 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20  te(*pz);.    }. 
10650 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c   }.  pList->a[pL
10660 69 73 74 2d 3e 6e 53 72 63 5d 2e 69 43 75 72 73  ist->nSrc].iCurs
10670 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 4c 69 73 74  or = -1;.  pList
10680 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75  ->nSrc++;.  retu
10690 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
106a0 2a 2a 20 41 73 73 69 67 6e 20 63 75 72 73 6f 72  ** Assign cursor
106b0 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20  s to all tables 
106c0 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a  in a SrcList.*/.
106d0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
106e0 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
106f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10700 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
10710 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
10720 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  i=0; i<pList->nS
10730 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  rc; i++){.    if
10740 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  ( pList->a[i].iC
10750 75 72 73 6f 72 3c 30 20 29 7b 0a 20 20 20 20 20  ursor<0 ){.     
10760 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75   pList->a[i].iCu
10770 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
10780 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Tab++;.    }.  }
10790 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
107a0 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61   alias to the la
107b0 73 74 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e  st identifier on
107c0 20 74 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74   the given ident
107d0 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76  ifier list..*/.v
107e0 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
107f0 73 74 41 64 64 41 6c 69 61 73 28 53 72 63 4c 69  stAddAlias(SrcLi
10800 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
10810 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28   *pToken){.  if(
10820 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d   pList && pList-
10830 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 69  >nSrc>0 ){.    i
10840 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 53  nt i = pList->nS
10850 72 63 20 2d 20 31 3b 0a 20 20 20 20 73 71 6c 69  rc - 1;.    sqli
10860 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 26 70  te3SetNString(&p
10870 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61  List->a[i].zAlia
10880 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54  s, pToken->z, pT
10890 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  oken->n, 0);.   
108a0 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
108b0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69  pList->a[i].zAli
108c0 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  as);.  }.}../*.*
108d0 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69  * Delete an IdLi
108e0 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
108f0 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
10900 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  IdList *pList){.
10910 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
10920 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
10930 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
10940 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
10950 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
10960 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
10970 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
10980 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a  Free(pList->a);.
10990 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
109a0 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
109b0 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
109c0 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69  n pList of the i
109d0 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20  dentifier named 
109e0 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  zId.  Return -1.
109f0 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ** if not found.
10a00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
10a10 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73  dListIndex(IdLis
10a20 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20  t *pList, const 
10a30 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
10a40 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
10a50 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d  st==0 ) return -
10a60 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
10a70 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
10a80 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
10a90 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
10aa0 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  a[i].zName, zNam
10ab0 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  e)==0 ) return i
10ac0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
10ad0 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  1;.}../*.** Dele
10ae0 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63  te an entire Src
10af0 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61  List including a
10b00 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74  ll its substruct
10b10 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ure..*/.void sql
10b20 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
10b30 65 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  e(SrcList *pList
10b40 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
10b50 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
10b60 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
10b70 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  i<pList->nSrc; i
10b80 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ++){.    sqliteF
10b90 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
10ba0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
10bb0 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
10bc0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
10bd0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
10be0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73  ist->a[i].zAlias
10bf0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
10c00 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 26 26 20 70  ->a[i].pTab && p
10c10 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d  List->a[i].pTab-
10c20 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a  >isTransient ){.
10c30 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
10c40 65 74 65 54 61 62 6c 65 28 30 2c 20 70 4c 69 73  eteTable(0, pLis
10c50 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 3b 0a 20  t->a[i].pTab);. 
10c60 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
10c70 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 4c 69  SelectDelete(pLi
10c80 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
10c90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
10ca0 70 72 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e  prDelete(pList->
10cb0 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 73  a[i].pOn);.    s
10cc0 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
10cd0 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  te(pList->a[i].p
10ce0 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71  Using);.  }.  sq
10cf0 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b  liteFree(pList);
10d00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
10d10 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
10d20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
10d30 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  inTransaction(Pa
10d40 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
10d50 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56 64  sqlite *db;.  Vd
10d60 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50  be *v;..  if( pP
10d70 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
10d80 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
10d90 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
10da0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
10db0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
10dc0 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
10dd0 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
10de0 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( sqlite3
10df0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
10e00 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
10e10 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30  TION, "BEGIN", 0
10e20 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  , 0) ) return;..
10e30 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
10e40 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
10e50 69 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b  if( !v ) return;
10e60 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
10e70 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  dOp(v, OP_AutoCo
10e80 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  mmit, 0, 0);.}..
10e90 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74  /*.** Commit a t
10ea0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
10eb0 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74  id sqlite3Commit
10ec0 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
10ed0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
10ee0 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65  lite *db;.  Vdbe
10ef0 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72   *v;..  if( pPar
10f00 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61  se==0 || (db=pPa
10f10 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64  rse->db)==0 || d
10f20 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
10f30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
10f40 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
10f50 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
10f60 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
10f70 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
10f80 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
10f90 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
10fa0 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  ON, "COMMIT", 0,
10fb0 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   0) ) return;.. 
10fc0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
10fd0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
10fe0 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
10ff0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11000 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
11010 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
11020 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72  ** Rollback a tr
11030 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
11040 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63  d sqlite3Rollbac
11050 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  kTransaction(Par
11060 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
11070 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62  qlite *db;.  Vdb
11080 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61  e *v;..  if( pPa
11090 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50  rse==0 || (db=pP
110a0 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20  arse->db)==0 || 
110b0 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d  db->aDb[0].pBt==
110c0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
110d0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
110e0 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  | sqlite3_malloc
110f0 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  _failed ) return
11100 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
11110 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
11120 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
11130 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c  ION, "ROLLBACK",
11140 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
11150 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
11160 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
11170 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
11180 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11190 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
111a0 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 1, 1);.  }.}..
111b0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
111c0 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 77 69  DBE code that wi
111d0 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20 73 63  ll verify the sc
111e0 68 65 6d 61 20 63 6f 6f 6b 69 65 20 66 6f 72 20  hema cookie for 
111f0 61 6c 6c 0a 2a 2a 20 6e 61 6d 65 64 20 64 61 74  all.** named dat
11200 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a  abase files..*/.
11210 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
11220 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72  VerifySchema(Par
11230 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
11240 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a  iDb){.  sqlite *
11250 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
11260 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
11270 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
11280 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
11290 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
112a0 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
112b0 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  b<db->nDb );.  a
112c0 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69  ssert( db->aDb[i
112d0 44 62 5d 2e 70 42 74 21 3d 30 20 29 3b 0a 20 20  Db].pBt!=0 );.  
112e0 69 66 28 20 69 44 62 21 3d 31 20 26 26 20 28 69  if( iDb!=1 && (i
112f0 44 62 3e 36 33 20 7c 7c 20 21 28 70 50 61 72 73  Db>63 || !(pPars
11300 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20  e->cookieMask & 
11310 28 28 75 36 34 29 31 3c 3c 69 44 62 29 29 29 20  ((u64)1<<iDb))) 
11320 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
11330 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72  beAddOp(v, OP_Tr
11340 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62 2c 20  ansaction, iDb, 
11350 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
11360 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56  dbeAddOp(v, OP_V
11370 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69 44 62  erifyCookie, iDb
11380 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73  , db->aDb[iDb].s
11390 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 29 3b 0a 20  chema_cookie);. 
113a0 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
113b0 65 4d 61 73 6b 20 7c 3d 20 28 28 75 36 34 29 31  eMask |= ((u64)1
113c0 3c 3c 69 44 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  <<iDb);.  }.}../
113d0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
113e0 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65  BE code that pre
113f0 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20  pares for doing 
11400 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61  an operation tha
11410 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67  t.** might chang
11420 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  e the database..
11430 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
11440 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20  ne starts a new 
11450 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77  transaction if w
11460 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64  e are not alread
11470 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72  y within.** a tr
11480 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77  ansaction.  If w
11490 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69  e are already wi
114a0 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
114b0 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b  on, then a check
114c0 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20  point.** is set 
114d0 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d  if the setStatem
114e0 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  ent parameter is
114f0 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70   true.  A checkp
11500 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  oint should.** b
11510 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74  e set for operat
11520 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20  ions that might 
11530 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63  fail (due to a c
11540 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20  onstraint) part 
11550 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68  of.** the way th
11560 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20  rough and which 
11570 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64  will need to und
11580 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69  o some writes wi
11590 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a  thout having to.
115a0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** rollback the 
115b0 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  whole transactio
115c0 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f  n.  For operatio
115d0 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e  ns where all con
115e0 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20  straints.** can 
115f0 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72  be checked befor
11600 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72  e any changes ar
11610 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  e made to the da
11620 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65  tabase, it is ne
11630 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79  ver.** necessary
11640 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65   to undo a write
11650 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f   and the checkpo
11660 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  int should not b
11670 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  e set..**.** Onl
11680 79 20 64 61 74 61 62 61 73 65 20 69 44 62 20 61  y database iDb a
11690 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  nd the temp data
116a0 62 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72  base are made wr
116b0 69 74 61 62 6c 65 20 62 79 20 74 68 69 73 20 63  itable by this c
116c0 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d  all..** If iDb==
116d0 30 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 69 6e  0, then the main
116e0 20 61 6e 64 20 74 65 6d 70 20 64 61 74 61 62 61   and temp databa
116f0 73 65 73 20 61 72 65 20 6d 61 64 65 20 77 72 69  ses are made wri
11700 74 61 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69  table.   If.** i
11710 44 62 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20  Db==1 then only 
11720 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
11730 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62  e is made writab
11740 6c 65 2e 20 20 49 66 20 69 44 62 3e 31 20 74 68  le.  If iDb>1 th
11750 65 6e 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66  en the.** specif
11760 69 65 64 20 61 75 78 69 6c 69 61 72 79 20 64 61  ied auxiliary da
11770 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 74  tabase and the t
11780 65 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65  emp database are
11790 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 0a   made writable..
117a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
117b0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
117c0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
117d0 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65  , int setStateme
117e0 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  nt, int iDb){.  
117f0 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
11800 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
11810 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
11820 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
11830 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
11840 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
11850 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73  ddOp(v, OP_Trans
11860 61 63 74 69 6f 6e 2c 20 69 44 62 2c 20 31 29 3b  action, iDb, 1);
11870 0a 20 20 69 66 28 20 28 69 44 62 3e 36 33 20 7c  .  if( (iDb>63 |
11880 7c 20 21 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  | !(pParse->cook
11890 69 65 4d 61 73 6b 20 26 20 28 28 75 36 34 29 31  ieMask & ((u64)1
118a0 3c 3c 69 44 62 29 29 29 20 29 7b 0a 20 20 20 20  <<iDb))) ){.    
118b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
118c0 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f  (v, OP_VerifyCoo
118d0 6b 69 65 2c 20 69 44 62 2c 20 64 62 2d 3e 61 44  kie, iDb, db->aD
118e0 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f  b[iDb].schema_co
118f0 6f 6b 69 65 29 3b 0a 20 20 20 20 70 50 61 72 73  okie);.    pPars
11900 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d  e->cookieMask |=
11910 20 28 28 75 36 34 29 31 3c 3c 69 44 62 29 3b 0a   ((u64)1<<iDb);.
11920 20 20 7d 0a 20 20 69 66 28 20 73 65 74 53 74 61    }.  if( setSta
11930 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71  tement ){.    sq
11940 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11950 2c 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 2c 20  , OP_Statement, 
11960 69 44 62 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  iDb, 0);.  }.  i
11970 66 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20  f( iDb!=1 ){.   
11980 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
11990 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
119a0 73 65 2c 20 73 65 74 53 74 61 74 65 6d 65 6e 74  se, setStatement
119b0 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
119c0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
119d0 20 74 68 61 74 20 63 6f 6e 63 6c 75 64 65 73 20   that concludes 
119e0 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61  an operation tha
119f0 74 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e 67  t may have chang
11a00 65 64 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  ed.** the databa
11a10 73 65 2e 20 20 49 66 20 61 20 73 74 61 74 65 6d  se.  If a statem
11a20 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
11a30 77 61 73 20 73 74 61 72 74 65 64 2c 20 74 68 65  was started, the
11a40 6e 20 65 6d 69 74 0a 2a 2a 20 61 6e 20 4f 50 5f  n emit.** an OP_
11a50 43 6f 6d 6d 69 74 20 74 68 61 74 20 77 69 6c 6c  Commit that will
11a60 20 63 61 75 73 65 20 74 68 65 20 63 68 61 6e 67   cause the chang
11a70 65 73 20 74 6f 20 62 65 20 63 6f 6d 6d 69 74 74  es to be committ
11a80 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
11a90 2a 20 4e 6f 74 65 20 74 68 61 74 20 63 68 65 63  * Note that chec
11aa0 6b 70 6f 69 6e 74 73 20 61 72 65 20 61 75 74 6f  kpoints are auto
11ab0 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6d 6d 69 74  matically commit
11ac0 74 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ted at the end o
11ad0 66 0a 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74  f.** a statement
11ae0 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61  .  Note also tha
11af0 74 20 74 68 65 72 65 20 63 61 6e 20 62 65 20 6d  t there can be m
11b00 75 6c 74 69 70 6c 65 20 63 61 6c 6c 73 20 74 6f  ultiple calls to
11b10 20 0a 2a 2a 20 73 71 6c 69 74 65 33 42 65 67 69   .** sqlite3Begi
11b20 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
11b30 29 20 62 75 74 20 74 68 65 72 65 20 73 68 6f 75  ) but there shou
11b40 6c 64 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e  ld only be a sin
11b50 67 6c 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73  gle.** call to s
11b60 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70  qlite3EndWriteOp
11b70 65 72 61 74 69 6f 6e 28 29 20 61 74 20 74 68 65  eration() at the
11b80 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74   conclusion of t
11b90 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  he statement..*/
11ba0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64  .void sqlite3End
11bb0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50  WriteOperation(P
11bc0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
11bd0 20 2f 2a 20 44 65 6c 65 74 65 20 6d 65 21 20 2a   /* Delete me! *
11be0 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a        /.  return;.}.