/ Hex Artifact Content
Login

Artifact 4ea78aba171f02b96254dd7a312e4266d3693bfe:


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 31 32 20 32 30 30 34 2f 30 36 2f 30 39 20 31  212 2004/06/09 1
0300: 32 3a 33 30 3a 30 35 20 64 61 6e 69 65 6c 6b 31  2:30:05 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 61 20 56 44 42 45  arsed and a VDBE
0680: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0690: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
06a0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
06b0: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
06c0: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
06d0: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
06e0: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
06f0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0700: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0710: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0720: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0730: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0740: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0750: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0760: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0770: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0780: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0790: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
07a0: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
07b0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
07c0: 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  ite *db;.  Vdbe 
07d0: 2a 76 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  *v;..  if( sqlit
07e0: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
07f0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
0800: 20 42 65 67 69 6e 20 62 79 20 67 65 6e 65 72 61   Begin by genera
0810: 74 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e  ting some termin
0820: 61 74 69 6f 6e 20 63 6f 64 65 20 61 74 20 74 68  ation code at th
0830: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a  e end of the.  *
0840: 2a 20 76 64 62 65 20 70 72 6f 67 72 61 6d 0a 20  * vdbe program. 
0850: 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
0860: 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 73 71 6c  e->db;.  v = sql
0870: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
0880: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
0890: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
08a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  ddOp(v, OP_Halt,
08b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
08c0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
08d0: 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  sk!=0 ){.      u
08e0: 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69  32 mask;.      i
08f0: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71  nt iDb;.      sq
0900: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
0910: 32 28 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  2(v, pParse->coo
0920: 6b 69 65 47 6f 74 6f 2c 20 73 71 6c 69 74 65 33  kieGoto, sqlite3
0930: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
0940: 76 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  v));.      for(i
0950: 44 62 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44  Db=0, mask=1; iD
0960: 62 3c 64 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c  b<db->nDb; mask<
0970: 3c 3d 31 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20  <=1, iDb++){.   
0980: 20 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26       if( (mask &
0990: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
09a0: 61 73 6b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ask)==0 ) contin
09b0: 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ue;.        sqli
09c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
09d0: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
09e0: 69 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50 61  iDb, (mask & pPa
09f0: 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21  rse->writeMask)!
0a00: 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  =0);.        if(
0a10: 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20   iDb!=1 ){.     
0a20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
0a30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69  AddOp(v, OP_Veri
0a40: 66 79 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 70  fyCookie, iDb, p
0a50: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c  Parse->cookieVal
0a60: 75 65 5b 69 44 62 5d 29 3b 0a 20 20 20 20 20 20  ue[iDb]);.      
0a70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
0a80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
0a90: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
0aa0: 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  , pParse->cookie
0ab0: 47 6f 74 6f 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  Goto+1);.    }. 
0ac0: 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65   }..  /* Get the
0ad0: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65   VDBE program re
0ae0: 61 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f  ady for executio
0af0: 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26  n.  */.  if( v &
0b00: 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  & pParse->nErr==
0b10: 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74  0 ){.    FILE *t
0b20: 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67  race = (db->flag
0b30: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54  s & SQLITE_VdbeT
0b40: 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75  race)!=0 ? stdou
0b50: 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  t : 0;.    sqlit
0b60: 65 33 56 64 62 65 54 72 61 63 65 28 76 2c 20 74  e3VdbeTrace(v, t
0b70: 72 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  race);.    sqlit
0b80: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
0b90: 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  v, pParse->nVar,
0ba0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
0bb0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  );.    pParse->r
0bc0: 63 20 3d 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  c = pParse->nErr
0bd0: 20 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20   ? SQLITE_ERROR 
0be0: 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  : SQLITE_DONE;. 
0bf0: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61     pParse->colNa
0c00: 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65  mesSet = 0;.  }e
0c10: 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e  lse if( pParse->
0c20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
0c30: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
0c40: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
0c50: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54    }.  pParse->nT
0c60: 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ab = 0;.  pParse
0c70: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50  ->nMem = 0;.  pP
0c80: 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a  arse->nSet = 0;.
0c90: 20 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d    pParse->nAgg =
0ca0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56   0;.  pParse->nV
0cb0: 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ar = 0;.  pParse
0cc0: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30  ->cookieMask = 0
0cd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
0ce0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
0cf0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
0d00: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
0d10: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
0d20: 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  se table given t
0d30: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68  he name.** of th
0d40: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
0d50: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
0d60: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
0d70: 73 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  se.** containing
0d80: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
0d90: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
0da0: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  found..**.** If 
0db0: 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20  zDatabase is 0, 
0dc0: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72  all databases ar
0dd0: 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
0de0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  he.** table and 
0df0: 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
0e00: 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75  ng table is retu
0e10: 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b  rned.  (No check
0e20: 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69  ing.** for dupli
0e30: 63 61 74 65 20 74 61 62 6c 65 20 6e 61 6d 65 73  cate table names
0e40: 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20   is done.)  The 
0e50: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a  search order is.
0e60: 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74  ** TEMP first, t
0e70: 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61  hen MAIN, then a
0e80: 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ny auxiliary dat
0e90: 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20  abases added.** 
0ea0: 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48  using the ATTACH
0eb0: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
0ec0: 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
0ed0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a  LocateTable()..*
0ee0: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
0ef0: 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65  FindTable(sqlite
0f00: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
0f10: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
0f20: 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b  har *zDatabase){
0f30: 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b  .  Table *p = 0;
0f40: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
0f50: 72 63 20 3d 20 73 71 6c 69 74 65 33 52 65 61 64  rc = sqlite3Read
0f60: 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20  Schema(db, 0);. 
0f70: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
0f80: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
0f90: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
0fa0: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
0fb0: 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65  i^1 : i;   /* Se
0fc0: 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65  arch TEMP before
0fd0: 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28   MAIN */.    if(
0fe0: 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26   zDatabase!=0 &&
0ff0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1000: 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61  zDatabase, db->a
1010: 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63  Db[j].zName) ) c
1020: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d  ontinue;.    p =
1030: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
1040: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62 6c  (&db->aDb[j].tbl
1050: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  Hash, zName, str
1060: 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20  len(zName)+1);. 
1070: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
1080: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1090: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
10a0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
10b0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
10c0: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
10d0: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
10e0: 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  se table given t
10f0: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68  he name.** of th
1100: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
1110: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
1120: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
1130: 73 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  se.** containing
1140: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
1150: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
1160: 66 6f 75 6e 64 2e 0a 2a 2a 20 41 6c 73 6f 20 6c  found..** Also l
1170: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
1180: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
1190: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
11a0: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
11b0: 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
11c0: 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46  ine and sqlite3F
11d0: 69 6e 64 54 61 62 6c 65 28 29 0a 2a 2a 20 69 73  indTable().** is
11e0: 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
11f0: 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72  ne leaves an err
1200: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
1210: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 0a 2a 2a  arse->zErrMsg.**
1220: 20 77 68 65 72 65 20 73 71 6c 69 74 65 33 46 69   where sqlite3Fi
1230: 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e  ndTable() does n
1240: 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ot..*/.Table *sq
1250: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
1260: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1270: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1280: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1290: 44 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20  Dbase){.  Table 
12a0: 2a 70 3b 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74  *p;..  p = sqlit
12b0: 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
12c0: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  se->db, zName, z
12d0: 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  Dbase);.  if( p=
12e0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 44  =0 ){.    if( zD
12f0: 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71  base ){.      sq
1300: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1310: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
1320: 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20 7a 44  able: %s.%s", zD
1330: 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  base, zName);.  
1340: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
1350: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61  te3FindTable(pPa
1360: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  rse->db, zName, 
1370: 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  0)!=0 ){.      s
1380: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1390: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 5c 22  Parse, "table \"
13a0: 25 73 5c 22 20 69 73 20 6e 6f 74 20 69 6e 20 64  %s\" is not in d
13b0: 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22 22 2c  atabase \"%s\"",
13c0: 0a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c  .         zName,
13d0: 20 7a 44 62 61 73 65 29 3b 0a 20 20 20 20 7d 65   zDbase);.    }e
13e0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
13f0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1400: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
1410: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
1420: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1430: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn p;.}../*.** L
1440: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
1450: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
1460: 61 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a  at describes .**
1470: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e   a particular in
1480: 64 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61  dex given the na
1490: 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78  me of that index
14a0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65  .** and the name
14b0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
14c0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
14d0: 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74  he index..** Ret
14e0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
14f0: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  found..**.** If 
1500: 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20  zDatabase is 0, 
1510: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72  all databases ar
1520: 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
1530: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  he.** table and 
1540: 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
1550: 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65 74 75  ng index is retu
1560: 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b  rned.  (No check
1570: 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69  ing.** for dupli
1580: 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73  cate index names
1590: 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20   is done.)  The 
15a0: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a  search order is.
15b0: 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74  ** TEMP first, t
15c0: 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61  hen MAIN, then a
15d0: 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ny auxiliary dat
15e0: 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20  abases added.** 
15f0: 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48  using the ATTACH
1600: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64   command..*/.Ind
1610: 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49  ex *sqlite3FindI
1620: 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c  ndex(sqlite *db,
1630: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1640: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
1650: 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  zDb){.  Index *p
1660: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
1670: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
1680: 33 52 65 61 64 53 63 68 65 6d 61 28 64 62 2c 20  3ReadSchema(db, 
1690: 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72  0);.  for(i=0; r
16a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
16b0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
16c0: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
16d0: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f  2) ? i^1 : i;  /
16e0: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
16f0: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
1700: 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69   if( zDb && sqli
1710: 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20  te3StrICmp(zDb, 
1720: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65  db->aDb[j].zName
1730: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
1740: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
1750: 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a  hFind(&db->aDb[j
1760: 5d 2e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65  ].idxHash, zName
1770: 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b  , strlen(zName)+
1780: 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20  1);.    if( p ) 
1790: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
17a0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
17b0: 52 65 6d 6f 76 65 20 74 68 65 20 67 69 76 65 6e  Remove the given
17c0: 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20   index from the 
17d0: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
17e0: 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74  , and free.** it
17f0: 73 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  s memory structu
1800: 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  res..**.** The i
1810: 6e 64 65 78 20 69 73 20 72 65 6d 6f 76 65 64 20  ndex is removed 
1820: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1830: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 62 75  e hash tables bu
1840: 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 75  t.** it is not u
1850: 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65  nlinked from the
1860: 20 54 61 62 6c 65 20 74 68 61 74 20 69 74 20 69   Table that it i
1870: 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e  ndexes..** Unlin
1880: 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 54 61  king from the Ta
1890: 62 6c 65 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  ble must be done
18a0: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
18b0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
18c0: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 44  tic void sqliteD
18d0: 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74  eleteIndex(sqlit
18e0: 65 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29  e *db, Index *p)
18f0: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b  {.  Index *pOld;
1900: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
1910: 30 20 26 26 20 70 2d 3e 7a 4e 61 6d 65 21 3d 30  0 && p->zName!=0
1920: 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c   );.  pOld = sql
1930: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
1940: 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e  db->aDb[p->iDb].
1950: 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  idxHash, p->zNam
1960: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
1980: 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c  len(p->zName)+1,
1990: 20 30 29 3b 0a 20 20 69 66 28 20 70 4f 6c 64 21   0);.  if( pOld!
19a0: 3d 30 20 26 26 20 70 4f 6c 64 21 3d 70 20 29 7b  =0 && pOld!=p ){
19b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
19c0: 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b  Insert(&db->aDb[
19d0: 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c  p->iDb].idxHash,
19e0: 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pOld->zName,.  
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a00: 20 20 20 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e     strlen(pOld->
1a10: 7a 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b  zName)+1, pOld);
1a20: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 43  .  }.  if( p->zC
1a30: 6f 6c 41 66 66 20 29 7b 0a 20 20 20 20 73 71 6c  olAff ){.    sql
1a40: 69 74 65 46 72 65 65 28 70 2d 3e 7a 43 6f 6c 41  iteFree(p->zColA
1a50: 66 66 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ff);.  }.  sqlit
1a60: 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eFree(p);.}../*.
1a70: 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69  ** Unlink the gi
1a80: 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 69  ven index from i
1a90: 74 73 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72  ts table, then r
1aa0: 65 6d 6f 76 65 0a 2a 2a 20 74 68 65 20 69 6e 64  emove.** the ind
1ab0: 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ex from the inde
1ac0: 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  x hash table and
1ad0: 20 66 72 65 65 20 69 74 73 20 6d 65 6d 6f 72 79   free its memory
1ae0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 2e 0a  .** structures..
1af0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55  */.void sqlite3U
1b00: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e  nlinkAndDeleteIn
1b10: 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20  dex(sqlite *db, 
1b20: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a  Index *pIndex){.
1b30: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54    if( pIndex->pT
1b40: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49  able->pIndex==pI
1b50: 6e 64 65 78 20 29 7b 0a 20 20 20 20 70 49 6e 64  ndex ){.    pInd
1b60: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
1b70: 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  ex = pIndex->pNe
1b80: 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  xt;.  }else{.   
1b90: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 66   Index *p;.    f
1ba0: 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61  or(p=pIndex->pTa
1bb0: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26  ble->pIndex; p &
1bc0: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
1bd0: 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b  ex; p=p->pNext){
1be0: 7d 0a 20 20 20 20 69 66 28 20 70 20 26 26 20 70  }.    if( p && p
1bf0: 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20  ->pNext==pIndex 
1c00: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  ){.      p->pNex
1c10: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
1c20: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  t;.    }.  }.  s
1c30: 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78  qliteDeleteIndex
1c40: 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 7d 0a  (db, pIndex);.}.
1c50: 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c  ./*.** Erase all
1c60: 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74   schema informat
1c70: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d  ion from the in-
1c80: 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c  memory hash tabl
1c90: 65 73 20 6f 66 0a 2a 2a 20 64 61 74 61 62 61 73  es of.** databas
1ca0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54  e connection.  T
1cb0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1cc0: 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c 61 69 6d  alled to reclaim
1cd0: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f 72   memory.** befor
1ce0: 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
1cf0: 20 63 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20   closes.  It is 
1d00: 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69  also called duri
1d10: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  ng a rollback.**
1d20: 20 69 66 20 74 68 65 72 65 20 77 65 72 65 20 73   if there were s
1d30: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75  chema changes du
1d40: 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63  ring the transac
1d50: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  tion..**.** If i
1d60: 44 62 3c 3d 30 20 74 68 65 6e 20 72 65 73 65 74  Db<=0 then reset
1d70: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63   the internal sc
1d80: 68 65 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20  hema tables for 
1d90: 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  all database.** 
1da0: 66 69 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d  files.  If iDb>=
1db0: 32 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65  2 then reset the
1dc0: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
1dd0: 20 66 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a   for only the.**
1de0: 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64   single file ind
1df0: 69 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  icated..*/.void 
1e00: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
1e10: 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74  rnalSchema(sqlit
1e20: 65 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b  e *db, int iDb){
1e30: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c  .  HashElem *pEl
1e40: 65 6d 3b 0a 20 20 48 61 73 68 20 74 65 6d 70 31  em;.  Hash temp1
1e50: 3b 0a 20 20 48 61 73 68 20 74 65 6d 70 32 3b 0a  ;.  Hash temp2;.
1e60: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 61    int i, j;..  a
1e70: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
1e80: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
1e90: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
1ea0: 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a  SQLITE_Initializ
1eb0: 65 64 3b 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b  ed;.  for(i=iDb;
1ec0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
1ed0: 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20  {.    Db *pDb = 
1ee0: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
1ef0: 20 74 65 6d 70 31 20 3d 20 70 44 62 2d 3e 74 62   temp1 = pDb->tb
1f00: 6c 48 61 73 68 3b 0a 20 20 20 20 74 65 6d 70 32  lHash;.    temp2
1f10: 20 3d 20 70 44 62 2d 3e 74 72 69 67 48 61 73 68   = pDb->trigHash
1f20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73  ;.    sqlite3Has
1f30: 68 49 6e 69 74 28 26 70 44 62 2d 3e 74 72 69 67  hInit(&pDb->trig
1f40: 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53  Hash, SQLITE_HAS
1f50: 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20  H_STRING, 0);.  
1f60: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
1f70: 61 72 28 26 70 44 62 2d 3e 61 46 4b 65 79 29 3b  ar(&pDb->aFKey);
1f80: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
1f90: 43 6c 65 61 72 28 26 70 44 62 2d 3e 69 64 78 48  Clear(&pDb->idxH
1fa0: 61 73 68 29 3b 0a 20 20 20 20 66 6f 72 28 70 45  ash);.    for(pE
1fb0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
1fc0: 72 73 74 28 26 74 65 6d 70 32 29 3b 20 70 45 6c  rst(&temp2); pEl
1fd0: 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
1fe0: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
1ff0: 7b 0a 20 20 20 20 20 20 54 72 69 67 67 65 72 20  {.      Trigger 
2000: 2a 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69  *pTrigger = sqli
2010: 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
2020: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2030: 44 65 6c 65 74 65 54 72 69 67 67 65 72 28 70 54  DeleteTrigger(pT
2040: 72 69 67 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  rigger);.    }. 
2050: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c     sqlite3HashCl
2060: 65 61 72 28 26 74 65 6d 70 32 29 3b 0a 20 20 20  ear(&temp2);.   
2070: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
2080: 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20  (&pDb->tblHash, 
2090: 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49  SQLITE_HASH_STRI
20a0: 4e 47 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28  NG, 0);.    for(
20b0: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
20c0: 46 69 72 73 74 28 26 74 65 6d 70 31 29 3b 20 70  First(&temp1); p
20d0: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
20e0: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
20f0: 29 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  )){.      Table 
2100: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
2110: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
2120: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
2130: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  teTable(db, pTab
2140: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2150: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 74  ite3HashClear(&t
2160: 65 6d 70 31 29 3b 0a 20 20 20 20 44 62 43 6c 65  emp1);.    DbCle
2170: 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  arProperty(db, i
2180: 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65  , DB_SchemaLoade
2190: 64 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3e  d);.    if( iDb>
21a0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a  0 ) return;.  }.
21b0: 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30    assert( iDb==0
21c0: 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20   );.  db->flags 
21d0: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
21e0: 6e 43 68 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20  nChanges;..  /* 
21f0: 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  If one or more o
2200: 66 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  f the auxiliary 
2210: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68  database files h
2220: 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a  as been closed,.
2230: 20 20 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65    ** then remove
2240: 20 74 68 65 6e 20 66 72 6f 6d 20 74 68 65 20 61   then from the a
2250: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
2260: 65 20 6c 69 73 74 2e 20 20 57 65 20 74 61 6b 65  e list.  We take
2270: 20 74 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74   the.  ** opport
2280: 75 6e 69 74 79 20 74 6f 20 64 6f 20 74 68 69 73  unity to do this
2290: 20 68 65 72 65 20 73 69 6e 63 65 20 77 65 20 68   here since we h
22a0: 61 76 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64  ave just deleted
22b0: 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a   all of the.  **
22c0: 20 73 63 68 65 6d 61 20 68 61 73 68 20 74 61 62   schema hash tab
22d0: 6c 65 73 20 61 6e 64 20 74 68 65 72 65 66 6f 72  les and therefor
22e0: 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  e do not have to
22f0: 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65   make any change
2300: 73 0a 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66  s.  ** to any of
2310: 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20   those tables.. 
2320: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
2330: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
2340: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
2350: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
2360: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
2370: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  Bt==0 ){.      i
2380: 66 28 20 70 44 62 2d 3e 70 41 75 78 20 26 26 20  f( pDb->pAux && 
2390: 70 44 62 2d 3e 78 46 72 65 65 41 75 78 20 29 20  pDb->xFreeAux ) 
23a0: 70 44 62 2d 3e 78 46 72 65 65 41 75 78 28 70 44  pDb->xFreeAux(pD
23b0: 62 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20  b->pAux);.      
23c0: 70 44 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20  pDb->pAux = 0;. 
23d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
23e0: 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  =j=2; i<db->nDb;
23f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
2400: 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d  t Db *pDb = &db-
2410: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
2420: 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a   pDb->pBt==0 ){.
2430: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
2440: 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  (pDb->zName);.  
2450: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d      pDb->zName =
2460: 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   0;.      contin
2470: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
2480: 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64  ( j<i ){.      d
2490: 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e  b->aDb[j] = db->
24a0: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  aDb[i];.    }.  
24b0: 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d    j++;.  }.  mem
24c0: 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c  set(&db->aDb[j],
24d0: 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a   0, (db->nDb-j)*
24e0: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a  sizeof(db->aDb[j
24f0: 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d  ]));.  db->nDb =
2500: 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44   j;.  if( db->nD
2510: 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21  b<=2 && db->aDb!
2520: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
2530: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d  {.    memcpy(db-
2540: 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e  >aDbStatic, db->
2550: 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62  aDb, 2*sizeof(db
2560: 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20  ->aDb[0]));.    
2570: 73 71 6c 69 74 65 46 72 65 65 28 64 62 2d 3e 61  sqliteFree(db->a
2580: 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Db);.    db->aDb
2590: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
25a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
25b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
25c0: 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61  alled whenever a
25d0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
25e0: 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
25f0: 0a 2a 2a 20 73 63 68 65 6d 61 20 63 68 61 6e 67  .** schema chang
2600: 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72  es during the tr
2610: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
2620: 77 65 20 68 61 76 65 20 74 6f 20 72 65 73 65 74  we have to reset
2630: 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c   the.** internal
2640: 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64   hash tables and
2650: 20 72 65 6c 6f 61 64 20 74 68 65 6d 20 66 72 6f   reload them fro
2660: 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  m disk..*/.void 
2670: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 49  sqlite3RollbackI
2680: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73  nternalChanges(s
2690: 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 69 66  qlite *db){.  if
26a0: 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
26b0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
26c0: 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  es ){.    sqlite
26d0: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
26e0: 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d  hema(db, 0);.  }
26f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2700: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2710: 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f   when a commit o
2720: 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ccurs..*/.void s
2730: 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65  qlite3CommitInte
2740: 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69  rnalChanges(sqli
2750: 74 65 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 61  te *db){.  db->a
2760: 44 62 5b 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f  Db[0].schema_coo
2770: 6b 69 65 20 3d 20 64 62 2d 3e 6e 65 78 74 5f 63  kie = db->next_c
2780: 6f 6f 6b 69 65 3b 0a 20 20 64 62 2d 3e 66 6c 61  ookie;.  db->fla
2790: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
27a0: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
27b0: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
27c0: 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72   memory data str
27d0: 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74  uctures associat
27e0: 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
27f0: 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20  n.** Table.  No 
2800: 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
2810: 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73   to disk by this
2820: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
2830: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
2840: 74 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61  t deletes the da
2850: 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  ta structure.  I
2860: 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e  t does not unlin
2870: 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64  k.** the table d
2880: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72  ata structure fr
2890: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
28a0: 65 2e 20 20 4e 6f 72 20 64 6f 65 73 20 69 74 20  e.  Nor does it 
28b0: 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67  remove.** foreig
28c0: 6e 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 65 20  n keys from the 
28d0: 73 71 6c 69 74 65 2e 61 46 4b 65 79 20 68 61 73  sqlite.aFKey has
28e0: 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74  h table.  But it
28f0: 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a   does destroy.**
2900: 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
2910: 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65  es of the indice
2920: 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65  s and foreign ke
2930: 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
2940: 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  th .** the table
2950: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20  ..**.** Indices 
2960: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2970: 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 75 6e  the table are un
2980: 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20  linked from the 
2990: 22 64 62 22 0a 2a 2a 20 64 61 74 61 20 73 74 72  "db".** data str
29a0: 75 63 74 75 72 65 20 69 66 20 64 62 21 3d 4e 55  ucture if db!=NU
29b0: 4c 4c 2e 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c  LL.  If db==NULL
29c0: 2c 20 69 6e 64 69 63 65 73 20 61 74 74 61 63 68  , indices attach
29d0: 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62  ed to.** the tab
29e0: 6c 65 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20  le are deleted, 
29f0: 62 75 74 20 69 74 20 69 73 20 61 73 73 75 6d 65  but it is assume
2a00: 64 20 74 68 65 79 20 68 61 76 65 20 61 6c 72 65  d they have alre
2a10: 61 64 79 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69  ady been.** unli
2a20: 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nked..*/.void sq
2a30: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
2a40: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 54 61 62  (sqlite *db, Tab
2a50: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69  le *pTable){.  i
2a60: 6e 74 20 69 3b 0a 20 20 49 6e 64 65 78 20 2a 70  nt i;.  Index *p
2a70: 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20  Index, *pNext;. 
2a80: 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c 20 2a 70   FKey *pFKey, *p
2a90: 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20 69 66 28  NextFKey;..  if(
2aa0: 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74   pTable==0 ) ret
2ab0: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  urn;..  /* Delet
2ac0: 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73  e all indices as
2ad0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
2ae0: 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20  is table.  */.  
2af0: 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61  for(pIndex = pTa
2b00: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e  ble->pIndex; pIn
2b10: 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78  dex; pIndex=pNex
2b20: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
2b30: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
2b40: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65     assert( pInde
2b50: 78 2d 3e 69 44 62 3d 3d 70 54 61 62 6c 65 2d 3e  x->iDb==pTable->
2b60: 69 44 62 20 7c 7c 20 28 70 54 61 62 6c 65 2d 3e  iDb || (pTable->
2b70: 69 44 62 3d 3d 30 20 26 26 20 70 49 6e 64 65 78  iDb==0 && pIndex
2b80: 2d 3e 69 44 62 3d 3d 31 29 20 29 3b 0a 20 20 20  ->iDb==1) );.   
2b90: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64   sqliteDeleteInd
2ba0: 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
2bb0: 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
2bc0: 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79   all foreign key
2bd0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2be0: 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20 54  h this table.  T
2bf0: 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f  he keys.  ** sho
2c00: 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
2c10: 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66   been unlinked f
2c20: 72 6f 6d 20 74 68 65 20 64 62 2d 3e 61 46 4b 65  rom the db->aFKe
2c30: 79 20 68 61 73 68 20 74 61 62 6c 65 20 0a 20 20  y hash table .  
2c40: 2a 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d 70  */.  for(pFKey=p
2c50: 54 61 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46  Table->pFKey; pF
2c60: 4b 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74  Key; pFKey=pNext
2c70: 46 4b 65 79 29 7b 0a 20 20 20 20 70 4e 65 78 74  FKey){.    pNext
2c80: 46 4b 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e  FKey = pFKey->pN
2c90: 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73  extFrom;.    ass
2ca0: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 69 44 62  ert( pTable->iDb
2cb0: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  <db->nDb );.    
2cc0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 48  assert( sqlite3H
2cd0: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62  ashFind(&db->aDb
2ce0: 5b 70 54 61 62 6c 65 2d 3e 69 44 62 5d 2e 61 46  [pTable->iDb].aF
2cf0: 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Key,.           
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d10: 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c  pFKey->zTo, strl
2d20: 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31  en(pFKey->zTo)+1
2d30: 29 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20 20  )!=pFKey );.    
2d40: 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79  sqliteFree(pFKey
2d50: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
2d60: 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73 74  ete the Table st
2d70: 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a  ructure itself..
2d80: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
2d90: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
2da0: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
2db0: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f  Free(pTable->aCo
2dc0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[i].zName);.   
2dd0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
2de0: 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c  le->aCol[i].zDfl
2df0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  t);.    sqliteFr
2e00: 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  ee(pTable->aCol[
2e10: 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20  i].zType);.  }. 
2e20: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
2e30: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  le->zName);.  sq
2e40: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
2e50: 3e 61 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 54  >aCol);.  if( pT
2e60: 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b  able->zColAff ){
2e70: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2e80: 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29  pTable->zColAff)
2e90: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
2ea0: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61 62  electDelete(pTab
2eb0: 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  le->pSelect);.  
2ec0: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
2ed0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  e);.}../*.** Unl
2ee0: 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61  ink the given ta
2ef0: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73  ble from the has
2f00: 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65  h tables and the
2f10: 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74   delete the.** t
2f20: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77  able structure w
2f30: 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69  ith all its indi
2f40: 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20  ces and foreign 
2f50: 6b 65 79 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  keys..*/.static 
2f60: 76 6f 69 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e  void sqliteUnlin
2f70: 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28  kAndDeleteTable(
2f80: 73 71 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c  sqlite *db, Tabl
2f90: 65 20 2a 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a  e *p){.  Table *
2fa0: 70 4f 6c 64 3b 0a 20 20 46 4b 65 79 20 2a 70 46  pOld;.  FKey *pF
2fb0: 31 2c 20 2a 70 46 32 3b 0a 20 20 69 6e 74 20 69  1, *pF2;.  int i
2fc0: 20 3d 20 70 2d 3e 69 44 62 3b 0a 20 20 61 73 73   = p->iDb;.  ass
2fd0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
2fe0: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
2ff0: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44  shInsert(&db->aD
3000: 62 5b 69 5d 2e 74 62 6c 48 61 73 68 2c 20 70 2d  b[i].tblHash, p-
3010: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
3020: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a  ->zName)+1, 0);.
3030: 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d    assert( pOld==
3040: 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a  0 || pOld==p );.
3050: 20 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b    for(pF1=p->pFK
3060: 65 79 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31  ey; pF1; pF1=pF1
3070: 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20  ->pNextFrom){.  
3080: 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c    int nTo = strl
3090: 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31  en(pF1->zTo) + 1
30a0: 3b 0a 20 20 20 20 70 46 32 20 3d 20 73 71 6c 69  ;.    pF2 = sqli
30b0: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
30c0: 3e 61 44 62 5b 69 5d 2e 61 46 4b 65 79 2c 20 70  >aDb[i].aFKey, p
30d0: 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20  F1->zTo, nTo);. 
30e0: 20 20 20 69 66 28 20 70 46 32 3d 3d 70 46 31 20     if( pF2==pF1 
30f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3100: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
3110: 61 44 62 5b 69 5d 2e 61 46 4b 65 79 2c 20 70 46  aDb[i].aFKey, pF
3120: 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31  1->zTo, nTo, pF1
3130: 2d 3e 70 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20  ->pNextTo);.    
3140: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 68 69  }else{.      whi
3150: 6c 65 28 20 70 46 32 20 26 26 20 70 46 32 2d 3e  le( pF2 && pF2->
3160: 70 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b 20  pNextTo!=pF1 ){ 
3170: 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f  pF2=pF2->pNextTo
3180: 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46  ; }.      if( pF
3190: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 32  2 ){.        pF2
31a0: 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 46 31 2d  ->pNextTo = pF1-
31b0: 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 20 20  >pNextTo;.      
31c0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
31d0: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
31e0: 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
31f0: 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * Construct the 
3200: 6e 61 6d 65 20 6f 66 20 61 20 75 73 65 72 20 74  name of a user t
3210: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 66 72  able or index fr
3220: 6f 6d 20 61 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a  om a token..**.*
3230: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
3240: 74 68 65 20 6e 61 6d 65 20 69 73 20 6f 62 74 61  the name is obta
3250: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
3260: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  Malloc() and mus
3270: 74 0a 2a 2a 20 62 65 20 66 72 65 65 64 20 62 79  t.** be freed by
3280: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
3290: 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a  ction..*/.char *
32a0: 73 71 6c 69 74 65 33 54 61 62 6c 65 4e 61 6d 65  sqlite3TableName
32b0: 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20  FromToken(Token 
32c0: 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  *pName){.  char 
32d0: 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  *zName = sqliteS
32e0: 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c  trNDup(pName->z,
32f0: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 73 71   pName->n);.  sq
3300: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
3310: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e  me);.  return zN
3320: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ame;.}../*.** Op
3330: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  en the sqlite_ma
3340: 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65  ster table store
3350: 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75  d in database nu
3360: 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20  mber iDb for.** 
3370: 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62  writing. The tab
3380: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  le is opened usi
3390: 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a  ng cursor 0..*/.
33a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e  void sqlite3Open
33b0: 4d 61 73 74 65 72 54 61 62 6c 65 28 56 64 62 65  MasterTable(Vdbe
33c0: 20 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20   *v, int iDb){. 
33d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
33e0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
33f0: 20 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69   iDb, 0);.  sqli
3400: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3410: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c  OP_OpenWrite, 0,
3420: 20 4d 41 53 54 45 52 5f 52 4f 4f 54 29 3b 0a 20   MASTER_ROOT);. 
3430: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3440: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
3450: 6c 75 6d 6e 73 2c 20 30 2c 20 35 29 3b 20 2f 2a  lumns, 0, 5); /*
3460: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 68   sqlite_master h
3470: 61 73 20 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  as 5 columns */.
3480: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
3490: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
34a0: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
34b0: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
34c0: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
34d0: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
34e0: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
34f0: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
3500: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
3510: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
3520: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
3530: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
3540: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
3550: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
3560: 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6e  xist..*/.int fin
3570: 64 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dDb(sqlite3 *db,
3580: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
3590: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
35a0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
35b0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4e 61  ++){.    if( pNa
35c0: 6d 65 2d 3e 6e 3d 3d 73 74 72 6c 65 6e 28 64 62  me->n==strlen(db
35d0: 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 20  ->aDb[i].zName) 
35e0: 26 26 20 0a 20 20 20 20 20 20 20 20 30 3d 3d 73  && .        0==s
35f0: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 64  qlite3StrNICmp(d
3600: 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 2c  b->aDb[i].zName,
3610: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
3620: 2d 3e 6e 29 20 29 7b 0a 20 20 20 20 20 20 72 65  ->n) ){.      re
3630: 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20  turn i;.    }.  
3640: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
3650: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f  ..int sqlite3Two
3660: 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73  PartName(.  Pars
3670: 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 54 6f  e *pParse, .  To
3680: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 0a 20 20  ken *pName1, .  
3690: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 0a  Token *pName2, .
36a0: 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61    Token **pUnqua
36b0: 6c 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  l.){.  int iDb;.
36c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
36d0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
36e0: 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61  f( pName2 && pNa
36f0: 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  me2->n>0 ){.    
3700: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69  assert( !db->ini
3710: 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 2a 70  t.busy );.    *p
3720: 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b  Unqual = pName2;
3730: 0a 20 20 20 20 69 44 62 20 3d 20 66 69 6e 64 44  .    iDb = findD
3740: 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20  b(db, pName1);. 
3750: 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a     if( iDb<0 ){.
3760: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
3770: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
3780: 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20  nknown database 
3790: 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  %T", pName1);.  
37a0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
37b0: 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
37c0: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   -1;.    }.  }el
37d0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
37e0: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20  db->init.iDb==0 
37f0: 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  || db->init.busy
3800: 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62   );.    iDb = db
3810: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
3820: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
3830: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
3840: 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  iDb;.}../*.** Be
3850: 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  gin constructing
3860: 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70   a new table rep
3870: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d  resentation in m
3880: 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a  emory.  This is.
3890: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  ** the first of 
38a0: 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72  several action r
38b0: 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74  outines that get
38c0: 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f   called in respo
38d0: 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41  nse.** to a CREA
38e0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
38f0: 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c  nt.  In particul
3900: 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ar, this routine
3910: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66   is called.** af
3920: 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e  ter seeing token
3930: 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22  s "CREATE" and "
3940: 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74  TABLE" and the t
3950: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a  able name.  The.
3960: 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b 65 6e 20  ** pStart token 
3970: 69 73 20 74 68 65 20 43 52 45 41 54 45 20 61 6e  is the CREATE an
3980: 64 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 74  d pName is the t
3990: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
39a0: 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69  isTemp.** flag i
39b0: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61  s true if the ta
39c0: 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74  ble should be st
39d0: 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69  ored in the auxi
39e0: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a  liary database.*
39f0: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
3a00: 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  f in the main da
3a10: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
3a20: 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74  is is normally t
3a30: 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20  he case.** when 
3a40: 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54  the "TEMP" or "T
3a50: 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72  EMPORARY" keywor
3a60: 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  d occurs in betw
3a70: 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e  een.** CREATE an
3a80: 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54  d TABLE..**.** T
3a90: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
3aa0: 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ord is initializ
3ab0: 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50  ed and put in pP
3ac0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e  arse->pNewTable.
3ad0: 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74  .** As more of t
3ae0: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
3af0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
3b00: 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  sed, additional 
3b10: 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e  action.** routin
3b20: 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  es will be calle
3b30: 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e  d to add more in
3b40: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69  formation to thi
3b50: 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20  s record..** At 
3b60: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
3b70: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
3b80: 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74  ement, the sqlit
3b90: 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75  e3EndTable() rou
3ba0: 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
3bb0: 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  d to complete th
3bc0: 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f  e construction o
3bd0: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
3be0: 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20  record..*/.void 
3bf0: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
3c00: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
3c10: 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20  se,   /* Parser 
3c20: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
3c30: 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a  en *pStart,   /*
3c40: 20 54 68 65 20 22 43 52 45 41 54 45 22 20 74 6f   The "CREATE" to
3c50: 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ken */.  Token *
3c60: 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72  pName1,   /* Fir
3c70: 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  st part of the n
3c80: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
3c90: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f   or view */.  To
3ca0: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f  ken *pName2,   /
3cb0: 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
3cc0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
3cd0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
3ce0: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20  /.  int isTemp, 
3cf0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3d00: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74  this is a TEMP t
3d10: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  able */.  int is
3d20: 56 69 65 77 20 20 20 20 20 20 20 2f 2a 20 54 72  View       /* Tr
3d30: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
3d40: 56 49 45 57 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  VIEW */.){.  Tab
3d50: 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49 6e  le *pTable;.  In
3d60: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 63 68 61  dex *pIdx;.  cha
3d70: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69  r *zName;.  sqli
3d80: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
3d90: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  >db;.  Vdbe *v;.
3da0: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
3db0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
3dc0: 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65 20  umber to create 
3dd0: 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a  the table in */.
3de0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20    Token *pName; 
3df0: 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65     /* Unqualifie
3e00: 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  d name of the ta
3e10: 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  ble to create */
3e20: 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  ..  /* The table
3e30: 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f   or view name to
3e40: 20 63 72 65 61 74 65 20 69 73 20 70 61 73 73 65   create is passe
3e50: 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  d to this routin
3e60: 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a  e via tokens.  *
3e70: 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61  * pName1 and pNa
3e80: 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c  me2. If the tabl
3e90: 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79  e name was fully
3ea0: 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20   qualified, for 
3eb0: 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  example:.  **.  
3ec0: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
3ed0: 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20  xxx.yyy (...);. 
3ee0: 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70   ** .  ** Then p
3ef0: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
3f00: 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32  "xxx" and pName2
3f10: 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f   "yyy". On the o
3f20: 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a  ther hand if.  *
3f30: 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  * the table name
3f40: 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75   is not fully qu
3f50: 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20  alified, i.e.:. 
3f60: 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20   **.  ** CREATE 
3f70: 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a  TABLE yyy(...);.
3f80: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70    **.  ** Then p
3f90: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
3fa0: 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32  "yyy" and pName2
3fb0: 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a   is ""..  **.  *
3fc0: 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77  * The call below
3fd0: 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20   sets the pName 
3fe0: 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
3ff0: 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70   at the token (p
4000: 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e  Name1 or.  ** pN
4010: 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65  ame2) that store
4020: 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  s the unqualifie
4030: 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68  d table name. Th
4040: 65 20 76 61 72 69 61 62 6c 65 20 69 44 62 20 69  e variable iDb i
4050: 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68  s.  ** set to th
4060: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64  e index of the d
4070: 61 74 61 62 61 73 65 20 74 68 61 74 20 74 68 65  atabase that the
4080: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69   table or view i
4090: 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65  s to be.  ** cre
40a0: 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ated in..  */.  
40b0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
40c0: 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
40d0: 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
40e0: 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20   &pName);.  if( 
40f0: 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb<0 ) return;.
4100: 20 20 69 66 28 20 69 73 54 65 6d 70 20 26 26 20    if( isTemp && 
4110: 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  iDb>1 ){.    /* 
4120: 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65  If creating a te
4130: 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61  mp table, the na
4140: 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75  me may not be qu
4150: 61 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 73  alified */.    s
4160: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4170: 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72  Parse, "temporar
4180: 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73  y table name mus
4190: 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64  t be unqualified
41a0: 22 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  ");.    pParse->
41b0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
41c0: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  rn;.  }.  if( is
41d0: 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a  Temp ) iDb = 1;.
41e0: 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65  .  pParse->sName
41f0: 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a  Token = *pName;.
4200: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
4210: 33 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f  3TableNameFromTo
4220: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66  ken(pName);.  if
4230: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
4240: 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 69  urn;.  if( db->i
4250: 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54  nit.iDb==1 ) isT
4260: 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  emp = 1;.#ifndef
4270: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
4280: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73  HORIZATION.  ass
4290: 65 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31  ert( (isTemp & 1
42a0: 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b  )==isTemp );.  {
42b0: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
42c0: 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64     char *zDb = d
42d0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
42e0: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
42f0: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
4300: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
4310: 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
4320: 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29  isTemp), 0, zDb)
4330: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4340: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
4350: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
4360: 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
4370: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54  ){.      if( isT
4380: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63  emp ){.        c
4390: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
43a0: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20  ATE_TEMP_VIEW;. 
43b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
43c0: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
43d0: 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20  E_CREATE_VIEW;. 
43e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
43f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 65  {.      if( isTe
4400: 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  mp ){.        co
4410: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
4420: 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20  TE_TEMP_TABLE;. 
4430: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4440: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
4450: 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a  E_CREATE_TABLE;.
4460: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4470: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
4480: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
4490: 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a  ode, zName, 0, z
44a0: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Db) ){.      sql
44b0: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
44c0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
44d0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
44e0: 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 72 79 69    /* Before tryi
44f0: 6e 67 20 74 6f 20 63 72 65 61 74 65 20 61 20 74  ng to create a t
4500: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
4510: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74  make sure the Bt
4520: 72 65 65 20 66 6f 72 0a 20 20 2a 2a 20 68 6f 6c  ree for.  ** hol
4530: 64 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74  ding temporary t
4540: 61 62 6c 65 73 20 69 73 20 6f 70 65 6e 2e 0a 20  ables is open.. 
4550: 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70   */.  if( isTemp
4560: 20 26 26 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70   && db->aDb[1].p
4570: 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65  Bt==0 && !pParse
4580: 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
4590: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
45a0: 33 42 74 72 65 65 46 61 63 74 6f 72 79 28 64 62  3BtreeFactory(db
45b0: 2c 20 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45  , 0, 0, MAX_PAGE
45c0: 53 2c 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  S, &db->aDb[1].p
45d0: 42 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Bt);.    if( rc!
45e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
45f0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4600: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
4610: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  ble to open a te
4620: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
4630: 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65   ".        "file
4640: 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d   for storing tem
4650: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b  porary tables");
4660: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
4670: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Err++;.      ret
4680: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
4690: 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 21  f( db->flags & !
46a0: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
46b0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
46c0: 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
46d0: 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ans(db->aDb[1].p
46e0: 42 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  Bt, 1, 0);.     
46f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
4700: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
4710: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
4720: 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
4730: 20 67 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63   get a write loc
4740: 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20 20 20 20  k on ".         
4750: 20 22 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20   "the temporary 
4760: 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 29 3b  database file");
4770: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
4780: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4790: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
47a0: 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  re the new table
47b0: 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63   name does not c
47c0: 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65  ollide with an e
47d0: 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  xisting.  ** ind
47e0: 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65  ex or table name
47f0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
4800: 61 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e  abase.  Issue an
4810: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
4820: 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 0a  f.  ** it does..
4830: 20 20 2a 2f 0a 20 20 70 54 61 62 6c 65 20 3d 20    */.  pTable = 
4840: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
4850: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e  (db, zName, db->
4860: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b  aDb[iDb].zName);
4870: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b  .  if( pTable ){
4880: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
4890: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
48a0: 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65  ble %T already e
48b0: 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a  xists", pName);.
48c0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
48d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
48e0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 49  n;.  }.  if( (pI
48f0: 64 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  dx = sqlite3Find
4900: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
4910: 20 30 29 29 21 3d 30 20 26 26 0a 20 20 20 20 20   0))!=0 &&.     
4920: 20 20 20 20 20 28 70 49 64 78 2d 3e 69 44 62 3d       (pIdx->iDb=
4930: 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e  =0 || !db->init.
4940: 62 75 73 79 29 20 29 7b 0a 20 20 20 20 73 71 6c  busy) ){.    sql
4950: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4960: 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
4970: 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20  lready an index 
4980: 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
4990: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
49a0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  e(zName);.    re
49b0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62  turn;.  }.  pTab
49c0: 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  le = sqliteMallo
49d0: 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  c( sizeof(Table)
49e0: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65   );.  if( pTable
49f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
4a00: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
4a10: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
4a20: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20  pTable->zName = 
4a30: 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d  zName;.  pTable-
4a40: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  >nCol = 0;.  pTa
4a50: 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  ble->aCol = 0;. 
4a60: 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d   pTable->iPKey =
4a70: 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70   -1;.  pTable->p
4a80: 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54 61  Index = 0;.  pTa
4a90: 62 6c 65 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a  ble->iDb = iDb;.
4aa0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e    if( pParse->pN
4ab0: 65 77 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65  ewTable ) sqlite
4ac0: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
4ad0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
4ae0: 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70  le);.  pParse->p
4af0: 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  NewTable = pTabl
4b00: 65 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67  e;..  /* Begin g
4b10: 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f  enerating the co
4b20: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73  de that will ins
4b30: 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65  ert the table re
4b40: 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74  cord into.  ** t
4b50: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
4b60: 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e   table.  Note in
4b70: 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74   particular that
4b80: 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61   we must go ahea
4b90: 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63  d.  ** and alloc
4ba0: 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ate the record n
4bb0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
4bc0: 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20  ble entry now.  
4bd0: 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20  Before any.  ** 
4be0: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
4bf0: 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61  NIQUE keywords a
4c00: 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73  re parsed.  Thos
4c10: 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20  e keywords will 
4c20: 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63  cause.  ** indic
4c30: 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  es to be created
4c40: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72   and the table r
4c50: 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20  ecord must come 
4c60: 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a  before the .  **
4c70: 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65   indices.  Hence
4c80: 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  , the record num
4c90: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
4ca0: 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  e must be alloca
4cb0: 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20  ted.  ** now..  
4cc0: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
4cd0: 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20  it.busy && (v = 
4ce0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
4cf0: 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20  Parse))!=0 ){.  
4d00: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
4d10: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
4d20: 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
4d30: 20 20 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b    if( !isTemp ){
4d40: 0a 20 20 20 20 20 20 2f 2a 20 45 76 65 72 79 20  .      /* Every 
4d50: 74 69 6d 65 20 61 20 6e 65 77 20 74 61 62 6c 65  time a new table
4d60: 20 69 73 20 63 72 65 61 74 65 64 20 74 68 65 20   is created the 
4d70: 66 69 6c 65 2d 66 6f 72 6d 61 74 0a 20 20 20 20  file-format.    
4d80: 20 20 2a 2a 20 61 6e 64 20 65 6e 63 6f 64 69 6e    ** and encodin
4d90: 67 20 6d 65 74 61 2d 76 61 6c 75 65 73 20 61 72  g meta-values ar
4da0: 65 20 73 65 74 20 69 6e 20 74 68 65 20 64 61 74  e set in the dat
4db0: 61 62 61 73 65 2c 20 69 6e 0a 20 20 20 20 20 20  abase, in.      
4dc0: 2a 2a 20 63 61 73 65 20 74 68 69 73 20 69 73 20  ** case this is 
4dd0: 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65 20  the first table 
4de0: 63 72 65 61 74 65 64 2e 0a 20 20 20 20 20 20 2a  created..      *
4df0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
4e00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
4e10: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 66 69 6c 65  nteger, db->file
4e20: 5f 66 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20  _format, 0);.   
4e30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4e40: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  dOp(v, OP_SetCoo
4e50: 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20  kie, iDb, 1);.  
4e60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4e70: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
4e80: 65 72 2c 20 64 62 2d 3e 65 6e 63 2c 20 30 29 3b  er, db->enc, 0);
4e90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4ea0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
4eb0: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 34 29  tCookie, iDb, 4)
4ec0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
4ed0: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
4ee0: 6c 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  le(v, iDb);.    
4ef0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4f00: 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c  (v, OP_NewRecno,
4f10: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
4f20: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4f30: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
4f40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4f50: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
4f60: 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  8, 0, 0);.    sq
4f70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4f80: 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20  , OP_PutIntKey, 
4f90: 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  0, 0);.  }.}../*
4fa0: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f  .** Add a new co
4fb0: 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c  lumn to the tabl
4fc0: 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  e currently bein
4fd0: 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a  g constructed..*
4fe0: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20  *.** The parser 
4ff0: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
5000: 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ne once for each
5010: 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74   column declarat
5020: 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41  ion.** in a CREA
5030: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
5040: 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72  nt.  sqlite3Star
5050: 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61  tTable() gets ca
5060: 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f  lled.** first to
5070: 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e   get things goin
5080: 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f  g.  Then this ro
5090: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
50a0: 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75  for each.** colu
50b0: 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  mn..*/.void sqli
50c0: 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72  te3AddColumn(Par
50d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
50e0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62  n *pName){.  Tab
50f0: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
5100: 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20    char *z = 0;. 
5110: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
5120: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
5130: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
5140: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
5150: 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 26 7a  te3SetNString(&z
5160: 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  , pName->z, pNam
5170: 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 69 66 28 20  e->n, 0);.  if( 
5180: 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
5190: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
51a0: 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  z);.  for(i=0; i
51b0: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  <p->nCol; i++){.
51c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
51d0: 74 72 49 43 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f  trICmp(z, p->aCo
51e0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
51f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
5200: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5210: 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d  "duplicate colum
5220: 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b  n name: %s", z);
5230: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
5240: 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(z);.      retu
5250: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
5260: 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30  if( (p->nCol & 0
5270: 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f  x7)==0 ){.    Co
5280: 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20  lumn *aNew;.    
5290: 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61  aNew = sqliteRea
52a0: 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28  lloc( p->aCol, (
52b0: 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f  p->nCol+8)*sizeo
52c0: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
52d0: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
52e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 2d  ) return;.    p-
52f0: 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20  >aCol = aNew;.  
5300: 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61  }.  pCol = &p->a
5310: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20  Col[p->nCol];.  
5320: 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20  memset(pCol, 0, 
5330: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
5340: 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61  ]));.  pCol->zNa
5350: 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49  me = z;. .  /* I
5360: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79  f there is no ty
5370: 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f  pe specified, co
5380: 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64  lumns have the d
5390: 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a  efault affinity.
53a0: 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20    ** 'NONE'. If 
53b0: 74 68 65 72 65 20 69 73 20 61 20 74 79 70 65 20  there is a type 
53c0: 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20  specified, then 
53d0: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
53e0: 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a  Type() will.  **
53f0: 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74 20   be called next 
5400: 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66  to set pCol->aff
5410: 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79 2e  inity correctly.
5420: 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66  .  */.  pCol->af
5430: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
5440: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 43 6f 6c  AFF_NONE;.  pCol
5450: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65  ->pColl = pParse
5460: 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
5470: 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a  .  p->nCol++;.}.
5480: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
5490: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
54a0: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
54b0: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
54c0: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
54d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
54e0: 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20  tement.  A "NOT 
54f0: 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74  NULL" constraint
5500: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65   has.** been see
5510: 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20  n on a column.  
5520: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
5530: 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c  s the notNull fl
5540: 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c  ag on.** the col
5550: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
5560: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
5570: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5580: 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73  3AddNotNull(Pars
5590: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f  e *pParse, int o
55a0: 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65  nError){.  Table
55b0: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
55c0: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
55d0: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
55e0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
55f0: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20  ->nCol-1;.  if( 
5600: 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69  i>=0 ) p->aCol[i
5610: 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72  ].notNull = onEr
5620: 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ror;.}../*.** Th
5630: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
5640: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
5650: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
5660: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
5670: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
5680: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
5690: 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e  The pFirst token
56a0: 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   is the first.**
56b0: 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65   token in the se
56c0: 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73  quence of tokens
56d0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74   that describe t
56e0: 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a  he type of the.*
56f0: 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  * column current
5700: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
5710: 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69  ction.   pLast i
5720: 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e  s the last token
5730: 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65  .** in the seque
5740: 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69  nce.  Use this i
5750: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f  nformation to co
5760: 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67  nstruct a string
5770: 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  .** that contain
5780: 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f  s the typename o
5790: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64  f the column and
57a0: 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69   store that stri
57b0: 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a  ng.** in zType..
57c0: 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */ .void sqlite3
57d0: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61  AddColumnType(Pa
57e0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
57f0: 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65  en *pFirst, Toke
5800: 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20 54 61 62  n *pLast){.  Tab
5810: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 2c 20  le *p;.  int i, 
5820: 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68  j;.  int n;.  ch
5830: 61 72 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20 20 43  ar *z, **pz;.  C
5840: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69  olumn *pCol;.  i
5850: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
5860: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
5870: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
5880: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69  >nCol-1;.  if( i
5890: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <0 ) return;.  p
58a0: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69  Col = &p->aCol[i
58b0: 5d 3b 0a 20 20 70 7a 20 3d 20 26 70 43 6f 6c 2d  ];.  pz = &pCol-
58c0: 3e 7a 54 79 70 65 3b 0a 20 20 6e 20 3d 20 70 4c  >zType;.  n = pL
58d0: 61 73 74 2d 3e 6e 20 2b 20 41 64 64 72 28 70 4c  ast->n + Addr(pL
58e0: 61 73 74 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70  ast->z) - Addr(p
58f0: 46 69 72 73 74 2d 3e 7a 29 3b 0a 20 20 73 71 6c  First->z);.  sql
5900: 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 70  ite3SetNString(p
5910: 7a 2c 20 70 46 69 72 73 74 2d 3e 7a 2c 20 6e 2c  z, pFirst->z, n,
5920: 20 30 29 3b 0a 20 20 7a 20 3d 20 2a 70 7a 3b 0a   0);.  z = *pz;.
5930: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
5940: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  urn;.  for(i=j=0
5950: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
5960: 20 20 69 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b 0a    int c = z[i];.
5970: 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65 28      if( isspace(
5980: 63 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  c) ) continue;. 
5990: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20     z[j++] = c;. 
59a0: 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20   }.  z[j] = 0;. 
59b0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
59c0: 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  = sqlite3Affinit
59d0: 79 54 79 70 65 28 7a 2c 20 6e 29 3b 0a 7d 0a 0a  yType(z, n);.}..
59e0: 2f 2a 0a 2a 2a 20 54 68 65 20 67 69 76 65 6e 20  /*.** The given 
59f0: 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 64 65 66  token is the def
5a00: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
5a10: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61  he last column a
5a20: 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74  dded to.** the t
5a30: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
5a40: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
5a50: 6e 2e 20 20 49 66 20 22 6d 69 6e 75 73 46 6c 61  n.  If "minusFla
5a60: 67 22 20 69 73 20 74 72 75 65 2c 20 69 74 0a 2a  g" is true, it.*
5a70: 2a 20 6d 65 61 6e 73 20 74 68 65 20 76 61 6c 75  * means the valu
5a80: 65 20 74 6f 6b 65 6e 20 77 61 73 20 70 72 65 63  e token was prec
5a90: 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20  eded by a minus 
5aa0: 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  sign..**.** This
5ab0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
5ac0: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
5ad0: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
5ae0: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
5af0: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
5b00: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  E statement..*/.
5b10: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 44  void sqlite3AddD
5b20: 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73  efaultValue(Pars
5b30: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
5b40: 20 2a 70 56 61 6c 2c 20 69 6e 74 20 6d 69 6e 75   *pVal, int minu
5b50: 73 46 6c 61 67 29 7b 0a 20 20 54 61 62 6c 65 20  sFlag){.  Table 
5b60: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
5b70: 68 61 72 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20  har **pz;.  if( 
5b80: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
5b90: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
5ba0: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
5bb0: 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20  ol-1;.  if( i<0 
5bc0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 7a 20 3d  ) return;.  pz =
5bd0: 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66   &p->aCol[i].zDf
5be0: 6c 74 3b 0a 20 20 69 66 28 20 6d 69 6e 75 73 46  lt;.  if( minusF
5bf0: 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  lag ){.    sqlit
5c00: 65 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c  e3SetNString(pz,
5c10: 20 22 2d 22 2c 20 31 2c 20 70 56 61 6c 2d 3e 7a   "-", 1, pVal->z
5c20: 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20  , pVal->n, 0);. 
5c30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
5c40: 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a  te3SetNString(pz
5c50: 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d  , pVal->z, pVal-
5c60: 3e 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71  >n, 0);.  }.  sq
5c70: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 2a 70 7a  lite3Dequote(*pz
5c80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69  );.}../*.** Desi
5c90: 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41 52  gnate the PRIMAR
5ca0: 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61  Y KEY for the ta
5cb0: 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61  ble.  pList is a
5cc0: 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a   list of names .
5cd0: 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68  ** of columns th
5ce0: 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d  at form the prim
5cf0: 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69  ary key.  If pLi
5d00: 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  st is NULL, then
5d10: 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63   the.** most rec
5d20: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
5d30: 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  mn of the table 
5d40: 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  is the primary k
5d50: 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c  ey..**.** A tabl
5d60: 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f  e can have at mo
5d70: 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b  st one primary k
5d80: 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c  ey.  If the tabl
5d90: 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a  e already has.**
5da0: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28   a primary key (
5db0: 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
5dc0: 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b  second primary k
5dd0: 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65 20  ey) then create 
5de0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a  an.** error..**.
5df0: 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52  ** If the PRIMAR
5e00: 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69  Y KEY is on a si
5e10: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73  ngle column whos
5e20: 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49 4e  e datatype is IN
5e30: 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77  TEGER,.** then w
5e40: 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73  e will try to us
5e50: 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73  e that column as
5e60: 20 74 68 65 20 72 6f 77 20 69 64 2e 20 20 28 45   the row id.  (E
5e70: 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a 20 46 6f 72  xception:.** For
5e80: 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
5e90: 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c  tibility with ol
5ea0: 64 65 72 20 64 61 74 61 62 61 73 65 73 2c 20 64  der databases, d
5eb0: 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 2a 2a  o not do this.**
5ec0: 20 69 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   if the file for
5ed0: 6d 61 74 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  mat version numb
5ee0: 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
5ef0: 31 2e 29 20 20 53 65 74 20 74 68 65 20 54 61 62  1.)  Set the Tab
5f00: 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c  le.iPKey.** fiel
5f10: 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75  d of the table u
5f20: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
5f30: 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65  n to be the inde
5f40: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45  x of the.** INTE
5f50: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
5f60: 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69  column.  Table.i
5f70: 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d  PKey is set to -
5f80: 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  1 if there is.**
5f90: 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d   no INTEGER PRIM
5fa0: 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49  ARY KEY..**.** I
5fb0: 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74  f the key is not
5fc0: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
5fd0: 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72  ARY KEY, then cr
5fe0: 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a  eate a unique.**
5ff0: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b   index for the k
6000: 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73  ey.  No index is
6010: 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54   created for INT
6020: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
6030: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
6040: 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  e3AddPrimaryKey(
6050: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
6060: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
6070: 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20  int onError){.  
6080: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50  Table *pTab = pP
6090: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
60a0: 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d  .  char *zType =
60b0: 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d   0;.  int iCol =
60c0: 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70 54   -1, i;.  if( pT
60d0: 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 69  ab==0 ) goto pri
60e0: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
60f0: 20 69 66 28 20 70 54 61 62 2d 3e 68 61 73 50 72   if( pTab->hasPr
6100: 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  imKey ){.    sql
6110: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6120: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62  rse, .      "tab
6130: 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f  le \"%s\" has mo
6140: 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d  re than one prim
6150: 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e  ary key", pTab->
6160: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
6170: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
6180: 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 68  t;.  }.  pTab->h
6190: 61 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20  asPrimKey = 1;. 
61a0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
61b0: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62  .    iCol = pTab
61c0: 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20  ->nCol - 1;.    
61d0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
61e0: 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a  .isPrimKey = 1;.
61f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
6200: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
6210: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
6220: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
6230: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
6240: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
6250: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
6260: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
6270: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
6280: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  [iCol].zName)==0
6290: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
62a0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
62b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
62c0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
62d0: 20 29 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   ) pTab->aCol[iC
62e0: 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20  ol].isPrimKey = 
62f0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
6300: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20   pList->nExpr>1 
6310: 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d  ) iCol = -1;.  }
6320: 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26  .  if( iCol>=0 &
6330: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
6340: 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  l ){.    zType =
6350: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
6360: 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69  ].zType;.  }.  i
6370: 66 28 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69  f( zType && sqli
6380: 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79 70 65  te3StrICmp(zType
6390: 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 20  , "INTEGER")==0 
63a0: 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  ){.    pTab->iPK
63b0: 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70  ey = iCol;.    p
63c0: 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f  Tab->keyConf = o
63d0: 6e 45 72 72 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b  nError;.  }else{
63e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65 61  .    sqlite3Crea
63f0: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  teIndex(pParse, 
6400: 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20  0, 0, 0, pList, 
6410: 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 29 3b 0a  onError, 0, 0);.
6420: 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20      pList = 0;. 
6430: 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f   }..primary_key_
6440: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45  exit:.  sqlite3E
6450: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  xprListDelete(pL
6460: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ist);.  return;.
6470: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
6480: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
6490: 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
64a0: 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20  recently parsed 
64b0: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  table column.** 
64c0: 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20 67  to the CollSeq g
64d0: 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  iven..*/.void sq
64e0: 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54  lite3AddCollateT
64f0: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
6500: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
6510: 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70 65 29  Type, int nType)
6520: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
6530: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 43  Index *pIdx;.  C
6540: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
6550: 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 28   int i;..  if( (
6560: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
6570: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
6580: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
6590: 6c 2d 31 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20  l-1;..  pColl = 
65a0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
65b0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 54 79  lSeq(pParse, zTy
65c0: 70 65 2c 20 6e 54 79 70 65 29 3b 0a 20 20 70 2d  pe, nType);.  p-
65d0: 3e 61 43 6f 6c 5b 69 5d 2e 70 43 6f 6c 6c 20 3d  >aCol[i].pColl =
65e0: 20 70 43 6f 6c 6c 3b 0a 0a 20 20 2f 2a 20 49 66   pColl;..  /* If
65f0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64   the column is d
6600: 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d  eclared as "<nam
6610: 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43  e> PRIMARY KEY C
6620: 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a  OLLATE <type>",.
6630: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64    ** then an ind
6640: 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ex may have been
6650: 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73   created on this
6660: 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74   column before t
6670: 68 65 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  he.  ** collatio
6680: 6e 20 74 79 70 65 20 77 61 73 20 61 64 64 65 64  n type was added
6690: 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73 20 69  . Correct this i
66a0: 66 20 69 74 20 69 73 20 74 68 65 20 63 61 73 65  f it is the case
66b0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64  ..  */.  for(pId
66c0: 78 20 3d 20 70 2d 3e 70 49 6e 64 65 78 3b 20 70  x = p->pIndex; p
66d0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
66e0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 61 73 73 65  pNext){.    asse
66f0: 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
6700: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  n==1 );.    if( 
6710: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  pIdx->aiColumn[0
6720: 5d 3d 3d 69 20 29 20 70 49 64 78 2d 3e 6b 65 79  ]==i ) pIdx->key
6730: 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20  Info.aColl[0] = 
6740: 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pColl;.  }.}../*
6750: 0a 2a 2a 20 4c 6f 63 61 74 65 20 61 6e 64 20 72  .** Locate and r
6760: 65 74 75 72 6e 20 61 6e 20 65 6e 74 72 79 20 66  eturn an entry f
6770: 72 6f 6d 20 74 68 65 20 64 62 2e 61 43 6f 6c 6c  rom the db.aColl
6780: 53 65 71 20 68 61 73 68 20 74 61 62 6c 65 2e 20  Seq hash table. 
6790: 49 66 20 74 68 65 20 65 6e 74 72 79 0a 2a 2a 20  If the entry.** 
67a0: 73 70 65 63 69 66 69 65 64 20 62 79 20 7a 4e 61  specified by zNa
67b0: 6d 65 20 61 6e 64 20 6e 4e 61 6d 65 20 69 73 20  me and nName is 
67c0: 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 64 20 70 61  not found and pa
67d0: 72 61 6d 65 74 65 72 20 27 63 72 65 61 74 65 27  rameter 'create'
67e0: 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65   is.** true, the
67f0: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65  n create a new e
6800: 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20  ntry..**.** FIX 
6810: 4d 45 3a 20 46 6f 72 20 6e 6f 77 2c 20 72 65 74  ME: For now, ret
6820: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 63 72 65 61  urn NULL if crea
6830: 74 65 20 69 73 20 6e 6f 74 20 74 72 75 65 20 61  te is not true a
6840: 6e 64 20 74 68 65 20 65 6e 74 72 79 20 69 73 20  nd the entry is 
6850: 6e 6f 74 0a 2a 2a 20 66 6f 75 6e 64 2e 20 42 75  not.** found. Bu
6860: 74 20 74 68 69 73 20 6e 65 65 64 73 20 74 6f 20  t this needs to 
6870: 63 68 61 6e 67 65 20 74 6f 20 63 61 6c 6c 20 74  change to call t
6880: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
6890: 74 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20  tory..**.** FIX 
68a0: 4d 45 3a 20 49 66 20 77 65 20 68 61 76 65 20 61  ME: If we have a
68b0: 20 55 54 46 2d 38 20 76 65 72 73 69 6f 6e 20 6f   UTF-8 version o
68c0: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  f the collation 
68d0: 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 64 20 61 0a  function, and a.
68e0: 2a 2a 20 55 54 46 2d 31 36 20 76 65 72 73 69 6f  ** UTF-16 versio
68f0: 6e 20 77 6f 75 6c 64 20 62 65 20 62 65 74 74 65  n would be bette
6900: 72 2c 20 73 68 6f 75 6c 64 20 74 68 65 20 63 6f  r, should the co
6910: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
6920: 62 65 20 63 61 6c 6c 65 64 3f 0a 2a 2a 20 49 66  be called?.** If
6930: 20 73 6f 20 73 68 6f 75 6c 64 20 61 20 66 6c 61   so should a fla
6940: 67 20 62 65 20 73 65 74 20 74 6f 20 73 61 79 20  g be set to say 
6950: 74 68 61 74 20 77 65 20 61 6c 72 65 61 64 79 20  that we already 
6960: 72 65 71 75 65 73 74 65 64 20 73 75 63 68 20 61  requested such a
6970: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  .** function and
6980: 20 63 6f 75 6c 64 6e 27 74 20 67 65 74 20 6f 6e   couldn't get on
6990: 65 3f 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  e?.*/.CollSeq *s
69a0: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
69b0: 71 28 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 2c  q(.  sqlite *db,
69c0: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
69d0: 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 6e 4e  zName, .  int nN
69e0: 61 6d 65 2c 0a 20 20 69 6e 74 20 63 72 65 61 74  ame,.  int creat
69f0: 65 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  e.){.  CollSeq *
6a00: 70 43 6f 6c 6c 3b 0a 20 20 69 66 28 20 6e 4e 61  pColl;.  if( nNa
6a10: 6d 65 3c 30 20 29 20 6e 4e 61 6d 65 20 3d 20 73  me<0 ) nName = s
6a20: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20  trlen(zName);.  
6a30: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48  pColl = sqlite3H
6a40: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f  ashFind(&db->aCo
6a50: 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  llSeq, zName, nN
6a60: 61 6d 65 29 3b 0a 20 20 69 66 28 20 30 3d 3d 70  ame);.  if( 0==p
6a70: 43 6f 6c 6c 20 26 26 20 63 72 65 61 74 65 20 29  Coll && create )
6a80: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
6a90: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
6aa0: 6f 66 28 2a 70 43 6f 6c 6c 29 20 2b 20 6e 4e 61  of(*pColl) + nNa
6ab0: 6d 65 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66  me + 1 );.    if
6ac0: 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
6ad0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3d 20   pColl->zName = 
6ae0: 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 5b 31 5d  (char*)&pColl[1]
6af0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
6b00: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  Coll->zName, zNa
6b10: 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20  me, nName+1);.  
6b20: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
6b30: 6e 73 65 72 74 28 26 64 62 2d 3e 61 43 6f 6c 6c  nsert(&db->aColl
6b40: 53 65 71 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  Seq, pColl->zNam
6b50: 65 2c 20 6e 4e 61 6d 65 2c 20 70 43 6f 6c 6c 29  e, nName, pColl)
6b60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
6b70: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 43  turn pColl;.}..C
6b80: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c  ollSeq *sqlite3L
6b90: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72  ocateCollSeq(Par
6ba0: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
6bb0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
6bc0: 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 43 6f 6c  nt nName){.  Col
6bd0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
6be0: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
6bf0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
6c00: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20  me, nName, 0);. 
6c10: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
6c20: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
6c30: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Err==0 ){.      
6c40: 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e  sqlite3SetNStrin
6c50: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
6c60: 73 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  sg, .          "
6c70: 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f  no such collatio
6c80: 6e 20 73 65 71 75 65 6e 63 65 3a 20 22 2c 20 2d  n sequence: ", -
6c90: 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 7a 4e  1, .          zN
6ca0: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a  ame, nName, 0);.
6cb0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
6cc0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nErr++;.  }.  
6cd0: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
6ce0: 0a 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  .../*.** Scan th
6cf0: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61  e column type na
6d00: 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68  me zType (length
6d10: 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74 75   nType) and retu
6d20: 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69  rn the.** associ
6d30: 61 74 65 64 20 61 66 66 69 6e 69 74 79 20 74 79  ated affinity ty
6d40: 70 65 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  pe..*/.char sqli
6d50: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
6d60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
6d70: 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20  e, int nType){. 
6d80: 20 69 6e 74 20 6e 2c 20 69 3b 0a 20 20 73 74 72   int n, i;.  str
6d90: 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  uct {.    const 
6da0: 63 68 61 72 20 2a 7a 53 75 62 3b 20 20 2f 2a 20  char *zSub;  /* 
6db0: 4b 65 79 77 6f 72 64 73 20 73 75 62 73 74 72 69  Keywords substri
6dc0: 6e 67 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72  ng to search for
6dd0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 75 62   */.    int nSub
6de0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 65  ;          /* le
6df0: 6e 67 74 68 20 6f 66 20 7a 53 75 62 20 2a 2f 0a  ngth of zSub */.
6e00: 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74      char affinit
6e10: 79 3b 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69  y;     /* Affini
6e20: 74 79 20 74 6f 20 72 65 74 75 72 6e 20 69 66 20  ty to return if 
6e30: 69 74 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20  it matches */.  
6e40: 7d 20 73 75 62 73 74 72 69 6e 67 73 5b 5d 20 3d  } substrings[] =
6e50: 20 7b 0a 20 20 20 20 7b 22 49 4e 54 22 2c 20 20   {.    {"INT",  
6e60: 33 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  3, SQLITE_AFF_IN
6e70: 54 45 47 45 52 7d 2c 0a 20 20 20 20 7b 22 43 48  TEGER},.    {"CH
6e80: 41 52 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41  AR", 4, SQLITE_A
6e90: 46 46 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22  FF_TEXT},.    {"
6ea0: 43 4c 4f 42 22 2c 20 34 2c 20 53 51 4c 49 54 45  CLOB", 4, SQLITE
6eb0: 5f 41 46 46 5f 54 45 58 54 7d 2c 0a 20 20 20 20  _AFF_TEXT},.    
6ec0: 7b 22 54 45 58 54 22 2c 20 34 2c 20 53 51 4c 49  {"TEXT", 4, SQLI
6ed0: 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c 0a 20 20  TE_AFF_TEXT},.  
6ee0: 20 20 7b 22 42 4c 4f 42 22 2c 20 34 2c 20 53 51    {"BLOB", 4, SQ
6ef0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 7d 2c 0a  LITE_AFF_NONE},.
6f00: 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6e 54 79 70    };..  if( nTyp
6f10: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
6f20: 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  rn SQLITE_AFF_NO
6f30: 4e 45 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  NE;.  }.  for(i=
6f40: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 73 75 62 73  0; i<sizeof(subs
6f50: 74 72 69 6e 67 73 29 2f 73 69 7a 65 6f 66 28 73  trings)/sizeof(s
6f60: 75 62 73 74 72 69 6e 67 73 5b 30 5d 29 3b 20 69  ubstrings[0]); i
6f70: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 31 20  ++){.    int c1 
6f80: 3d 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e  = substrings[i].
6f90: 7a 53 75 62 5b 30 5d 3b 0a 20 20 20 20 69 6e 74  zSub[0];.    int
6fa0: 20 63 32 20 3d 20 74 6f 6c 6f 77 65 72 28 63 31   c2 = tolower(c1
6fb0: 29 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74  );.    int limit
6fc0: 20 3d 20 6e 54 79 70 65 20 2d 20 73 75 62 73 74   = nType - subst
6fd0: 72 69 6e 67 73 5b 69 5d 2e 6e 53 75 62 3b 0a 20  rings[i].nSub;. 
6fe0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
6ff0: 20 3d 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d   = substrings[i]
7000: 2e 7a 53 75 62 3b 0a 20 20 20 20 66 6f 72 28 6e  .zSub;.    for(n
7010: 3d 30 3b 20 6e 3c 3d 6c 69 6d 69 74 3b 20 6e 2b  =0; n<=limit; n+
7020: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 20  +){.      int c 
7030: 3d 20 7a 54 79 70 65 5b 6e 5d 3b 0a 20 20 20 20  = zType[n];.    
7040: 20 20 69 66 28 20 28 63 3d 3d 63 31 20 7c 7c 20    if( (c==c1 || 
7050: 63 3d 3d 63 32 29 0a 20 20 20 20 20 20 20 20 20  c==c2).         
7060: 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
7070: 33 53 74 72 4e 49 43 6d 70 28 26 7a 54 79 70 65  3StrNICmp(&zType
7080: 5b 6e 5d 2c 20 7a 2c 20 73 75 62 73 74 72 69 6e  [n], z, substrin
7090: 67 73 5b 69 5d 2e 6e 53 75 62 29 20 29 7b 0a 20  gs[i].nSub) ){. 
70a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 75         return su
70b0: 62 73 74 72 69 6e 67 73 5b 69 5d 2e 61 66 66 69  bstrings[i].affi
70c0: 6e 69 74 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nity;.      }.  
70d0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
70e0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
70f0: 52 49 43 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  RIC;.}../*.** Co
7100: 6d 65 20 75 70 20 77 69 74 68 20 61 20 6e 65 77  me up with a new
7110: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 66 6f   random value fo
7120: 72 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  r the schema coo
7130: 6b 69 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 0a  kie.  Make sure.
7140: 2a 2a 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65  ** the new value
7150: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
7160: 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a 2a 2a 0a 2a  om the old..**.*
7170: 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * The schema coo
7180: 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  kie is used to d
7190: 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68  etermine when th
71a0: 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65  e schema for the
71b0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
71c0: 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63  nges.  After eac
71d0: 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c  h schema change,
71e0: 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75   the cookie valu
71f0: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57  e.** changes.  W
7200: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69  hen a process fi
7210: 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63  rst reads the sc
7220: 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20  hema it records 
7230: 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20  the.** cookie.  
7240: 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e  Thereafter, when
7250: 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20  ever it goes to 
7260: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
7270: 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b  ase,.** it check
7280: 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  s the cookie to 
7290: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63  make sure the sc
72a0: 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61  hema has not cha
72b0: 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74  nged.** since it
72c0: 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a   was last read..
72d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20  **.** This plan 
72e0: 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  is not completel
72f0: 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20  y bullet-proof. 
7300: 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
7310: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d  for.** the schem
7320: 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74  a to change mult
7330: 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66  iple times and f
7340: 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  or the cookie to
7350: 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20   be.** set back 
7360: 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20  to prior value. 
7370: 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e   But schema chan
7380: 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65  ges are infreque
7390: 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72  nt.** and the pr
73a0: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74  obability of hit
73b0: 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f  ting the same co
73c0: 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e  okie value is on
73d0: 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69  ly.** 1 chance i
73e0: 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72  n 2^32.  So we'r
73f0: 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a  e safe enough..*
7400: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68  /.void sqlite3Ch
7410: 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74  angeCookie(sqlit
7420: 65 20 2a 64 62 2c 20 56 64 62 65 20 2a 76 2c 20  e *db, Vdbe *v, 
7430: 69 6e 74 20 69 44 62 29 7b 0a 20 20 75 6e 73 69  int iDb){.  unsi
7440: 67 6e 65 64 20 63 68 61 72 20 72 3b 0a 20 20 69  gned char r;.  i
7450: 6e 74 20 2a 70 53 63 68 65 6d 61 43 6f 6f 6b 69  nt *pSchemaCooki
7460: 65 20 3d 20 26 28 64 62 2d 3e 61 44 62 5b 69 44  e = &(db->aDb[iD
7470: 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  b].schema_cookie
7480: 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 52 61 6e  );..  sqlite3Ran
7490: 64 6f 6d 6e 65 73 73 28 31 2c 20 26 72 29 3b 0a  domness(1, &r);.
74a0: 20 20 2a 70 53 63 68 65 6d 61 43 6f 6f 6b 69 65    *pSchemaCookie
74b0: 20 3d 20 2a 70 53 63 68 65 6d 61 43 6f 6f 6b 69   = *pSchemaCooki
74c0: 65 20 2b 20 72 20 2b 20 31 3b 0a 20 20 64 62 2d  e + r + 1;.  db-
74d0: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
74e0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
74f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7500: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
7510: 2c 20 2a 70 53 63 68 65 6d 61 43 6f 6f 6b 69 65  , *pSchemaCookie
7520: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
7530: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
7540: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30  etCookie, iDb, 0
7550: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73  );.}../*.** Meas
7560: 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ure the number o
7570: 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65  f characters nee
7580: 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68  ded to output th
7590: 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74  e given.** ident
75a0: 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62  ifier.  The numb
75b0: 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  er returned incl
75c0: 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20  udes any quotes 
75d0: 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73  used.** but does
75e0: 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65   not include the
75f0: 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72   null terminator
7600: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7610: 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73  identLength(cons
7620: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
7630: 74 20 6e 3b 0a 20 20 69 6e 74 20 6e 65 65 64 51  t n;.  int needQ
7640: 75 6f 74 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28  uote = 0;.  for(
7650: 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b  n=0; *z; n++, z+
7660: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
7670: 27 5c 27 27 20 29 7b 20 6e 2b 2b 3b 20 6e 65 65  '\'' ){ n++; nee
7680: 64 51 75 6f 74 65 3d 31 3b 20 7d 0a 20 20 7d 0a  dQuote=1; }.  }.
7690: 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 6e 65 65    return n + nee
76a0: 64 51 75 6f 74 65 2a 32 3b 0a 7d 0a 0a 2f 2a 0a  dQuote*2;.}../*.
76b0: 2a 2a 20 57 72 69 74 65 20 61 6e 20 69 64 65 6e  ** Write an iden
76c0: 74 69 66 69 65 72 20 6f 6e 74 6f 20 74 68 65 20  tifier onto the 
76d0: 65 6e 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e  end of the given
76e0: 20 73 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a   string.  Add.**
76f0: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
7700: 73 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  s as needed..*/.
7710: 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e  static void iden
7720: 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e  tPut(char *z, in
7730: 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a  t *pIdx, char *z
7740: 49 64 65 6e 74 29 7b 0a 20 20 69 6e 74 20 69 2c  Ident){.  int i,
7750: 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20   j, needQuote;. 
7760: 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f   i = *pIdx;.  fo
7770: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
7780: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; j++){.    if( 
7790: 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b  !isalnum(zIdent[
77a0: 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d  j]) && zIdent[j]
77b0: 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20  !='_' ) break;. 
77c0: 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d   }.  needQuote =
77d0: 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c    zIdent[j]!=0 |
77e0: 7c 20 69 73 64 69 67 69 74 28 7a 49 64 65 6e 74  | isdigit(zIdent
77f0: 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  [0]).           
7800: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
7810: 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64  3KeywordCode(zId
7820: 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a  ent, j)!=TK_ID;.
7830: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
7840: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b  ) z[i++] = '\'';
7850: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65  .  for(j=0; zIde
7860: 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nt[j]; j++){.   
7870: 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74   z[i++] = zIdent
7880: 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64  [j];.    if( zId
7890: 65 6e 74 5b 6a 5d 3d 3d 27 5c 27 27 20 29 20 7a  ent[j]=='\'' ) z
78a0: 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  [i++] = '\'';.  
78b0: 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  }.  if( needQuot
78c0: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27  e ) z[i++] = '\'
78d0: 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20  ';.  z[i] = 0;. 
78e0: 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f   *pIdx = i;.}../
78f0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
7900: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
7910: 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61  tement appropria
7920: 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  te for the given
7930: 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f  .** table.  Memo
7940: 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74  ry to hold the t
7950: 65 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65  ext of the state
7960: 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64  ment is obtained
7970: 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  .** from sqliteM
7980: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
7990: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
79a0: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
79b0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  n..*/.static cha
79c0: 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74  r *createTableSt
79d0: 6d 74 28 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  mt(Table *p){.  
79e0: 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63  int i, k, n;.  c
79f0: 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68  har *zStmt;.  ch
7a00: 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32  ar *zSep, *zSep2
7a10: 2c 20 2a 7a 45 6e 64 3b 0a 20 20 6e 20 3d 20 30  , *zEnd;.  n = 0
7a20: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
7a30: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
7a40: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
7a50: 74 68 28 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  th(p->aCol[i].zN
7a60: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  ame);.    if( p-
7a70: 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20 29  >aCol[i].zType )
7a80: 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 28 73 74  {.      n += (st
7a90: 72 6c 65 6e 28 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  rlen(p->aCol[i].
7aa0: 7a 54 79 70 65 29 20 2b 20 31 29 3b 0a 20 20 20  zType) + 1);.   
7ab0: 20 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64   }.  }.  n += id
7ac0: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61  entLength(p->zNa
7ad0: 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 34 30 20  me);.  if( n<40 
7ae0: 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22  ){.    zSep = ""
7af0: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
7b00: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29  ";.    zEnd = ")
7b10: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
7b20: 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20  zSep = "\n  ";. 
7b30: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20     zSep2 = ",\n 
7b40: 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22   ";.    zEnd = "
7b50: 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d  \n)";.  }.  n +=
7b60: 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b   35 + 6*p->nCol;
7b70: 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  zStmt = sqlit
7b80: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b  eMallocRaw( n );
7b90: 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20  .  if( zStmt==0 
7ba0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 74  ) return 0;.  st
7bb0: 72 63 70 79 28 7a 53 74 6d 74 2c 20 70 2d 3e 69  rcpy(zStmt, p->i
7bc0: 44 62 3d 3d 31 20 3f 20 22 43 52 45 41 54 45 20  Db==1 ? "CREATE 
7bd0: 54 45 4d 50 20 54 41 42 4c 45 20 22 20 3a 20 22  TEMP TABLE " : "
7be0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b  CREATE TABLE ");
7bf0: 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53  .  k = strlen(zS
7c00: 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74  tmt);.  identPut
7c10: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a  (zStmt, &k, p->z
7c20: 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b  Name);.  zStmt[k
7c30: 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72  ++] = '(';.  for
7c40: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
7c50: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63 70   i++){.    strcp
7c60: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65  y(&zStmt[k], zSe
7c70: 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72  p);.    k += str
7c80: 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a  len(&zStmt[k]);.
7c90: 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32      zSep = zSep2
7ca0: 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a  ;.    identPut(z
7cb0: 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 61 43 6f  Stmt, &k, p->aCo
7cc0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[i].zName);.   
7cd0: 20 69 66 28 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e   if( p->aCol[i].
7ce0: 7a 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 7a  zType ){.      z
7cf0: 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b  Stmt[k++] = ' ';
7d00: 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a  .      strcpy(&z
7d10: 53 74 6d 74 5b 6b 5d 2c 20 70 2d 3e 61 43 6f 6c  Stmt[k], p->aCol
7d20: 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 20 20  [i].zType);.    
7d30: 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 70 2d    k += strlen(p-
7d40: 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b  >aCol[i].zType);
7d50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74 72  .    }.  }.  str
7d60: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
7d70: 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  End);.  return z
7d80: 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Stmt;.}../*.** T
7d90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
7da0: 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20  alled to report 
7db0: 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68  the final ")" th
7dc0: 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a  at terminates.**
7dd0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
7de0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
7df0: 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63   The table struc
7e00: 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20  ture that other 
7e10: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
7e20: 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69  have been buildi
7e30: 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ng.** is added t
7e40: 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68  o the internal h
7e50: 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75  ash tables, assu
7e60: 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68  ming no errors h
7e70: 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e  ave.** occurred.
7e80: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20  .**.** An entry 
7e90: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73  for the table is
7ea0: 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73   made in the mas
7eb0: 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73  ter table on dis
7ec0: 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69  k, unless.** thi
7ed0: 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
7ee0: 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e   table or db->in
7ef0: 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65  it.busy==1.  Whe
7f00: 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  n db->init.busy=
7f10: 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77  =1.** it means w
7f20: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
7f30: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
7f40: 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65  table because we
7f50: 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74   just.** connect
7f60: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
7f70: 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  se or because th
7f80: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
7f90: 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63  table has.** rec
7fa0: 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 2c 20 73  ently changes, s
7fb0: 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  o the entry for 
7fc0: 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61  this table alrea
7fd0: 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20  dy exists in.** 
7fe0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
7ff0: 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20  r table.  We do 
8000: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61  not want to crea
8010: 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a  te it again..**.
8020: 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63  ** If the pSelec
8030: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  t argument is no
8040: 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73  t NULL, it means
8050: 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
8060: 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64  ne.** was called
8070: 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62   to create a tab
8080: 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  le generated fro
8090: 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20  m a .** "CREATE 
80a0: 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c  TABLE ... AS SEL
80b0: 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65  ECT ..." stateme
80c0: 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20  nt.  The column 
80d0: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
80e0: 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d  new table will m
80f0: 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20  atch the result 
8100: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
8110: 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
8120: 65 33 45 6e 64 54 61 62 6c 65 28 50 61 72 73 65  e3EndTable(Parse
8130: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
8140: 2a 70 45 6e 64 2c 20 53 65 6c 65 63 74 20 2a 70  *pEnd, Select *p
8150: 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65  Select){.  Table
8160: 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64   *p;.  sqlite *d
8170: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
8180: 0a 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20  .  if( (pEnd==0 
8190: 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c  && pSelect==0) |
81a0: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  | pParse->nErr |
81b0: 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  | sqlite3_malloc
81c0: 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  _failed ) return
81d0: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
81e0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
81f0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
8200: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
8210: 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53  init.busy || !pS
8220: 65 6c 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  elect );..  /* I
8230: 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 67  f the table is g
8240: 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20  enerated from a 
8250: 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 63 6f 6e  SELECT, then con
8260: 73 74 72 75 63 74 20 74 68 65 0a 20 20 2a 2a 20  struct the.  ** 
8270: 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
8280: 61 6e 64 20 74 68 65 20 74 65 78 74 20 6f 66 20  and the text of 
8290: 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  the table..  */.
82a0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
82b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
82c0: 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
82d0: 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65  is 1 it means we
82e0: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
82f0: 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a   SQL off the.  *
8300: 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  * "sqlite_master
8310: 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d  " or "sqlite_tem
8320: 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20  p_master" table 
8330: 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a  on the disk..  *
8340: 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74  * So do not writ
8350: 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67  e to the disk ag
8360: 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68  ain.  Extract th
8370: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
8380: 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  er.  ** for the 
8390: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64  table from the d
83a0: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20  b->init.newTnum 
83b0: 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67  field.  (The pag
83c0: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68  e number.  ** sh
83d0: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
83e0: 75 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20  ut there by the 
83f0: 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75  sqliteOpenCb rou
8400: 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66  tine.).  */.  if
8410: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
8420: 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d  ){.    p->tnum =
8430: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
8440: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  m;.  }..  /* If 
8450: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  not initializing
8460: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
8470: 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e  record for the n
8480: 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  ew table.  ** in
8490: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
84a0: 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ER table of the 
84b0: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72  database.  The r
84c0: 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a  ecord number.  *
84d0: 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  * for the new ta
84e0: 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64  ble entry should
84f0: 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74   already be on t
8500: 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20  he stack..  **. 
8510: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
8520: 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65   TEMPORARY table
8530: 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72  , write the entr
8540: 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c  y into the auxil
8550: 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69  iary.  ** file i
8560: 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74  nstead of into t
8570: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
8580: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
8590: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
85a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20   ){.    int n;. 
85b0: 20 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20     Vdbe *v;..   
85c0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
85d0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
85e0: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
85f0: 72 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e  rn;..    if( p->
8600: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
8610: 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72      /* A regular
8620: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
8630: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
8640: 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  , OP_CreateTable
8650: 2c 20 30 2c 20 70 2d 3e 69 44 62 2c 20 28 63 68  , 0, p->iDb, (ch
8660: 61 72 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20 50 33  ar*)&p->tnum, P3
8670: 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d  _POINTER);.    }
8680: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
8690: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 73   view */.      s
86a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
86b0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
86c0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
86d0: 70 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 0a 20 20  p->tnum = 0;..  
86e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
86f0: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
8700: 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  0, 0);..    /* I
8710: 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41  f this is a CREA
8720: 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53  TE TABLE xx AS S
8730: 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75  ELECT ..., execu
8740: 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  te the SELECT.  
8750: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
8760: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e  o populate the n
8770: 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f  ew table. The ro
8780: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66  ot-page number f
8790: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65  or the.    ** ne
87a0: 77 20 74 61 62 6c 65 20 69 73 20 6f 6e 20 74 68  w table is on th
87b0: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 76 64 62  e top of the vdb
87c0: 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a  e stack..    **.
87d0: 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20      ** Once the 
87e0: 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20  SELECT has been 
87f0: 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33  coded by sqlite3
8800: 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20  Select(), it is 
8810: 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74  in a.    ** suit
8820: 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75  able state to qu
8830: 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ery for the colu
8840: 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70  mn names and typ
8850: 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20  es to be used.  
8860: 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20    ** by the new 
8870: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
8880: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
8890: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53  .      Table *pS
88a0: 65 6c 54 61 62 3b 0a 20 20 20 20 20 20 73 71 6c  elTab;.      sql
88b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
88c0: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
88d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
88e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
88f0: 65 67 65 72 2c 20 70 2d 3e 69 44 62 2c 20 30 29  eger, p->iDb, 0)
8900: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8910: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
8920: 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 30 29 3b  penWrite, 1, 0);
8930: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
8940: 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73  Tab = 2;.      s
8950: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
8960: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 53 52  rse, pSelect, SR
8970: 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30  T_Table, 1, 0, 0
8980: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
8990: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
89a0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20  v, OP_Close, 1, 
89b0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  0);.      if( pP
89c0: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
89d0: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
89e0: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
89f0: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
8a00: 73 65 2c 20 30 2c 20 70 53 65 6c 65 63 74 29 3b  se, 0, pSelect);
8a10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65  .        if( pSe
8a20: 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  lTab==0 ) return
8a30: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
8a40: 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ( p->aCol==0 );.
8a50: 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20          p->nCol 
8a60: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
8a70: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c  .        p->aCol
8a80: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
8a90: 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61  ;.        pSelTa
8aa0: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
8ab0: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43       pSelTab->aC
8ac0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
8ad0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
8ae0: 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a  le(0, pSelTab);.
8af0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8b00: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
8b10: 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70  MasterTable(v, p
8b20: 2d 3e 69 44 62 29 3b 0a 0a 20 20 20 20 73 71 6c  ->iDb);..    sql
8b30: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
8b40: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c  P_String8, 0, 0,
8b50: 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 3f 22   p->pSelect==0?"
8b60: 74 61 62 6c 65 22 3a 22 76 69 65 77 22 2c 50 33  table":"view",P3
8b70: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
8b80: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
8b90: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
8ba0: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  , p->zName, 0);.
8bb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
8bc0: 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p3(v, OP_String8
8bd0: 2c 20 30 2c 20 30 2c 20 70 2d 3e 7a 4e 61 6d 65  , 0, 0, p->zName
8be0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
8bf0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
8c00: 5f 50 75 6c 6c 2c 20 33 2c 20 30 29 3b 0a 0a 20  _Pull, 3, 0);.. 
8c10: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
8c20: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20  {.      char *z 
8c30: 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d  = createTableStm
8c40: 74 28 70 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  t(p);.      n = 
8c50: 7a 20 3f 20 73 74 72 6c 65 6e 28 7a 29 20 3a 20  z ? strlen(z) : 
8c60: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
8c70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8c80: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a  String8, 0, 0);.
8c90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8ca0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
8cb0: 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71   z, n);.      sq
8cc0: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
8cd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
8ce0: 28 20 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  ( p->pSelect ){.
8cf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8d00: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72  dbeOp3(v, OP_Str
8d10: 69 6e 67 38 2c 20 30 2c 20 30 2c 20 22 43 52 45  ing8, 0, 0, "CRE
8d20: 41 54 45 20 56 49 45 57 20 22 2c 20 50 33 5f 53  ATE VIEW ", P3_S
8d30: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 65  TATIC);.      }e
8d40: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
8d50: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
8d60: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c  P_String8, 0, 0,
8d70: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22   "CREATE TABLE "
8d80: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
8d90: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
8da0: 72 74 28 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20  rt( pEnd!=0 );. 
8db0: 20 20 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45       n = Addr(pE
8dc0: 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 50  nd->z) - Addr(pP
8dd0: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
8de0: 2e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73  .z) + 1;.      s
8df0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
8e00: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
8e10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
8e20: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
8e30: 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 73  v, -1, pParse->s
8e40: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b  NameToken.z, n);
8e50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8e60: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
8e70: 6e 63 61 74 2c 20 32 2c 20 30 29 3b 0a 20 20 20  ncat, 2, 0);.   
8e80: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
8e90: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  beOp3(v, OP_Make
8ea0: 52 65 63 6f 72 64 2c 20 35 2c 20 30 2c 20 22 74  Record, 5, 0, "t
8eb0: 74 74 69 74 22 2c 20 50 33 5f 53 54 41 54 49 43  ttit", P3_STATIC
8ec0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8ed0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
8ee0: 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a  tIntKey, 0, 0);.
8ef0: 20 20 20 20 69 66 28 20 70 2d 3e 69 44 62 21 3d      if( p->iDb!=
8f00: 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
8f10: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  e3ChangeCookie(d
8f20: 62 2c 20 76 2c 20 70 2d 3e 69 44 62 29 3b 0a 20  b, v, p->iDb);. 
8f30: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
8f40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8f50: 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 0a 20  Close, 0, 0);.. 
8f60: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 57 72 69     sqlite3EndWri
8f70: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
8f80: 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  se);.  }..  /* A
8f90: 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  dd the table to 
8fa0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
8fb0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
8fc0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
8fd0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
8fe0: 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 26 26 20 70  >explain==0 && p
8ff0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
9000: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c  {.    Table *pOl
9010: 64 3b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b  d;.    FKey *pFK
9020: 65 79 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73  ey;.    pOld = s
9030: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
9040: 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62  (&db->aDb[p->iDb
9050: 5d 2e 74 62 6c 48 61 73 68 2c 20 0a 20 20 20 20  ].tblHash, .    
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9070: 20 20 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65          p->zName
9080: 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d  , strlen(p->zNam
9090: 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20 69 66  e)+1, p);.    if
90a0: 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  ( pOld ){.      
90b0: 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20  assert( p==pOld 
90c0: 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
90d0: 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69  st have failed i
90e0: 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74  nside HashInsert
90f0: 28 29 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  () */.      retu
9100: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  rn;.    }.    fo
9110: 72 28 70 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79  r(pFKey=p->pFKey
9120: 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70  ; pFKey; pFKey=p
9130: 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29  FKey->pNextFrom)
9140: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20  {.      int nTo 
9150: 3d 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e  = strlen(pFKey->
9160: 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  zTo) + 1;.      
9170: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d  pFKey->pNextTo =
9180: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
9190: 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62  (&db->aDb[p->iDb
91a0: 5d 2e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e  ].aFKey, pFKey->
91b0: 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20  zTo, nTo);.     
91c0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
91d0: 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69  rt(&db->aDb[p->i
91e0: 44 62 5d 2e 61 46 4b 65 79 2c 20 70 46 4b 65 79  Db].aFKey, pFKey
91f0: 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65  ->zTo, nTo, pFKe
9200: 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  y);.    }.    pP
9210: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
9220: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61  = 0;.    db->nTa
9230: 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66  ble++;.    db->f
9240: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
9250: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
9260: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  }.}../*.** The p
9270: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
9280: 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65   routine in orde
9290: 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  r to create a ne
92a0: 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73  w VIEW.*/.void s
92b0: 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77  qlite3CreateView
92c0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
92d0: 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  e,     /* The pa
92e0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
92f0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e  .  Token *pBegin
9300: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
9310: 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
9320: 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d  egins the statem
9330: 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
9340: 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54  pName1,     /* T
9350: 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f  he token that ho
9360: 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
9370: 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f  the view */.  To
9380: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
9390: 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68   /* The token th
93a0: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  at holds the nam
93b0: 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f  e of the view */
93c0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
93d0: 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43  ct,   /* A SELEC
93e0: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
93f0: 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
9400: 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69   new view */.  i
9410: 6e 74 20 69 73 54 65 6d 70 20 20 20 20 20 20 20  nt isTemp       
9420: 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20    /* TRUE for a 
9430: 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a  TEMPORARY view *
9440: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
9450: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73  .  int n;.  cons
9460: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b  t char *z;.  Tok
9470: 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78  en sEnd;.  DbFix
9480: 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e  er sFix;.  Token
9490: 20 2a 70 4e 61 6d 65 3b 0a 0a 20 20 73 71 6c 69   *pName;..  sqli
94a0: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
94b0: 61 72 73 65 2c 20 70 42 65 67 69 6e 2c 20 70 4e  arse, pBegin, pN
94c0: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73  ame1, pName2, is
94d0: 54 65 6d 70 2c 20 31 29 3b 0a 20 20 70 20 3d 20  Temp, 1);.  p = 
94e0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
94f0: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  e;.  if( p==0 ||
9500: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
9510: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
9520: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
9530: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
9540: 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50   }.  sqlite3TwoP
9550: 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
9560: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
9570: 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73  &pName);.  if( s
9580: 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
9590: 46 69 78 2c 20 70 50 61 72 73 65 2c 20 70 2d 3e  Fix, pParse, p->
95a0: 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61  iDb, "view", pNa
95b0: 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74  me).    && sqlit
95c0: 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69  e3FixSelect(&sFi
95d0: 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b  x, pSelect).  ){
95e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
95f0: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
9600: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
9610: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20   }..  /* Make a 
9620: 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69  copy of the enti
9630: 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  re SELECT statem
9640: 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
9650: 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20   the view..  ** 
9660: 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20  This will force 
9670: 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b  all the Expr.tok
9680: 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62  en.z values to b
9690: 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20  e dynamically.  
96a0: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74  ** allocated rat
96b0: 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74  her than point t
96c0: 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  o the input stri
96d0: 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73  ng - which means
96e0: 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20   that.  ** they 
96f0: 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74  will persist aft
9700: 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  er the current s
9710: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61  qlite3_exec() ca
9720: 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f  ll returns..  */
9730: 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20  .  p->pSelect = 
9740: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
9750: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  (pSelect);.  sql
9760: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
9770: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28  (pSelect);.  if(
9780: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
9790: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73  it.busy ){.    s
97a0: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
97b0: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
97c0: 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c   p);.  }..  /* L
97d0: 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  ocate the end of
97e0: 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57   the CREATE VIEW
97f0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b   statement.  Mak
9800: 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a  e sEnd point to.
9810: 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20    ** the end..  
9820: 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72  */.  sEnd = pPar
9830: 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a  se->sLastToken;.
9840: 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21    if( sEnd.z[0]!
9850: 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21  =0 && sEnd.z[0]!
9860: 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64  =';' ){.    sEnd
9870: 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20  .z += sEnd.n;.  
9880: 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a  }.  sEnd.n = 0;.
9890: 20 20 6e 20 3d 20 28 28 69 6e 74 29 73 45 6e 64    n = ((int)sEnd
98a0: 2e 7a 29 20 2d 20 28 69 6e 74 29 70 42 65 67 69  .z) - (int)pBegi
98b0: 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 70 42 65 67  n->z;.  z = pBeg
98c0: 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20  in->z;.  while( 
98d0: 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d  n>0 && (z[n-1]==
98e0: 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a  ';' || isspace(z
98f0: 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20  [n-1])) ){ n--; 
9900: 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b  }.  sEnd.z = &z[
9910: 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d  n-1];.  sEnd.n =
9920: 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71   1;..  /* Use sq
9930: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
9940: 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20  to add the view 
9950: 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  to the SQLITE_MA
9960: 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20  STER table */.  
9970: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
9980: 70 50 61 72 73 65 2c 20 26 73 45 6e 64 2c 20 30  pParse, &sEnd, 0
9990: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
99a0: 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  /*.** The Table 
99b0: 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65  structure pTable
99c0: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45   is really a VIE
99d0: 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  W.  Fill in the 
99e0: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
99f0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76  columns of the v
9a00: 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c  iew in the pTabl
9a10: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  e structure.  Re
9a20: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a  turn the number.
9a30: 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  ** of errors.  I
9a40: 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
9a50: 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  en leave an erro
9a60: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
9a70: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f  rse->zErrMsg..*/
9a80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77  .int sqlite3View
9a90: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50  GetColumnNames(P
9aa0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
9ab0: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
9ac0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
9ad0: 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  ;.  Select *pSel
9ae0: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54  ;.  Table *pSelT
9af0: 61 62 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d  ab;.  int nErr =
9b00: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
9b10: 54 61 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41  Table );..  /* A
9b20: 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d   positive nCol m
9b30: 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73  eans the columns
9b40: 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20   names for this 
9b50: 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c  view are.  ** al
9b60: 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a  ready known..  *
9b70: 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
9b80: 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20  nCol>0 ) return 
9b90: 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74  0;..  /* A negat
9ba0: 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70  ive nCol is a sp
9bb0: 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61  ecial marker mea
9bc0: 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72 65  ning that we are
9bd0: 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20   currently.  ** 
9be0: 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74  trying to comput
9bf0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
9c00: 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72  es.  If we enter
9c10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
9c20: 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69  th.  ** a negati
9c30: 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e  ve nCol, it mean
9c40: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69  s two or more vi
9c50: 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c  ews form a loop,
9c60: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a   like this:.  **
9c70: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
9c80: 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c   VIEW one AS SEL
9c90: 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a  ECT * FROM two;.
9ca0: 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
9cb0: 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45  VIEW two AS SELE
9cc0: 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20  CT * FROM one;. 
9cd0: 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c   **.  ** Actuall
9ce0: 79 2c 20 74 68 69 73 20 65 72 72 6f 72 20 69 73  y, this error is
9cf0: 20 63 61 75 67 68 74 20 70 72 65 76 69 6f 75 73   caught previous
9d00: 6c 79 20 61 6e 64 20 73 6f 20 74 68 65 20 66 6f  ly and so the fo
9d10: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a 20 20 2a  llowing test.  *
9d20: 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  * should always 
9d30: 66 61 69 6c 2e 20 20 42 75 74 20 77 65 20 77 69  fail.  But we wi
9d40: 6c 6c 20 6c 65 61 76 65 20 69 74 20 69 6e 20 70  ll leave it in p
9d50: 6c 61 63 65 20 6a 75 73 74 20 74 6f 20 62 65 20  lace just to be 
9d60: 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  safe..  */.  if(
9d70: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20   pTable->nCol<0 
9d80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
9d90: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
9da0: 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63 75  view %s is circu
9db0: 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20  larly defined", 
9dc0: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
9dd0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
9de0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65  }..  /* If we ge
9df0: 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
9e00: 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20  eans we need to 
9e10: 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c  compute the tabl
9e20: 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20  e names..  */.  
9e30: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
9e40: 70 53 65 6c 65 63 74 20 29 3b 20 2f 2a 20 49 66  pSelect ); /* If
9e50: 20 6e 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 70   nCol==0, then p
9e60: 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 20  Table must be a 
9e70: 56 49 45 57 20 2a 2f 0a 20 20 70 53 65 6c 20 3d  VIEW */.  pSel =
9e80: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
9e90: 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61  ;..  /* Note tha
9ea0: 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  t the call to sq
9eb0: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
9ec0: 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78  Select() will ex
9ed0: 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a  pand any.  ** "*
9ee0: 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  " elements in th
9ef0: 69 73 20 6c 69 73 74 2e 20 20 42 75 74 20 77 65  is list.  But we
9f00: 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 72 65   will need to re
9f10: 73 74 6f 72 65 20 74 68 65 20 6c 69 73 74 0a 20  store the list. 
9f20: 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74 73 20   ** back to its 
9f30: 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75  original configu
9f40: 72 61 74 69 6f 6e 20 61 66 74 65 72 77 61 72 64  ration afterward
9f50: 73 2c 20 73 6f 20 77 65 20 73 61 76 65 20 61 20  s, so we save a 
9f60: 63 6f 70 79 20 6f 66 0a 20 20 2a 2a 20 74 68 65  copy of.  ** the
9f70: 20 6f 72 69 67 69 6e 61 6c 20 69 6e 20 70 45 4c   original in pEL
9f80: 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 45 4c 69  ist..  */.  pELi
9f90: 73 74 20 3d 20 70 53 65 6c 2d 3e 70 45 4c 69 73  st = pSel->pELis
9fa0: 74 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73  t;.  pSel->pELis
9fb0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
9fc0: 69 73 74 44 75 70 28 70 45 4c 69 73 74 29 3b 0a  istDup(pEList);.
9fd0: 20 20 69 66 28 20 70 53 65 6c 2d 3e 70 45 4c 69    if( pSel->pELi
9fe0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 53 65  st==0 ){.    pSe
9ff0: 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69  l->pEList = pELi
a000: 73 74 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  st;.    return 1
a010: 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69  ;  /* Malloc fai
a020: 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 61  led */.  }.  pTa
a030: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a  ble->nCol = -1;.
a040: 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
a050: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
a060: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20  lect(pParse, 0, 
a070: 70 53 65 6c 29 3b 0a 20 20 69 66 28 20 70 53 65  pSel);.  if( pSe
a080: 6c 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  lTab ){.    asse
a090: 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  rt( pTable->aCol
a0a0: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 6c  ==0 );.    pTabl
a0b0: 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->nCol = pSelTa
a0c0: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 54 61  b->nCol;.    pTa
a0d0: 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c  ble->aCol = pSel
a0e0: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70  Tab->aCol;.    p
a0f0: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30  SelTab->nCol = 0
a100: 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61  ;.    pSelTab->a
a110: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  Col = 0;.    sql
a120: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
a130: 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20  0, pSelTab);.   
a140: 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 70   DbSetProperty(p
a150: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 6c  Parse->db, pTabl
a160: 65 2d 3e 69 44 62 2c 20 44 42 5f 55 6e 72 65 73  e->iDb, DB_Unres
a170: 65 74 56 69 65 77 73 29 3b 0a 20 20 7d 65 6c 73  etViews);.  }els
a180: 65 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  e{.    pTable->n
a190: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 6e 45 72  Col = 0;.    nEr
a1a0: 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  r++;.  }.  sqlit
a1b0: 65 33 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 70  e3SelectUnbind(p
a1c0: 53 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Sel);.  sqlite3E
a1d0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 53  xprListDelete(pS
a1e0: 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70  el->pEList);.  p
a1f0: 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45  Sel->pEList = pE
a200: 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e  List;.  return n
a210: 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Err;  .}../*.** 
a220: 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  Clear the column
a230: 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68 65 20   names from the 
a240: 56 49 45 57 20 70 54 61 62 6c 65 2e 0a 2a 2a 0a  VIEW pTable..**.
a250: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a260: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76  is called whenev
a270: 65 72 20 61 6e 79 20 6f 74 68 65 72 20 74 61 62  er any other tab
a280: 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 6d 6f  le or view is mo
a290: 64 69 66 69 65 64 2e 0a 2a 2a 20 54 68 65 20 76  dified..** The v
a2a0: 69 65 77 20 70 61 73 73 65 64 20 69 6e 74 6f 20  iew passed into 
a2b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
a2c0: 68 74 20 64 65 70 65 6e 64 20 64 69 72 65 63 74  ht depend direct
a2d0: 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79  ly or indirectly
a2e0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 64 69 66  .** on the modif
a2f0: 69 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 74  ied or deleted t
a300: 61 62 6c 65 20 73 6f 20 77 65 20 6e 65 65 64 20  able so we need 
a310: 74 6f 20 63 6c 65 61 72 20 74 68 65 20 6f 6c 64  to clear the old
a320: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d 65 73   column.** names
a330: 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69   so that they wi
a340: 6c 6c 20 62 65 20 72 65 63 6f 6d 70 75 74 65 64  ll be recomputed
a350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a360: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
a370: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c  ColumnNames(Tabl
a380: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e  e *pTable){.  in
a390: 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  t i;.  Column *p
a3a0: 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Col;.  assert( p
a3b0: 54 61 62 6c 65 21 3d 30 20 26 26 20 70 54 61 62  Table!=0 && pTab
a3c0: 6c 65 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29  le->pSelect!=0 )
a3d0: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ;.  for(i=0, pCo
a3e0: 6c 3d 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 20  l=pTable->aCol; 
a3f0: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
a400: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
a410: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f    sqliteFree(pCo
a420: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  l->zName);.    s
a430: 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e  qliteFree(pCol->
a440: 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69  zDflt);.    sqli
a450: 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79  teFree(pCol->zTy
a460: 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  pe);.  }.  sqlit
a470: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
a480: 6f 6c 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61  ol);.  pTable->a
a490: 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  Col = 0;.  pTabl
a4a0: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a  e->nCol = 0;.}..
a4b0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
a4c0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
a4d0: 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20  m every VIEW in 
a4e0: 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f  database idx..*/
a4f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
a500: 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
a510: 73 71 6c 69 74 65 20 2a 64 62 2c 20 69 6e 74 20  sqlite *db, int 
a520: 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  idx){.  HashElem
a530: 20 2a 69 3b 0a 20 20 69 66 28 20 21 44 62 48 61   *i;.  if( !DbHa
a540: 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  sProperty(db, id
a550: 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
a560: 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ws) ) return;.  
a570: 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
a580: 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69  First(&db->aDb[i
a590: 64 78 5d 2e 74 62 6c 48 61 73 68 29 3b 20 69 3b  dx].tblHash); i;
a5a0: 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   i=sqliteHashNex
a5b0: 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  t(i)){.    Table
a5c0: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
a5d0: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
a5e0: 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
a5f0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
a600: 65 56 69 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e  eViewResetColumn
a610: 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20  Names(pTab);.   
a620: 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72   }.  }.  DbClear
a630: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
a640: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
a650: 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  s);.}../*.** Giv
a660: 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b  en a token, look
a670: 20 75 70 20 61 20 74 61 62 6c 65 20 77 69 74 68   up a table with
a680: 20 74 68 61 74 20 6e 61 6d 65 2e 20 20 49 66 20   that name.  If 
a690: 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65  not found, leave
a6a0: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 66 6f 72  .** an error for
a6b0: 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 66   the parser to f
a6c0: 69 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ind and return N
a6d0: 55 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ULL..*/.Table *s
a6e0: 71 6c 69 74 65 33 54 61 62 6c 65 46 72 6f 6d 54  qlite3TableFromT
a6f0: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
a700: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29  se, Token *pTok)
a710: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
a720: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
a730: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
a740: 33 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f  3TableNameFromTo
a750: 6b 65 6e 28 70 54 6f 6b 29 3b 0a 20 20 69 66 28  ken(pTok);.  if(
a760: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75   zName==0 ) retu
a770: 72 6e 20 30 3b 0a 20 20 70 54 61 62 20 3d 20 73  rn 0;.  pTab = s
a780: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
a790: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d  pParse->db, zNam
a7a0: 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 46  e, 0);.  sqliteF
a7b0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ree(zName);.  if
a7c0: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
a7d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
a7e0: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
a7f0: 68 20 74 61 62 6c 65 3a 20 25 54 22 2c 20 70 54  h table: %T", pT
a800: 6f 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ok);.  }.  retur
a810: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
a820: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
a830: 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68   called to do th
a840: 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50  e work of a DROP
a850: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
a860: 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68  ..** pName is th
a870: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
a880: 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65  ble to be droppe
a890: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
a8a0: 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  e3DropTable(Pars
a8b0: 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
a8c0: 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
a8d0: 73 56 69 65 77 29 7b 0a 20 20 54 61 62 6c 65 20  sView){.  Table 
a8e0: 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76  *pTab;.  Vdbe *v
a8f0: 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20  ;.  int base;.  
a900: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
a910: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
a920: 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Db;..  if( pPars
a930: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
a940: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
a950: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f   ) goto exit_dro
a960: 70 5f 74 61 62 6c 65 3b 0a 20 20 61 73 73 65 72  p_table;.  asser
a970: 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
a980: 31 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  1 );.  pTab = sq
a990: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
a9a0: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e  (pParse, pName->
a9b0: 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d  a[0].zName, pNam
a9c0: 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
a9d0: 65 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  e);..  if( pTab=
a9e0: 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64  =0 ) goto exit_d
a9f0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69 44 62  rop_table;.  iDb
aa00: 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20   = pTab->iDb;.  
aa10: 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
aa20: 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
aa30: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
aa40: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
aa50: 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
aa60: 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ode;.    const c
aa70: 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
aa80: 4d 41 5f 54 41 42 4c 45 28 70 54 61 62 2d 3e 69  MA_TABLE(pTab->i
aa90: 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  Db);.    const c
aaa0: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
aab0: 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e  Db[pTab->iDb].zN
aac0: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ame;.    if( sql
aad0: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
aae0: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
aaf0: 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
ab00: 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  b)){.      goto 
ab10: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
ab20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
ab30: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
ab40: 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  f( iDb==1 ){.   
ab50: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
ab60: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45  TE_DROP_TEMP_VIE
ab70: 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  W;.      }else{.
ab80: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
ab90: 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b  QLITE_DROP_VIEW;
aba0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
abb0: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44  se{.      if( iD
abc0: 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
abd0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
abe0: 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20  OP_TEMP_TABLE;. 
abf0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ac00: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
ac10: 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20  E_DROP_TABLE;.  
ac20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ac30: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
ac40: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
ac50: 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
ac60: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
ac70: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
ac80: 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
ac90: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
aca0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
acb0: 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61  LITE_DELETE, pTa
acc0: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  b->zName, 0, zDb
acd0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
ace0: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
acf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
ad00: 66 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65  f.  if( pTab->re
ad10: 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71  adOnly ){.    sq
ad20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ad30: 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
ad40: 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70  may not be dropp
ad50: 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
ad60: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
ad70: 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  Err++;.    goto 
ad80: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
ad90: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 56 69 65  .  }.  if( isVie
ada0: 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
adb0: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ct==0 ){.    sql
adc0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
add0: 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54  rse, "use DROP T
ade0: 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74  ABLE to delete t
adf0: 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e  able %s", pTab->
ae00: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
ae10: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
ae20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56  ;.  }.  if( !isV
ae30: 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
ae40: 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
ae50: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
ae60: 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49  se, "use DROP VI
ae70: 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65  EW to delete vie
ae80: 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  w %s", pTab->zNa
ae90: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
aea0: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
aeb0: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
aec0: 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
aed0: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
aee0: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
aef0: 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20  .  ** on disk.. 
af00: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
af10: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
af20: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
af30: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 4c 69   static VdbeOpLi
af40: 73 74 20 64 72 6f 70 54 61 62 6c 65 5b 5d 20 3d  st dropTable[] =
af50: 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65   {.      { OP_Re
af60: 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44  wind,     0, ADD
af70: 52 28 31 33 29 2c 20 30 7d 2c 0a 20 20 20 20 20  R(13), 0},.     
af80: 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20   { OP_String8,  
af90: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30    0, 0,        0
afa0: 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20  }, /* 1 */.     
afb0: 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20   { OP_MemStore, 
afc0: 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20 20 30    1, 1,        0
afd0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65  },.      { OP_Me
afe0: 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c 20  mLoad,    1, 0, 
aff0: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20         0}, /* 3 
b000: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  */.      { OP_Co
b010: 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 32 2c 20  lumn,     0, 2, 
b020: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 73 71         0}, /* sq
b030: 6c 69 74 65 5f 6d 61 73 74 65 72 2e 74 62 6c 5f  lite_master.tbl_
b040: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7b 20  name */.      { 
b050: 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 30  OP_Ne,         0
b060: 2c 20 41 44 44 52 28 31 32 29 2c 20 30 7d 2c 0a  , ADDR(12), 0},.
b070: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
b080: 67 38 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20  g8,    0, 0,    
b090: 20 20 20 20 22 74 72 69 67 67 65 72 22 7d 2c 0a      "trigger"},.
b0a0: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
b0b0: 6e 2c 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20  n,     0, 2,    
b0c0: 20 20 20 20 30 7d 2c 20 2f 2a 20 73 71 6c 69 74      0}, /* sqlit
b0d0: 65 5f 6d 61 73 74 65 72 2e 74 79 70 65 20 2a 2f  e_master.type */
b0e0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 45 71 2c 20  .      { OP_Eq, 
b0f0: 20 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28          0, ADDR(
b100: 31 32 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b  12), 0},.      {
b110: 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20   OP_Delete,     
b120: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
b130: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69  .      { OP_Rewi
b140: 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28  nd,     0, ADDR(
b150: 31 33 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b  13), 0},.      {
b160: 20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20   OP_Goto,       
b170: 30 2c 20 41 44 44 52 28 33 29 2c 20 20 30 7d 2c  0, ADDR(3),  0},
b180: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74  .      { OP_Next
b190: 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28  ,       0, ADDR(
b1a0: 33 29 2c 20 20 30 7d 2c 20 2f 2a 20 31 32 20 2a  3),  0}, /* 12 *
b1b0: 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 49 6e 64  /.    };.    Ind
b1c0: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 72  ex *pIdx;.    Tr
b1d0: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b  igger *pTrigger;
b1e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
b1f0: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
b200: 70 50 61 72 73 65 2c 20 30 2c 20 70 54 61 62 2d  pParse, 0, pTab-
b210: 3e 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  >iDb);..    /* D
b220: 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73  rop all triggers
b230: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
b240: 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
b250: 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20   dropped. Code. 
b260: 20 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74     ** is generat
b270: 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74  ed to remove ent
b280: 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65  ries from sqlite
b290: 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20  _master and/or. 
b2a0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d     ** sqlite_tem
b2b0: 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71 75  p_master if requ
b2c0: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
b2d0: 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 61 62   pTrigger = pTab
b2e0: 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20  ->pTrigger;.    
b2f0: 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20  while( pTrigger 
b300: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
b310: 20 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d   pTrigger->iDb==
b320: 70 54 61 62 2d 3e 69 44 62 20 7c 7c 20 70 54 72  pTab->iDb || pTr
b330: 69 67 67 65 72 2d 3e 69 44 62 3d 3d 31 20 29 3b  igger->iDb==1 );
b340: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 72  .      sqlite3Dr
b350: 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61  opTriggerPtr(pPa
b360: 72 73 65 2c 20 70 54 72 69 67 67 65 72 2c 20 31  rse, pTrigger, 1
b370: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
b380: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
b390: 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72          pTrigger
b3a0: 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65   = pTrigger->pNe
b3b0: 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  xt;.      }else{
b3c0: 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65  .        pTrigge
b3d0: 72 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67 67  r = pTab->pTrigg
b3e0: 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  er;.      }.    
b3f0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61  }..    /* Drop a
b400: 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ll SQLITE_MASTER
b410: 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
b420: 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65   entries that re
b430: 66 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  fer to the.    *
b440: 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f  * table. The pro
b450: 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20  gram name loops 
b460: 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74  through the mast
b470: 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c  er table and del
b480: 65 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65 72  etes.    ** ever
b490: 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72  y row that refer
b4a0: 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20  s to a table of 
b4b0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
b4c0: 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20   the one being. 
b4d0: 20 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54     ** dropped. T
b4e0: 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64  riggers are hand
b4f0: 6c 65 64 20 73 65 70 65 72 61 74 65 6c 79 20 62  led seperately b
b500: 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72  ecause a trigger
b510: 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63   can be.    ** c
b520: 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65  reated in the te
b530: 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74  mp database that
b540: 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
b550: 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20  le in another.  
b560: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20    ** database.. 
b570: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
b580: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
b590: 28 76 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a  (v, pTab->iDb);.
b5a0: 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74      base = sqlit
b5b0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
b5c0: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f  v, ArraySize(dro
b5d0: 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54 61 62  pTable), dropTab
b5e0: 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  le);.    sqlite3
b5f0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
b600: 62 61 73 65 2b 31 2c 20 70 54 61 62 2d 3e 7a 4e  base+1, pTab->zN
b610: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ame, 0);.    sql
b620: 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
b630: 28 64 62 2c 20 76 2c 20 70 54 61 62 2d 3e 69 44  (db, v, pTab->iD
b640: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
b650: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
b660: 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lose, 0, 0);.   
b670: 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a   if( !isView ){.
b680: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b690: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73  eAddOp(v, OP_Des
b6a0: 74 72 6f 79 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  troy, pTab->tnum
b6b0: 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20  , pTab->iDb);.  
b6c0: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
b6d0: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
b6e0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
b6f0: 74 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t){.        sqli
b700: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b710: 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49 64 78  OP_Destroy, pIdx
b720: 2d 3e 74 6e 75 6d 2c 20 70 49 64 78 2d 3e 69 44  ->tnum, pIdx->iD
b730: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
b740: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  }.    sqlite3End
b750: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
b760: 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Parse);.  }..  /
b770: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e 2d  * Delete the in-
b780: 6d 65 6d 6f 72 79 20 64 65 73 63 72 69 70 74 69  memory descripti
b790: 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  on of the table.
b7a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
b7b0: 74 69 6f 6e 3a 20 69 66 20 74 68 65 20 53 51 4c  tion: if the SQL
b7c0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 67 61 6e   statement began
b7d0: 20 77 69 74 68 20 74 68 65 20 45 58 50 4c 41 49   with the EXPLAI
b7e0: 4e 20 6b 65 79 77 6f 72 64 2c 0a 20 20 2a 2a 20  N keyword,.  ** 
b7f0: 74 68 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20  then no changes 
b800: 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65 2e 0a  should be made..
b810: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72    */.  if( !pPar
b820: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
b830: 20 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41     sqliteUnlinkA
b840: 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  ndDeleteTable(db
b850: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 64 62 2d  , pTab);.    db-
b860: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
b870: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
b880: 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77    }.  sqliteView
b890: 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62  ResetAll(db, iDb
b8a0: 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61  );..exit_drop_ta
b8b0: 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72  ble:.  sqlite3Sr
b8c0: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d  cListDelete(pNam
b8d0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  e);.}../*.** Thi
b8e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
b8f0: 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  led to create a 
b900: 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  new foreign key 
b910: 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  on the table.** 
b920: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
b930: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70  construction.  p
b940: 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e  FromCol determin
b950: 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73  es which columns
b960: 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65  .** in the curre
b970: 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74  nt table point t
b980: 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  o the foreign ke
b990: 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d  y.  If pFromCol=
b9a0: 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65  =0 then.** conne
b9b0: 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68  ct the key to th
b9c0: 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e  e last column in
b9d0: 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20  serted.  pTo is 
b9e0: 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74  the name of.** t
b9f0: 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65  he table referre
ba00: 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73  d to.  pToCol is
ba10: 20 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65   a list of table
ba20: 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a  s in the other.*
ba30: 2a 20 70 54 6f 20 74 61 62 6c 65 20 74 68 61 74  * pTo table that
ba40: 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
ba50: 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61   points to.  fla
ba60: 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  gs contains all.
ba70: 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** information a
ba80: 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63  bout the conflic
ba90: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
baa0: 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65  orithms specifie
bab0: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44  d.** in the ON D
bac0: 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45  ELETE, ON UPDATE
bad0: 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63   and ON INSERT c
bae0: 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  lauses..**.** An
baf0: 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20   FKey structure 
bb00: 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61  is created and a
bb10: 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
bb20: 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75  e currently.** u
bb30: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
bb40: 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d  n in the pParse-
bb50: 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64  >pNewTable field
bb60: 2e 20 20 54 68 65 20 6e 65 77 20 46 4b 65 79 0a  .  The new FKey.
bb70: 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e 6b 65 64  ** is not linked
bb80: 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b 65 79 20   into db->aFKey 
bb90: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 2d 20  at this point - 
bba0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 68 61  that does not ha
bbb0: 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73 71  ppen.** until sq
bbc0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e  lite3EndTable().
bbd0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69  .**.** The forei
bbe0: 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f  gn key is set fo
bbf0: 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63  r IMMEDIATE proc
bc00: 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65  essing.  A subse
bc10: 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f  quent call.** to
bc20: 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
bc30: 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20  eignKey() might 
bc40: 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44  change this to D
bc50: 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64  EFERRED..*/.void
bc60: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f   sqlite3CreateFo
bc70: 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73  reignKey(.  Pars
bc80: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
bc90: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
bca0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
bcb0: 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a  t *pFromCol,  /*
bcc0: 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73   Columns in this
bcd0: 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e   table that poin
bce0: 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65  t to other table
bcf0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f   */.  Token *pTo
bd00: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ,          /* Na
bd10: 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  me of the other 
bd20: 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
bd30: 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20  ist *pToCol,    
bd40: 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
bd50: 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  e other table */
bd60: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
bd70: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c          /* Confl
bd80: 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
bd90: 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b  lgorithms. */.){
bda0: 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50  .  Table *p = pP
bdb0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
bdc0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
bdd0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f  int i;.  int nCo
bde0: 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  l;.  char *z;.  
bdf0: 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b  FKey *pFKey = 0;
be00: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21  ..  assert( pTo!
be10: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
be20: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
be30: 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
be40: 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
be50: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  0 ){.    int iCo
be60: 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  l = p->nCol-1;. 
be70: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
be80: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
be90: 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70   if( pToCol && p
bea0: 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20  ToCol->nExpr!=1 
beb0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
bec0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
bed0: 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e   "foreign key on
bee0: 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20   %s".         " 
bef0: 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65  should reference
bf00: 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e   only one column
bf10: 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20   of table %T",. 
bf20: 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b          p->aCol[
bf30: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f  iCol].zName, pTo
bf40: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  );.      goto fk
bf50: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
bf60: 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  nCol = 1;.  }els
bf70: 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20  e if( pToCol && 
bf80: 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70  pToCol->nExpr!=p
bf90: 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29  FromCol->nExpr )
bfa0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
bfb0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
bfc0: 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66        "number of
bfd0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65   columns in fore
bfe0: 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  ign key does not
bff0: 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65   match the numbe
c000: 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22  r of ".        "
c010: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
c020: 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22  eferenced table"
c030: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  );.    goto fk_e
c040: 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  nd;.  }else{.   
c050: 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c   nCol = pFromCol
c060: 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e  ->nExpr;.  }.  n
c070: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
c080: 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a  FKey) + nCol*siz
c090: 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  eof(pFKey->aCol[
c0a0: 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31  0]) + pTo->n + 1
c0b0: 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  ;.  if( pToCol )
c0c0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
c0d0: 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20  <pToCol->nExpr; 
c0e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  i++){.      nByt
c0f0: 65 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43  e += strlen(pToC
c100: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20  ol->a[i].zName) 
c110: 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  + 1;.    }.  }. 
c120: 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d   pFKey = sqliteM
c130: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a  alloc( nByte );.
c140: 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29    if( pFKey==0 )
c150: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
c160: 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70  pFKey->pFrom = p
c170: 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  ;.  pFKey->pNext
c180: 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b  From = p->pFKey;
c190: 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70  .  z = (char*)&p
c1a0: 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79  FKey[1];.  pFKey
c1b0: 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75 63 74  ->aCol = (struct
c1c0: 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a   sColMap*)z;.  z
c1d0: 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72 75 63   += sizeof(struc
c1e0: 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b  t sColMap)*nCol;
c1f0: 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20  .  pFKey->zTo = 
c200: 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70  z;.  memcpy(z, p
c210: 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a  To->z, pTo->n);.
c220: 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b    z[pTo->n] = 0;
c230: 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31  .  z += pTo->n+1
c240: 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  ;.  pFKey->pNext
c250: 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d  To = 0;.  pFKey-
c260: 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  >nCol = nCol;.  
c270: 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
c280: 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  ){.    pFKey->aC
c290: 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d  ol[0].iFrom = p-
c2a0: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65  >nCol-1;.  }else
c2b0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
c2c0: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
c2d0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
c2e0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43  for(j=0; j<p->nC
c2f0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
c300: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
c310: 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ICmp(p->aCol[j].
c320: 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d  zName, pFromCol-
c330: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
c340: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b  ){.          pFK
c350: 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f  ey->aCol[i].iFro
c360: 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  m = j;.         
c370: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
c380: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
c390: 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29  if( j>=p->nCol )
c3a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
c3b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
c3c0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e  , .          "un
c3d0: 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25  known column \"%
c3e0: 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  s\" in foreign k
c3f0: 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20  ey definition", 
c400: 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d  .          pFrom
c410: 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
c420: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
c430: 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  k_end;.      }. 
c440: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
c450: 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
c460: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
c470: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  +){.      int n 
c480: 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d  = strlen(pToCol-
c490: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
c4a0: 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
c4b0: 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20  i].zCol = z;.   
c4c0: 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f     memcpy(z, pTo
c4d0: 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  Col->a[i].zName,
c4e0: 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20   n);.      z[n] 
c4f0: 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  = 0;.      z += 
c500: 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n+1;.    }.  }. 
c510: 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
c520: 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d  ed = 0;.  pFKey-
c530: 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c  >deleteConf = fl
c540: 61 67 73 20 26 20 30 78 66 66 3b 0a 20 20 70 46  ags & 0xff;.  pF
c550: 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20  Key->updateConf 
c560: 3d 20 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20  = (flags >> 8 ) 
c570: 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d  & 0xff;.  pFKey-
c580: 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28 66  >insertConf = (f
c590: 6c 61 67 73 20 3e 3e 20 31 36 20 29 20 26 20 30  lags >> 16 ) & 0
c5a0: 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  xff;..  /* Link 
c5b0: 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
c5c0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20  to the table as 
c5d0: 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20  the last step.. 
c5e0: 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d   */.  p->pFKey =
c5f0: 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20   pFKey;.  pFKey 
c600: 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20  = 0;..fk_end:.  
c610: 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79  sqliteFree(pFKey
c620: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
c630: 4c 69 73 74 44 65 6c 65 74 65 28 70 46 72 6f 6d  ListDelete(pFrom
c640: 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Col);.  sqlite3E
c650: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 54  xprListDelete(pT
c660: 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  oCol);.}../*.** 
c670: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
c680: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49  called when an I
c690: 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
c6a0: 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  TE or INITIALLY 
c6b0: 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75  DEFERRED.** clau
c6c0: 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61  se is seen as pa
c6d0: 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20  rt of a foreign 
c6e0: 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20  key definition. 
c6f0: 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a   The isDeferred.
c700: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
c710: 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  1 for INITIALLY 
c720: 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66  DEFERRED and 0 f
c730: 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  or INITIALLY IMM
c740: 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62  EDIATE..** The b
c750: 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d  ehavior of the m
c760: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65  ost recently cre
c770: 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  ated foreign key
c780: 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20   is adjusted.** 
c790: 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a  accordingly..*/.
c7a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 65  void sqlite3Defe
c7b0: 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73  rForeignKey(Pars
c7c0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
c7d0: 73 44 65 66 65 72 72 65 64 29 7b 0a 20 20 54 61  sDeferred){.  Ta
c7e0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65  ble *pTab;.  FKe
c7f0: 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20  y *pFKey;.  if( 
c800: 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  (pTab = pParse->
c810: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c  pNewTable)==0 ||
c820: 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e   (pFKey = pTab->
c830: 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75  pFKey)==0 ) retu
c840: 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44  rn;.  pFKey->isD
c850: 65 66 65 72 72 65 64 20 3d 20 69 73 44 65 66 65  eferred = isDefe
c860: 72 72 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rred;.}../*.** C
c870: 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65  reate a new inde
c880: 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62  x for an SQL tab
c890: 6c 65 2e 20 20 70 49 6e 64 65 78 20 69 73 20 74  le.  pIndex is t
c8a0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
c8b0: 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 61  ndex .** and pTa
c8c0: 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ble is the name 
c8d0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
c8e0: 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
c8f0: 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a  ed.  Both will .
c900: 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61  ** be NULL for a
c910: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
c920: 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
c930: 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69   created to sati
c940: 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20  sfy a.** UNIQUE 
c950: 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20  constraint.  If 
c960: 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65  pTable and pInde
c970: 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20  x are NULL, use 
c980: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
c990: 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  e.** as the tabl
c9a0: 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  e to be indexed.
c9b0: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
c9c0: 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74  ble is a table t
c9d0: 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e  hat is.** curren
c9e0: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
c9f0: 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54  ucted by a CREAT
ca00: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
ca10: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69  t..**.** pList i
ca20: 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  s a list of colu
ca30: 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
ca40: 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62  d.  pList will b
ca50: 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a  e NULL if this.*
ca60: 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b  * is a primary k
ca70: 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e  ey or unique-con
ca80: 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d  straint on the m
ca90: 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d  ost recent colum
caa0: 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68  n added.** to th
cab0: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
cac0: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
cad0: 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20  tion.  .*/.void 
cae0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
caf0: 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
cb00: 72 73 65 2c 20 20 20 2f 2a 20 41 6c 6c 20 69 6e  rse,   /* All in
cb10: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
cb20: 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20  this parse */.  
cb30: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
cb40: 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
cb50: 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
cb60: 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  y be NULL */.  T
cb70: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
cb80: 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f  /* Second part o
cb90: 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
cba0: 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53  y be NULL */.  S
cbb0: 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65  rcList *pTblName
cbc0: 2c 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69  ,  /* Table to i
cbd0: 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65  ndex. Use pParse
cbe0: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30  ->pNewTable if 0
cbf0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
cc00: 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69  pList,   /* A li
cc10: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
cc20: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
cc30: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
cc40: 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f    /* OE_Abort, O
cc50: 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70  E_Ignore, OE_Rep
cc60: 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65  lace, or OE_None
cc70: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
cc80: 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 43 52  art,   /* The CR
cc90: 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
cca0: 62 65 67 69 6e 73 20 61 20 43 52 45 41 54 45 20  begins a CREATE 
ccb0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
ccc0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  */.  Token *pEnd
ccd0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22        /* The ")"
cce0: 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65   that closes the
ccf0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
cd00: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  atement */.){.  
cd10: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
cd20: 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
cd30: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64  indexed */.  Ind
cd40: 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 2f 2a  ex *pIndex;   /*
cd50: 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
cd60: 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68   created */.  ch
cd70: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
cd80: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b   int i, j;.  Tok
cd90: 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 2f 2a  en nullId;    /*
cda0: 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20   Fake token for 
cdb0: 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74  an empty ID list
cdc0: 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46   */.  DbFixer sF
cdd0: 69 78 3b 20 20 20 20 2f 2a 20 46 6f 72 20 61 73  ix;    /* For as
cde0: 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65  signing database
cdf0: 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65   names to pTable
ce00: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
ce10: 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66  ;      /* True f
ce20: 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 69  or a temporary i
ce30: 6e 64 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ndex */.  sqlite
ce40: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
ce50: 62 3b 0a 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  b;..  int iDb;  
ce60: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
ce70: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
ce80: 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 77   that is being w
ce90: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ritten */.  Toke
cea0: 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a  n *pName = 0; /*
ceb0: 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
cec0: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74  e of the index t
ced0: 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69  o create */..  i
cee0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
cef0: 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
cf00: 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  c_failed ) goto 
cf10: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
cf20: 78 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69  x;..  /*.  ** Fi
cf30: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  nd the table tha
cf40: 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
cf50: 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c  ed.  Return earl
cf60: 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  y if not found..
cf70: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e    */.  if( pTblN
cf80: 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f  ame!=0 ){..    /
cf90: 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61  * Use the two-pa
cfa0: 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f  rt index name to
cfb0: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64   determine the d
cfc0: 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
cfd0: 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68  to search for th
cfe0: 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74  e table. 'Fix' t
cff0: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  he table name to
d000: 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20   this db.    ** 
d010: 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75  before looking u
d020: 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  p the table..   
d030: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
d040: 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32  pName1 && pName2
d050: 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71   );.    iDb = sq
d060: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
d070: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
d080: 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
d090: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
d0a0: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
d0b0: 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20 2f  te_index;..    /
d0c0: 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e  * If the index n
d0d0: 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66  ame was unqualif
d0e0: 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68  ied, check if th
d0f0: 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  e the table.    
d100: 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62  ** is a temp tab
d110: 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74  le. If so, set t
d120: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31  he database to 1
d130: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 61  ..    */.    pTa
d140: 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  b = sqlite3SrcLi
d150: 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  stLookup(pParse,
d160: 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20   pTblName);.    
d170: 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e  if( pName2 && pN
d180: 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54  ame2->n==0 && pT
d190: 61 62 20 26 26 20 70 54 61 62 2d 3e 69 44 62 3d  ab && pTab->iDb=
d1a0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 44 62 20  =1 ){.      iDb 
d1b0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
d1c0: 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e  if( sqlite3FixIn
d1d0: 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
d1e0: 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20  , iDb, "index", 
d1f0: 70 4e 61 6d 65 29 20 26 26 0a 20 20 20 20 20 20  pName) &&.      
d200: 20 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c    sqlite3FixSrcL
d210: 69 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e  ist(&sFix, pTblN
d220: 61 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ame).    ){.    
d230: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
d240: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
d250: 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
d260: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
d270: 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e  arse, pTblName->
d280: 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20  a[0].zName, .   
d290: 20 20 20 20 20 70 54 62 6c 4e 61 6d 65 2d 3e 61       pTblName->a
d2a0: 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
d2b0: 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20      if( !pTab ) 
d2c0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
d2d0: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65  _index;.    asse
d2e0: 72 74 28 20 69 44 62 3d 3d 70 54 61 62 2d 3e 69  rt( iDb==pTab->i
d2f0: 44 62 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Db );.  }else{. 
d300: 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
d310: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20  ==0 );.    pTab 
d320: 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  =  pParse->pNewT
d330: 61 62 6c 65 3b 0a 20 20 20 20 69 44 62 20 3d 20  able;.    iDb = 
d340: 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 7d 0a 0a  pTab->iDb;.  }..
d350: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c    if( pTab==0 ||
d360: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
d370: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
d380: 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54  _index;.  if( pT
d390: 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  ab->readOnly ){.
d3a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
d3b0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
d3c0: 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65  le %s may not be
d3d0: 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d   indexed", pTab-
d3e0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
d3f0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
d400: 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dex;.  }.  if( p
d410: 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
d420: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
d430: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65  Msg(pParse, "vie
d440: 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  ws may not be in
d450: 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74  dexed");.    got
d460: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
d470: 64 65 78 3b 0a 20 20 7d 0a 20 20 69 73 54 65 6d  dex;.  }.  isTem
d480: 70 20 3d 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31  p = pTab->iDb==1
d490: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  ;..  /*.  ** Fin
d4a0: 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  d the name of th
d4b0: 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73  e index.  Make s
d4c0: 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74  ure there is not
d4d0: 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72   already another
d4e0: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
d4f0: 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61  able with the sa
d500: 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a  me name.  .  **.
d510: 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20    ** Exception: 
d520: 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69   If we are readi
d530: 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ng the names of 
d540: 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65  permanent indice
d550: 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  s from the.  ** 
d560: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
d570: 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d  ble (because som
d580: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
d590: 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65  changed the sche
d5a0: 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65  ma) and.  ** one
d5b0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61   of the index na
d5c0: 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74  mes collides wit
d5d0: 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  h the name of a 
d5e0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
d5f0: 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74  or.  ** index, t
d600: 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74  hen we will cont
d610: 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20  inue to process 
d620: 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a  this index..  **
d630: 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d  .  ** If pName==
d640: 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  0 it means that 
d650: 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c  we are.  ** deal
d660: 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61  ing with a prima
d670: 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45  ry key or UNIQUE
d680: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65   constraint.  We
d690: 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20   have to invent 
d6a0: 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d  our.  ** own nam
d6b0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e  e..  */.  if( pN
d6c0: 61 6d 65 20 26 26 20 21 64 62 2d 3e 69 6e 69 74  ame && !db->init
d6d0: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64  .busy ){.    Ind
d6e0: 65 78 20 2a 70 49 53 61 6d 65 4e 61 6d 65 3b 20  ex *pISameName; 
d6f0: 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 69 6e     /* Another in
d700: 64 65 78 20 77 69 74 68 20 74 68 65 20 73 61 6d  dex with the sam
d710: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54 61  e name */.    Ta
d720: 62 6c 65 20 2a 70 54 53 61 6d 65 4e 61 6d 65 3b  ble *pTSameName;
d730: 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 77      /* A table w
d740: 69 74 68 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  ith same name as
d750: 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
d760: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
d770: 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a  StrNDup(pName->z
d780: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  , pName->n);.   
d790: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
d7a0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
d7b0: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
d7c0: 28 70 49 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71  (pISameName = sq
d7d0: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
d7e0: 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44  b, zName, db->aD
d7f0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 29 21 3d  b[iDb].zName))!=
d800: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
d810: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
d820: 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72  e, "index %s alr
d830: 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e  eady exists", zN
d840: 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
d850: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
d860: 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
d870: 28 20 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d 20  ( (pTSameName = 
d880: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
d890: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21  (db, zName, 0))!
d8a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
d8b0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
d8c0: 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  se, "there is al
d8d0: 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61  ready a table na
d8e0: 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
d8f0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
d900: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
d910: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
d920: 20 70 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   pName==0 ){.   
d930: 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
d940: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49      int n;.    I
d950: 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20  ndex *pLoop;.   
d960: 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d   for(pLoop=pTab-
d970: 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c  >pIndex, n=1; pL
d980: 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
d990: 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a  ->pNext, n++){}.
d9a0: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
d9b0: 2c 22 25 64 29 22 2c 6e 29 3b 0a 20 20 20 20 7a  ,"%d)",n);.    z
d9c0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71  Name = 0;.    sq
d9d0: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
d9e0: 7a 4e 61 6d 65 2c 20 22 28 22 2c 20 70 54 61 62  zName, "(", pTab
d9f0: 2d 3e 7a 4e 61 6d 65 2c 20 22 20 61 75 74 6f 69  ->zName, " autoi
da00: 6e 64 65 78 20 22 2c 20 7a 42 75 66 2c 20 28 63  ndex ", zBuf, (c
da10: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 69 66 28  har*)0);.    if(
da20: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f   zName==0 ) goto
da30: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
da40: 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ex;.  }else{.   
da50: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53   zName = sqliteS
da60: 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c  trNDup(pName->z,
da70: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 7d 0a   pName->n);.  }.
da80: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
da90: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f  authorization to
daa0: 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78   create an index
dab0: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
dac0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
dad0: 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
dae0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
daf0: 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d   = db->aDb[pTab-
db00: 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >iDb].zName;.   
db10: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
db20: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
db30: 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
db40: 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70  EMA_TABLE(isTemp
db50: 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  ), 0, zDb) ){.  
db60: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
db70: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
db80: 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45  }.    i = SQLITE
db90: 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20  _CREATE_INDEX;. 
dba0: 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 20     if( isTemp ) 
dbb0: 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
dbc0: 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  E_TEMP_INDEX;.  
dbd0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
dbe0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69  hCheck(pParse, i
dbf0: 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  , zName, pTab->z
dc00: 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
dc10: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
dc20: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
dc30: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
dc40: 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20  /* If pList==0, 
dc50: 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f  it means this ro
dc60: 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
dc70: 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61   to make a prima
dc80: 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20  ry.  ** key out 
dc90: 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  of the last colu
dca0: 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  mn added to the 
dcb0: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
dcc0: 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53  truction..  ** S
dcd0: 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20  o create a fake 
dce0: 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65  list to simulate
dcf0: 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   this..  */.  if
dd00: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
dd10: 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61    nullId.z = pTa
dd20: 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
dd30: 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol-1].zName;.   
dd40: 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c   nullId.n = strl
dd50: 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20  en(nullId.z);.  
dd60: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
dd70: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
dd80: 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a  0, 0, &nullId);.
dd90: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
dda0: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
ddb0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
ddc0: 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63    /* .  ** Alloc
ddd0: 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74  ate the index st
dde0: 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20  ructure. .  */. 
ddf0: 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
de00: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49  Malloc( sizeof(I
de10: 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e 28 7a  ndex) + strlen(z
de20: 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20 20 20 20  Name) + 1 +.    
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de40: 20 20 20 20 28 73 69 7a 65 6f 66 28 69 6e 74 29      (sizeof(int)
de50: 20 2b 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65   + sizeof(CollSe
de60: 71 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e 45 78 70  q*))*pList->nExp
de70: 72 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  r );.  if( pInde
de80: 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  x==0 ) goto exit
de90: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
dea0: 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
deb0: 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64 65  n = (int*)&pInde
dec0: 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
ded0: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a  [pList->nExpr];.
dee0: 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20    pIndex->zName 
def0: 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78  = (char*)&pIndex
df00: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74  ->aiColumn[pList
df10: 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 73 74 72 63  ->nExpr];.  strc
df20: 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  py(pIndex->zName
df30: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64  , zName);.  pInd
df40: 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  ex->pTable = pTa
df50: 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  b;.  pIndex->nCo
df60: 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  lumn = pList->nE
df70: 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f  xpr;.  pIndex->o
df80: 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72  nError = onError
df90: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f  ;.  pIndex->auto
dfa0: 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30  Index = pName==0
dfb0: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44 62 20  ;.  pIndex->iDb 
dfc0: 3d 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 53 63 61  = iDb;..  /* Sca
dfd0: 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  n the names of t
dfe0: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
dff0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
e000: 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c  dexed and.  ** l
e010: 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  oad the column i
e020: 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20  ndices into the 
e030: 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  Index structure.
e040: 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f    Report an erro
e050: 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f  r.  ** if any co
e060: 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e  lumn is not foun
e070: 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  d..  */.  for(i=
e080: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
e090: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  r; i++){.    for
e0a0: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
e0b0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
e0c0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
e0d0: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
e0e0: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
e0f0: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [j].zName)==0 ) 
e100: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e110: 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
e120: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
e130: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
e140: 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
e150: 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s no column name
e160: 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  d %s",.        p
e170: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69 73  Tab->zName, pLis
e180: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
e190: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
e1a0: 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  (pIndex);.      
e1b0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
e1c0: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
e1d0: 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
e1e0: 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 69  mn[i] = j;.    i
e1f0: 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  f( pList->a[i].p
e200: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 61 73  Expr ){.      as
e210: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 5b 69  sert( pList->a[i
e220: 5d 2e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29  ].pExpr->pColl )
e230: 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  ;.      pIndex->
e240: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d  keyInfo.aColl[i]
e250: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
e260: 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20  Expr->pColl;.   
e270: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
e280: 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  ndex->keyInfo.aC
e290: 6f 6c 6c 5b 69 5d 20 3d 20 70 54 61 62 2d 3e 61  oll[i] = pTab->a
e2a0: 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20  Col[j].pColl;.  
e2b0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
e2c0: 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e  pIndex->keyInfo.
e2d0: 61 43 6f 6c 6c 5b 69 5d 20 29 3b 0a 20 20 7d 0a  aColl[i] );.  }.
e2e0: 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66    pIndex->keyInf
e2f0: 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 4c 69 73 74  o.nField = pList
e300: 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 4c  ->nExpr;..  /* L
e310: 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65  ink the new Inde
e320: 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  x structure to i
e330: 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20  ts table and to 
e340: 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69  the other.  ** i
e350: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
e360: 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20  e structures. . 
e370: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
e380: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
e390: 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
e3a0: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
e3b0: 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70  nsert(&db->aDb[p
e3c0: 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 69 64 78 48  Index->iDb].idxH
e3d0: 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ash, .          
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
e3f0: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74  Index->zName, st
e400: 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e 61  rlen(pIndex->zNa
e410: 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b 0a  me)+1, pIndex);.
e420: 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
e430: 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49     assert( p==pI
e440: 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  ndex );  /* Mall
e450: 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
e460: 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  led */.      sql
e470: 69 74 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b  iteFree(pIndex);
e480: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
e490: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
e4a0: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61     }.    db->fla
e4b0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
e4c0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a  ernChanges;.  }.
e4d0: 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e  .  /* When addin
e4e0: 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68  g an index to th
e4f0: 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65  e list of indice
e500: 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d  s for a table, m
e510: 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c  ake.  ** sure al
e520: 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65  l indices labele
e530: 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d  d OE_Replace com
e540: 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73  e after all thos
e550: 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f  e labeled.  ** O
e560: 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20  E_Ignore.  This 
e570: 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72  is necessary for
e580: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65   the correct ope
e590: 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54 45  ration of UPDATE
e5a0: 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54  .  ** and INSERT
e5b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 6e 45  ..  */.  if( onE
e5c0: 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
e5d0: 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
e5e0: 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 70 54  ==0.       || pT
e5f0: 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ab->pIndex->onEr
e600: 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29  ror==OE_Replace)
e610: 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e  {.    pIndex->pN
e620: 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  ext = pTab->pInd
e630: 65 78 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70 49  ex;.    pTab->pI
e640: 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20  ndex = pIndex;. 
e650: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65   }else{.    Inde
e660: 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62  x *pOther = pTab
e670: 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 77 68  ->pIndex;.    wh
e680: 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65  ile( pOther->pNe
e690: 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e  xt && pOther->pN
e6a0: 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  ext->onError!=OE
e6b0: 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20  _Replace ){.    
e6c0: 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65    pOther = pOthe
e6d0: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
e6e0: 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78      pIndex->pNex
e6f0: 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  t = pOther->pNex
e700: 74 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d 3e 70  t;.    pOther->p
e710: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20  Next = pIndex;. 
e720: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
e730: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
e740: 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61   1 it means we a
e750: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53  re reading the S
e760: 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20  QL off the.  ** 
e770: 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20  "sqlite_master" 
e780: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73  table on the dis
e790: 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72  k.  So do not wr
e7a0: 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 0a  ite to the disk.
e7b0: 20 20 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78 74    ** again.  Ext
e7c0: 72 61 63 74 20 74 68 65 20 74 61 62 6c 65 20 6e  ract the table n
e7d0: 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20 64  umber from the d
e7e0: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20  b->init.newTnum 
e7f0: 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  field..  */.  if
e800: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
e810: 26 26 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  && pTblName!=0 )
e820: 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e  {.    pIndex->tn
e830: 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
e840: 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  wTnum;.  }..  /*
e850: 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74   If the db->init
e860: 2e 62 75 73 79 20 69 73 20 30 20 74 68 65 6e 20  .busy is 0 then 
e870: 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65 78  create the index
e880: 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a   on disk.  This.
e890: 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72    ** involves wr
e8a0: 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  iting the index 
e8b0: 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  into the master 
e8c0: 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e  table and fillin
e8d0: 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e  g in the.  ** in
e8e0: 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75 72  dex with the cur
e8f0: 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65  rent table conte
e900: 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nts..  **.  ** T
e910: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  he db->init.busy
e920: 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20 75   is 0 when the u
e930: 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72 73  ser first enters
e940: 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20   a CREATE INDEX 
e950: 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20  .  ** command.  
e960: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
e970: 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61   1 when a databa
e980: 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64  se is opened and
e990: 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e   .  ** CREATE IN
e9a0: 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61  DEX statements a
e9b0: 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74  re read out of t
e9c0: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  he master table.
e9d0: 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61    In.  ** the la
e9e0: 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e  tter case the in
e9f0: 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
ea00: 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63  ts on disk, whic
ea10: 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65  h is why.  ** we
ea20: 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
ea30: 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a  ecreate it..  **
ea40: 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d  .  ** If pTblNam
ea50: 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
ea60: 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65  is index is gene
ea70: 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61  rated as a prima
ea80: 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55  ry key.  ** or U
ea90: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
eaa0: 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42   of a CREATE TAB
eab0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  LE statement.  S
eac0: 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20  ince the table. 
ead0: 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65   ** has just bee
eae0: 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f  n created, it co
eaf0: 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61  ntains no data a
eb00: 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69  nd the index ini
eb10: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
eb20: 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69   step can be ski
eb30: 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
eb40: 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62  e if( db->init.b
eb50: 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  usy==0 ){.    in
eb60: 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  t n;.    Vdbe *v
eb70: 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31 2c 20  ;.    int lbl1, 
eb80: 6c 62 6c 32 3b 0a 0a 20 20 20 20 76 20 3d 20 73  lbl2;..    v = s
eb90: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
eba0: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
ebb0: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
ebc0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
ebd0: 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d    if( pTblName!=
ebe0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
ebf0: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
ec00: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
ec10: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
ec20: 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61  ite3OpenMasterTa
ec30: 62 6c 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20  ble(v, iDb);.   
ec40: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
ec50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
ec60: 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20  wRecno, 0, 0);. 
ec70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
ec80: 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  3(v, OP_String8,
ec90: 20 30 2c 20 30 2c 20 22 69 6e 64 65 78 22 2c 20   0, 0, "index", 
eca0: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
ecb0: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
ecc0: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
ecd0: 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d   0, pIndex->zNam
ece0: 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
ecf0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
ed00: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70  String8, 0, 0, p
ed10: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
ed20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
ed30: 70 33 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49  p3(v, OP_CreateI
ed40: 6e 64 65 78 2c 20 30 2c 20 69 44 62 2c 28 63 68  ndex, 0, iDb,(ch
ed50: 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 74 6e 75  ar*)&pIndex->tnu
ed60: 6d 2c 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20  m,P3_POINTER);. 
ed70: 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
ed80: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 54 62  = 0;.    if( pTb
ed90: 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73  lName ){.      s
eda0: 71 6c 69 74 65 33 56 64 62 65 43 6f 64 65 28 76  qlite3VdbeCode(v
edb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 4f 50 5f 44  ,.          OP_D
edc0: 75 70 2c 20 20 20 20 20 20 20 30 2c 20 20 20 20  up,       0,    
edd0: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 4f    0,.          O
ede0: 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 69 44 62  P_Integer,   iDb
edf0: 2c 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30 29  ,    0,.      0)
ee00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ee10: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  dbeOp3(v, OP_Ope
ee20: 6e 57 72 69 74 65 2c 20 31 2c 20 30 2c 0a 20 20  nWrite, 1, 0,.  
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee40: 20 20 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65     (char*)&pInde
ee50: 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b  x->keyInfo, P3_K
ee60: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 7d 0a 20  EYINFO);.    }. 
ee70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ee80: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
ee90: 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  8, 0, 0);.    if
eea0: 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e 64  ( pStart && pEnd
eeb0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e   ){.      if( on
eec0: 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29  Error==OE_None )
eed0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
eee0: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
eef0: 20 2d 31 2c 20 22 43 52 45 41 54 45 20 49 4e 44   -1, "CREATE IND
ef00: 45 58 20 22 2c 20 50 33 5f 53 54 41 54 49 43 29  EX ", P3_STATIC)
ef10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ef20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ef30: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
ef40: 2c 20 22 43 52 45 41 54 45 20 55 4e 49 51 55 45  , "CREATE UNIQUE
ef50: 20 49 4e 44 45 58 20 22 2c 20 50 33 5f 53 54 41   INDEX ", P3_STA
ef60: 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TIC);.      }.  
ef70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ef80: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
ef90: 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  g8, 0, 0);.     
efa0: 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e   n = Addr(pEnd->
efb0: 7a 29 20 2d 20 41 64 64 72 28 70 4e 61 6d 65 2d  z) - Addr(pName-
efc0: 3e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73  >z) + 1;.      s
efd0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
efe0: 50 33 28 76 2c 20 2d 31 2c 20 70 4e 61 6d 65 2d  P3(v, -1, pName-
eff0: 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71  >z, n);.      sq
f000: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f010: 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 32 2c 20  , OP_Concat, 2, 
f020: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
f030: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
f040: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35  OP_MakeRecord, 5
f050: 2c 20 30 2c 20 22 74 74 74 69 74 22 2c 20 50 33  , 0, "tttit", P3
f060: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
f070: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f080: 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20  , OP_PutIntKey, 
f090: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
f0a0: 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  TblName ){.     
f0b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f0c0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
f0d0: 20 70 54 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a   pTab->iDb, 0);.
f0e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f0f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
f100: 6e 52 65 61 64 2c 20 32 2c 20 70 54 61 62 2d 3e  nRead, 2, pTab->
f110: 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20  tnum);.      /* 
f120: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
f130: 22 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  "%s", pTab->zNam
f140: 65 29 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71  e)); */.      sq
f150: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f160: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
f170: 6e 73 2c 20 32 2c 20 70 54 61 62 2d 3e 6e 43 6f  ns, 2, pTab->nCo
f180: 6c 29 3b 0a 20 20 20 20 20 20 6c 62 6c 32 20 3d  l);.      lbl2 =
f190: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
f1a0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
f1b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f1c0: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 32  (v, OP_Rewind, 2
f1d0: 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 6c  , lbl2);.      l
f1e0: 62 6c 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  bl1 = sqlite3Vdb
f1f0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
f200: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65  .      sqlite3Ge
f210: 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 76  nerateIndexKey(v
f220: 2c 20 70 49 6e 64 65 78 2c 20 32 29 3b 0a 20 20  , pIndex, 2);.  
f230: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
f240: 70 33 28 76 2c 20 4f 50 5f 49 64 78 50 75 74 2c  p3(v, OP_IdxPut,
f250: 20 31 2c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72   1, pIndex->onEr
f260: 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 2c 0a 20 20  ror!=OE_None,.  
f270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f280: 20 20 20 20 22 69 6e 64 65 78 65 64 20 63 6f 6c      "indexed col
f290: 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69  umns are not uni
f2a0: 71 75 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29  que", P3_STATIC)
f2b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f2c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
f2d0: 65 78 74 2c 20 32 2c 20 6c 62 6c 31 29 3b 0a 20  ext, 2, lbl1);. 
f2e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f2f0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
f300: 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  lbl2);.      sql
f310: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f320: 20 4f 50 5f 43 6c 6f 73 65 2c 20 32 2c 20 30 29   OP_Close, 2, 0)
f330: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f340: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
f350: 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  lose, 1, 0);.   
f360: 20 7d 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e   }.    if( pTblN
f370: 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame!=0 ){.      
f380: 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20  if( !isTemp ){. 
f390: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68         sqlite3Ch
f3a0: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
f3b0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a  , iDb);.      }.
f3c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f3d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
f3e0: 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  se, 0, 0);.     
f3f0: 20 73 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65   sqlite3EndWrite
f400: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
f410: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
f420: 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f  /* Clean up befo
f430: 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78  re exiting */.ex
f440: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a  it_create_index:
f450: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
f460: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
f470: 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 53 72 63  .  /* sqlite3Src
f480: 4c 69 73 74 44 65 6c 65 74 65 28 70 54 61 62 6c  ListDelete(pTabl
f490: 65 29 3b 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46  e); */.  sqliteF
f4a0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  ree(zName);.  re
f4b0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
f4c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
f4d0: 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e   drop an existin
f4e0: 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20  g named index.  
f4f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
f500: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44  implements the D
f510: 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ROP INDEX statem
f520: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
f530: 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61  ite3DropIndex(Pa
f540: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
f550: 4c 69 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  List *pName){.  
f560: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
f570: 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
f580: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
f590: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  >db;..  if( pPar
f5a0: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
f5b0: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
f5c0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  d ) return;.  as
f5d0: 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
f5e0: 63 3d 3d 31 20 29 3b 0a 20 20 70 49 6e 64 65 78  c==1 );.  pIndex
f5f0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
f600: 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61  dex(db, pName->a
f610: 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  [0].zName, pName
f620: 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
f630: 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d  );.  if( pIndex=
f640: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
f650: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
f660: 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
f670: 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29  : %S", pName, 0)
f680: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
f690: 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
f6a0: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75    if( pIndex->au
f6b0: 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73  toIndex ){.    s
f6c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
f6d0: 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73  Parse, "index as
f6e0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e  sociated with UN
f6f0: 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72  IQUE ".      "or
f700: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
f710: 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62  straint cannot b
f720: 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a  e dropped", 0);.
f730: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
f740: 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 2f 2a  op_index;.  }./*
f750: 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69  .  if( pIndex->i
f760: 44 62 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  Db>1 ){.    sqli
f770: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
f780: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 61 6c 74 65  se, "cannot alte
f790: 72 20 73 63 68 65 6d 61 20 6f 66 20 61 74 74 61  r schema of atta
f7a0: 63 68 65 64 20 22 0a 20 20 20 20 20 20 20 22 64  ched ".       "d
f7b0: 61 74 61 62 61 73 65 73 22 2c 20 30 29 3b 0a 20  atabases", 0);. 
f7c0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
f7d0: 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 2a 2f 0a  p_index;.  }.*/.
f7e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f7f0: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
f800: 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
f810: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
f820: 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c  _INDEX;.    Tabl
f830: 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
f840: 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f  ->pTable;.    co
f850: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
f860: 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e  db->aDb[pIndex->
f870: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
f880: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
f890: 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
f8a0: 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20  pIndex->iDb);.  
f8b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
f8c0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
f8d0: 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54  QLITE_DELETE, zT
f8e0: 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  ab, 0, zDb) ){. 
f8f0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
f900: 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
f910: 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d  .    if( pIndex-
f920: 3e 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51  >iDb ) code = SQ
f930: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49  LITE_DROP_TEMP_I
f940: 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
f950: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
f960: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e  Parse, code, pIn
f970: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62  dex->zName, pTab
f980: 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
f990: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
f9a0: 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20  _drop_index;.   
f9b0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
f9c0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
f9d0: 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
f9e0: 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74  index and from t
f9f0: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
fa00: 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
fa10: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
fa20: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
fa30: 73 74 61 74 69 63 20 56 64 62 65 4f 70 4c 69 73  static VdbeOpLis
fa40: 74 20 64 72 6f 70 49 6e 64 65 78 5b 5d 20 3d 20  t dropIndex[] = 
fa50: 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77  {.      { OP_Rew
fa60: 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52  ind,     0, ADDR
fa70: 28 39 29 2c 20 30 7d 2c 20 0a 20 20 20 20 20 20  (9), 0}, .      
fa80: 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20  { OP_String8,   
fa90: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d    0, 0,       0}
faa0: 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20  , /* 1 */.      
fab0: 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20  { OP_MemStore,  
fac0: 20 31 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c   1, 1,       0},
fad0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c  .      { OP_MemL
fae0: 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20  oad,    1, 0,   
faf0: 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a      0}, /* 3 */.
fb00: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
fb10: 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20  n,     0, 1,    
fb20: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
fb30: 50 5f 45 71 2c 20 20 20 20 20 20 20 20 20 30 2c  P_Eq,         0,
fb40: 20 41 44 44 52 28 38 29 2c 20 30 7d 2c 0a 20 20   ADDR(8), 0},.  
fb50: 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20      { OP_Next,  
fb60: 20 20 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c       0, ADDR(3),
fb70: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
fb80: 47 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41  Goto,       0, A
fb90: 44 44 52 28 39 29 2c 20 30 7d 2c 0a 20 20 20 20  DDR(9), 0},.    
fba0: 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20    { OP_Delete,  
fbb0: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30     0, 0,       0
fbc0: 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 7d  }, /* 8 */.    }
fbd0: 3b 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a  ;.    int base;.
fbe0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
fbf0: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
fc00: 70 50 61 72 73 65 2c 20 30 2c 20 70 49 6e 64 65  pParse, 0, pInde
fc10: 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  x->iDb);.    sql
fc20: 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61  ite3OpenMasterTa
fc30: 62 6c 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 69  ble(v, pIndex->i
fc40: 44 62 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20  Db);.    base = 
fc50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fc60: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
fc70: 65 28 64 72 6f 70 49 6e 64 65 78 29 2c 20 64 72  e(dropIndex), dr
fc80: 6f 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71  opIndex);.    sq
fc90: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
fca0: 33 28 76 2c 20 62 61 73 65 2b 31 2c 20 70 49 6e  3(v, base+1, pIn
fcb0: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  dex->zName, 0);.
fcc0: 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
fcd0: 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb!=1 ){.      
fce0: 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
fcf0: 6b 69 65 28 64 62 2c 20 76 2c 20 70 49 6e 64 65  kie(db, v, pInde
fd00: 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 7d 0a 20  x->iDb);.    }. 
fd10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fd20: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
fd30: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
fd40: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
fd50: 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49 6e 64  OP_Destroy, pInd
fd60: 65 78 2d 3e 74 6e 75 6d 2c 20 70 49 6e 64 65 78  ex->tnum, pIndex
fd70: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  ->iDb);.    sqli
fd80: 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61  te3EndWriteOpera
fd90: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
fda0: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  }..  /* Delete t
fdb0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 65 73  he in-memory des
fdc0: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 69 73  cription of this
fdd0: 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69   index..  */.  i
fde0: 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  f( !pParse->expl
fdf0: 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ain ){.    sqlit
fe00: 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
fe10: 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  eIndex(db, pInde
fe20: 78 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  x);.    db->flag
fe30: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
fe40: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a  rnChanges;.  }..
fe50: 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a  exit_drop_index:
fe60: 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
fe70: 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a  tDelete(pName);.
fe80: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
fe90: 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
fea0: 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73   the given IdLis
feb0: 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
fec0: 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65   IdList if.** ne
fed0: 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ed be..**.** A n
fee0: 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74  ew IdList is ret
fef0: 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
ff00: 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
ff10: 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c  ..*/.IdList *sql
ff20: 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
ff30: 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
ff40: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
ff50: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
ff60: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
ff70: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
ff80: 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20  of(IdList) );.  
ff90: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
ffa0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
ffb0: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30  List->nAlloc = 0
ffc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
ffd0: 74 2d 3e 6e 49 64 3e 3d 70 4c 69 73 74 2d 3e 6e  t->nId>=pList->n
ffe0: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 73 74 72  Alloc ){.    str
fff0: 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20  uct IdList_item 
10000 2a 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e  *a;.    pList->n
10010 41 6c 6c 6f 63 20 3d 20 70 4c 69 73 74 2d 3e 6e  Alloc = pList->n
10020 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20 20 20  Alloc*2 + 5;.   
10030 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c   a = sqliteReall
10040 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69  oc(pList->a, pLi
10050 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f  st->nAlloc*sizeo
10060 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29  f(pList->a[0]) )
10070 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
10080 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
10090 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  dListDelete(pLis
100a0 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
100b0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c   0;.    }.    pL
100c0 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a  ist->a = a;.  }.
100d0 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d    memset(&pList-
100e0 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20  >a[pList->nId], 
100f0 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  0, sizeof(pList-
10100 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70  >a[0]));.  if( p
10110 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68 61  Token ){.    cha
10120 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d  r **pz = &pList-
10130 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a  >a[pList->nId].z
10140 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Name;.    sqlite
10150 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20  3SetNString(pz, 
10160 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65  pToken->z, pToke
10170 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66  n->n, 0);.    if
10180 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  ( *pz==0 ){.    
10190 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
101a0 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
101b0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
101c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
101d0 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 2a 70  qlite3Dequote(*p
101e0 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  z);.    }.  }.  
101f0 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20  pList->nId++;.  
10200 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
10210 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
10220 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  new table name t
10230 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  o the given SrcL
10240 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
10250 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a  ew SrcList if.**
10260 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77   need be.  A new
10270 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65   entry is create
10280 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  d in the SrcList
10290 20 65 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20   even if pToken 
102a0 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41  is NULL..**.** A
102b0 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 73 20   new SrcList is 
102c0 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
102d0 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  L if malloc() fa
102e0 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  ils..**.** If pD
102f0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e  atabase is not n
10300 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ull, it means th
10310 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  at the table has
10320 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20   an optional.** 
10330 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72  database name pr
10340 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73  efix.  Like this
10350 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62  :  "database.tab
10360 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62  le".  The pDatab
10370 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  ase.** points to
10380 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
10390 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70  and the pTable p
103a0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74  oints to the dat
103b0 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54  abase name..** T
103c0 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  he SrcList.a[].z
103d0 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69  Name field is fi
103e0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61  lled with the ta
103f0 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d  ble name which m
10400 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f  ight.** come fro
10410 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61  m pTable (if pDa
10420 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20  tabase is NULL) 
10430 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73  or from pDatabas
10440 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e  e.  .** SrcList.
10450 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73  a[].zDatabase is
10460 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
10470 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66   database name f
10480 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f  rom pTable,.** o
10490 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e  r with NULL if n
104a0 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70  o database is sp
104b0 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ecified..**.** I
104c0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
104d0 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73  f call like this
104e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
104f0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
10500 70 65 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a  pend(A,B,0);.**.
10510 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74  ** Then B is a t
10520 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
10530 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
10540 69 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20  is unspecified. 
10550 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69   If called.** li
10560 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
10570 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
10580 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c  cListAppend(A,B,
10590 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43  C);.**.** Then C
105a0 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61   is the table na
105b0 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20  me and B is the 
105c0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
105d0 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
105e0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
105f0 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  SrcList *pList, 
10600 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54  Token *pTable, T
10610 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 29  oken *pDatabase)
10620 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  {.  if( pList==0
10630 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
10640 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
10650 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b  zeof(SrcList) );
10660 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
10670 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
10680 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
10690 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 1;.  }.  if( p
106a0 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73  List->nSrc>=pLis
106b0 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  t->nAlloc ){.   
106c0 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
106d0 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
106e0 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65 77  c *= 2;.    pNew
106f0 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
10700 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20 20 20  (pList,.        
10710 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70         sizeof(*p
10720 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74 2d 3e  List) + (pList->
10730 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66  nAlloc-1)*sizeof
10740 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b  (pList->a[0]) );
10750 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
10760 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10770 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
10780 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
10790 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
107a0 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20   pList = pNew;. 
107b0 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c 69   }.  memset(&pLi
107c0 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
107d0 63 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c  c], 0, sizeof(pL
107e0 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69  ist->a[0]));.  i
107f0 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20  f( pDatabase && 
10800 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20  pDatabase->z==0 
10810 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  ){.    pDatabase
10820 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
10830 70 44 61 74 61 62 61 73 65 20 26 26 20 70 54 61  pDatabase && pTa
10840 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e  ble ){.    Token
10850 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62   *pTemp = pDatab
10860 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61  ase;.    pDataba
10870 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20  se = pTable;.   
10880 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b   pTable = pTemp;
10890 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 6c  .  }.  if( pTabl
108a0 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a  e ){.    char **
108b0 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  pz = &pList->a[p
108c0 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a 4e 61 6d  List->nSrc].zNam
108d0 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  e;.    sqlite3Se
108e0 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 54 61  tNString(pz, pTa
108f0 62 6c 65 2d 3e 7a 2c 20 70 54 61 62 6c 65 2d 3e  ble->z, pTable->
10900 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a  n, 0);.    if( *
10910 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  pz==0 ){.      s
10920 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
10930 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
10940 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
10950 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
10960 69 74 65 33 44 65 71 75 6f 74 65 28 2a 70 7a 29  ite3Dequote(*pz)
10970 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
10980 28 20 70 44 61 74 61 62 61 73 65 20 29 7b 0a 20  ( pDatabase ){. 
10990 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26     char **pz = &
109a0 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
109b0 6e 53 72 63 5d 2e 7a 44 61 74 61 62 61 73 65 3b  nSrc].zDatabase;
109c0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e  .    sqlite3SetN
109d0 53 74 72 69 6e 67 28 70 7a 2c 20 70 44 61 74 61  String(pz, pData
109e0 62 61 73 65 2d 3e 7a 2c 20 70 44 61 74 61 62 61  base->z, pDataba
109f0 73 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69  se->n, 0);.    i
10a00 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20  f( *pz==0 ){.   
10a10 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
10a20 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
10a30 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
10a40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10a50 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
10a60 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  *pz);.    }.  }.
10a70 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74    pList->a[pList
10a80 2d 3e 6e 53 72 63 5d 2e 69 43 75 72 73 6f 72 20  ->nSrc].iCursor 
10a90 3d 20 2d 31 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e  = -1;.  pList->n
10aa0 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  Src++;.  return 
10ab0 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
10ac0 41 73 73 69 67 6e 20 63 75 72 73 6f 72 73 20 74  Assign cursors t
10ad0 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  o all tables in 
10ae0 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69  a SrcList.*/.voi
10af0 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
10b00 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61  AssignCursors(Pa
10b10 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
10b20 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
10b30 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
10b40 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
10b50 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
10b60 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
10b70 6f 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  or<0 ){.      pL
10b80 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
10b90 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
10ba0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ++;.    }.  }.}.
10bb0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61 6c  ./*.** Add an al
10bc0 69 61 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ias to the last 
10bd0 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 20 74 68  identifier on th
10be0 65 20 67 69 76 65 6e 20 69 64 65 6e 74 69 66 69  e given identifi
10bf0 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  er list..*/.void
10c00 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
10c10 64 64 41 6c 69 61 73 28 53 72 63 4c 69 73 74 20  ddAlias(SrcList 
10c20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
10c30 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c  Token){.  if( pL
10c40 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 53  ist && pList->nS
10c50 72 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  rc>0 ){.    int 
10c60 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20  i = pList->nSrc 
10c70 2d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  - 1;.    sqlite3
10c80 53 65 74 4e 53 74 72 69 6e 67 28 26 70 4c 69 73  SetNString(&pLis
10c90 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20  t->a[i].zAlias, 
10ca0 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65  pToken->z, pToke
10cb0 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71  n->n, 0);.    sq
10cc0 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 4c 69  lite3Dequote(pLi
10cd0 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29  st->a[i].zAlias)
10ce0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
10cf0 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e  elete an IdList.
10d00 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
10d10 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64 4c  IdListDelete(IdL
10d20 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
10d30 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
10d40 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
10d50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
10d60 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
10d70 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
10d80 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
10d90 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
10da0 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  e(pList->a);.  s
10db0 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 29  qliteFree(pList)
10dc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
10dd0 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70  n the index in p
10de0 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e  List of the iden
10df0 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64  tifier named zId
10e00 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20  .  Return -1.** 
10e10 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
10e20 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69  .int sqlite3IdLi
10e30 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a  stIndex(IdList *
10e40 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61  pList, const cha
10e50 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
10e60 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
10e70 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  =0 ) return -1;.
10e80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
10e90 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
10ea0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
10eb0 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
10ec0 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d  ].zName, zName)=
10ed0 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
10ee0 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
10ef0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
10f00 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73  an entire SrcLis
10f10 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20  t including all 
10f20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65  its substructure
10f30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10f40 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53  3SrcListDelete(S
10f50 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
10f60 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
10f70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
10f80 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
10f90 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
10fa0 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
10fb0 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 44 61  (pList->a[i].zDa
10fc0 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c  tabase);.    sql
10fd0 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
10fe0 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
10ff0 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
11000 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a  ->a[i].zAlias);.
11010 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
11020 5b 69 5d 2e 70 54 61 62 20 26 26 20 70 4c 69 73  [i].pTab && pLis
11030 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d 3e 69 73  t->a[i].pTab->is
11040 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20  Transient ){.   
11050 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
11060 54 61 62 6c 65 28 30 2c 20 70 4c 69 73 74 2d 3e  Table(0, pList->
11070 61 5b 69 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20  a[i].pTab);.    
11080 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  }.    sqlite3Sel
11090 65 63 74 44 65 6c 65 74 65 28 70 4c 69 73 74 2d  ectDelete(pList-
110a0 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a  >a[i].pSelect);.
110b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
110c0 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  elete(pList->a[i
110d0 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ].pOn);.    sqli
110e0 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
110f0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 55 73 69  pList->a[i].pUsi
11100 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ng);.  }.  sqlit
11110 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  eFree(pList);.}.
11120 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74  ./*.** Begin a t
11130 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
11140 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54  id sqlite3BeginT
11150 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
11160 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
11170 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  ite *db;.  Vdbe 
11180 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  *v;..  if( pPars
11190 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
111a0 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
111b0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
111c0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
111d0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
111e0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
111f0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
11200 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
11210 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
11220 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
11230 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30  N, "BEGIN", 0, 0
11240 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76  ) ) return;..  v
11250 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
11260 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
11270 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !v ) return;.  
11280 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11290 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
112a0 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  t, 0, 0);.}../*.
112b0 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e  ** Commit a tran
112c0 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
112d0 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61  sqlite3CommitTra
112e0 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
112f0 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
11300 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e *db;.  Vdbe *v
11310 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
11320 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
11330 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
11340 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
11350 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
11360 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
11370 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
11380 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
11390 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
113a0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
113b0 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
113c0 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29   "COMMIT", 0, 0)
113d0 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20   ) return;..  v 
113e0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
113f0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
11400 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
11410 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11420 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30  AutoCommit, 1, 0
11430 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
11440 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  Rollback a trans
11450 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
11460 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72  qlite3RollbackTr
11470 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
11480 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
11490 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  te *db;.  Vdbe *
114a0 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  v;..  if( pParse
114b0 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
114c0 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
114d0 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
114e0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
114f0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
11500 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
11510 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
11520 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
11530 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
11540 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
11550 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c  , "ROLLBACK", 0,
11560 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   0) ) return;.. 
11570 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
11580 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
11590 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
115a0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
115b0 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
115c0 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
115d0 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
115e0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
115f0 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d  verify the schem
11600 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61  a cookie and sta
11610 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61  rt.** a read-tra
11620 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c  nsaction for all
11630 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
11640 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  files..**.** It 
11650 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  is important tha
11660 74 20 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f  t all schema coo
11670 6b 69 65 73 20 62 65 20 76 65 72 69 66 69 65 64  kies be verified
11680 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64   and all.** read
11690 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65   transactions be
116a0 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
116b0 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61  anything else ha
116c0 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ppens in.** the 
116d0 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42  VDBE program.  B
116e0 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ut this routine 
116f0 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66  can be called af
11700 74 65 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a  ter much other.*
11710 2a 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20  * code has been 
11720 67 65 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68  generated.  So h
11730 65 72 65 20 69 73 20 77 68 61 74 20 77 65 20 64  ere is what we d
11740 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  o:.**.** The fir
11750 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75  st time this rou
11760 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
11770 77 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f  we code an OP_Go
11780 73 75 62 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c  sub that.** will
11790 20 6a 75 6d 70 20 74 6f 20 61 20 73 75 62 72 6f   jump to a subro
117a0 75 74 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64  utine at the end
117b0 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   of the program.
117c0 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63    Then we.** rec
117d0 6f 72 64 20 65 76 65 72 79 20 64 61 74 61 62 61  ord every databa
117e0 73 65 20 74 68 61 74 20 6e 65 65 64 73 20 69 74  se that needs it
117f0 73 20 73 63 68 65 6d 61 20 76 65 72 69 66 69 65  s schema verifie
11800 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72  d in the.** pPar
11810 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66  se->cookieMask f
11820 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61 66  ield.  Later, af
11830 74 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f  ter all other co
11840 64 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67  de has been.** g
11850 65 6e 65 72 61 74 65 64 2c 20 74 68 65 20 73 75  enerated, the su
11860 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f  broutine that do
11870 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65  es the cookie ve
11880 72 69 66 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a  rifications and.
11890 2a 2a 20 73 74 61 72 74 73 20 74 68 65 20 74 72  ** starts the tr
118a0 61 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20  ansactions will 
118b0 62 65 20 63 6f 64 65 64 20 61 6e 64 20 74 68 65  be coded and the
118c0 20 4f 50 5f 47 6f 73 75 62 20 50 32 20 76 61 6c   OP_Gosub P2 val
118d0 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61  ue.** will be ma
118e0 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  de to point to t
118f0 68 61 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  hat subroutine. 
11900 20 54 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20   The generation 
11910 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65  of the.** cookie
11920 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75   verification su
11930 62 72 6f 75 74 69 6e 65 20 63 6f 64 65 20 68 61  broutine code ha
11940 70 70 65 6e 73 20 69 6e 20 73 71 6c 69 74 65 33  ppens in sqlite3
11950 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
11960 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
11970 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
11980 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
11990 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74  nt iDb){.  sqlit
119a0 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e *db;.  Vdbe *v
119b0 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20  ;.  int mask;.. 
119c0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
119d0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
119e0 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
119f0 3b 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20  ;  /* This only 
11a00 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 72 65  happens if there
11a10 20 77 61 73 20 61 20 70 72 69 6f 72 20 65 72 72   was a prior err
11a20 6f 72 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  or */.  db = pPa
11a30 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
11a40 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
11a50 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
11a60 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44  sert( db->aDb[iD
11a70 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62  b].pBt!=0 || iDb
11a80 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
11a90 20 69 44 62 3c 33 32 20 29 3b 0a 20 20 69 66 28   iDb<32 );.  if(
11aa0 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
11ab0 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50  ask==0 ){.    pP
11ac0 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  arse->cookieGoto
11ad0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
11ae0 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
11af0 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 6d 61 73  0, 0);.  }.  mas
11b00 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66  k = 1<<iDb;.  if
11b10 28 20 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  ( (pParse->cooki
11b20 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  eMask & mask)==0
11b30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
11b40 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61  cookieMask |= ma
11b50 73 6b 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  sk;.    pParse->
11b60 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d  cookieValue[iDb]
11b70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
11b80 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20  schema_cookie;. 
11b90 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
11ba0 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
11bb0 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72  hat prepares for
11bc0 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74   doing an operat
11bd0 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  ion that.** migh
11be0 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74  t change the dat
11bf0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abase..**.** Thi
11c00 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
11c10 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
11c20 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  on if we are not
11c30 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a   already within.
11c40 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
11c50 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72  .  If we are alr
11c60 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72  eady within a tr
11c70 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
11c80 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20  a checkpoint.** 
11c90 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65  is set if the se
11ca0 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d  tStatement param
11cb0 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41  eter is true.  A
11cc0 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
11cd0 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72  ld.** be set for
11ce0 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74   operations that
11cf0 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65   might fail (due
11d00 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   to a constraint
11d10 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  ) part of.** the
11d20 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64   way through and
11d30 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64   which will need
11d40 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72   to undo some wr
11d50 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76  ites without hav
11d60 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61  ing to.** rollba
11d70 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  ck the whole tra
11d80 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f  nsaction.  For o
11d90 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20  perations where 
11da0 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
11db0 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65  ** can be checke
11dc0 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  d before any cha
11dd0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
11de0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
11df0 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65  t is never.** ne
11e00 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
11e10 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20  a write and the 
11e20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
11e30 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a  d not be set..**
11e40 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73  .** Only databas
11e50 65 20 69 44 62 20 61 6e 64 20 74 68 65 20 74 65  e iDb and the te
11e60 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20  mp database are 
11e70 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 62 79  made writable by
11e80 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49   this call..** I
11e90 66 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74  f iDb==0, then t
11ea0 68 65 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70  he main and temp
11eb0 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 6d   databases are m
11ec0 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20  ade writable.   
11ed0 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65  If.** iDb==1 the
11ee0 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20  n only the temp 
11ef0 64 61 74 61 62 61 73 65 20 69 73 20 6d 61 64 65  database is made
11f00 20 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69   writable.  If i
11f10 44 62 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a  Db>1 then the.**
11f20 20 73 70 65 63 69 66 69 65 64 20 61 75 78 69 6c   specified auxil
11f30 69 61 72 79 20 64 61 74 61 62 61 73 65 20 61 6e  iary database an
11f40 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  d the temp datab
11f50 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69  ase are made wri
11f60 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
11f70 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
11f80 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
11f90 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74  *pParse, int set
11fa0 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69  Statement, int i
11fb0 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  Db){.  sqlite *d
11fc0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
11fd0 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
11fe0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
11ff0 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
12000 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
12010 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
12020 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
12030 0a 20 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65  .  pParse->write
12040 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a  Mask |= 1<<iDb;.
12050 20 20 69 66 28 20 73 65 74 53 74 61 74 65 6d 65    if( setStateme
12060 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nt ){.    sqlite
12070 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
12080 5f 53 74 61 74 65 6d 65 6e 74 2c 20 69 44 62 2c  _Statement, iDb,
12090 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69   0);.  }.  if( i
120a0 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c  Db!=1 ){.    sql
120b0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
120c0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
120d0 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 31 29  setStatement, 1)
120e0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
120f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
12100 74 20 63 6f 6e 63 6c 75 64 65 73 20 61 6e 20 6f  t concludes an o
12110 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20 6d 61  peration that ma
12120 79 20 68 61 76 65 20 63 68 61 6e 67 65 64 0a 2a  y have changed.*
12130 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  * the database. 
12140 20 49 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   If a statement 
12150 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
12160 73 74 61 72 74 65 64 2c 20 74 68 65 6e 20 65 6d  started, then em
12170 69 74 0a 2a 2a 20 61 6e 20 4f 50 5f 43 6f 6d 6d  it.** an OP_Comm
12180 69 74 20 74 68 61 74 20 77 69 6c 6c 20 63 61 75  it that will cau
12190 73 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 74  se the changes t
121a0 6f 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 74  o be committed t
121b0 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  o disk..**.** No
121c0 74 65 20 74 68 61 74 20 63 68 65 63 6b 70 6f 69  te that checkpoi
121d0 6e 74 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69  nts are automati
121e0 63 61 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 20  cally committed 
121f0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a  at the end of.**
12200 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4e   a statement.  N
12210 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 74 68  ote also that th
12220 65 72 65 20 63 61 6e 20 62 65 20 6d 75 6c 74 69  ere can be multi
12230 70 6c 65 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a  ple calls to .**
12240 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
12250 74 65 4f 70 65 72 61 74 69 6f 6e 28 29 20 62 75  teOperation() bu
12260 74 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 6f  t there should o
12270 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65 0a  nly be a single.
12280 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ** call to sqlit
12290 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  e3EndWriteOperat
122a0 69 6f 6e 28 29 20 61 74 20 74 68 65 20 63 6f 6e  ion() at the con
122b0 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 73  clusion of the s
122c0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
122d0 64 20 73 71 6c 69 74 65 33 45 6e 64 57 72 69 74  d sqlite3EndWrit
122e0 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65  eOperation(Parse
122f0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 2f 2a 20   *pParse){.  /* 
12300 44 65 6c 65 74 65 20 6d 65 21 20 2a 2f 0a 20 20  Delete me! */.  
12310 72 65 74 75 72 6e 3b 0a 7d 0a                    return;.}.