/ Hex Artifact Content
Login

Artifact 8d9965b3ce5dcc1bd4dac60bd0f14524fea269cb:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 20 20    ROLLBACK.**   
02d0: 20 20 50 52 41 47 4d 41 0a 2a 2a 0a 2a 2a 20 24    PRAGMA.**.** $
02e0: 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20 31 2e  Id: build.c,v 1.
02f0: 31 37 39 20 32 30 30 34 2f 30 35 2f 31 30 20 31  179 2004/05/10 1
0300: 30 3a 33 34 3a 33 35 20 64 61 6e 69 65 6c 6b 31  0:34:35 danielk1
0310: 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e  977 Exp $.*/.#in
0320: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74  clude "sqliteInt
0330: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74  .h".#include <ct
0340: 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68  ype.h>../*.** Th
0350: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
0360: 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20  lled when a new 
0370: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73  SQL statement is
0380: 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a   beginning to.**
0390: 20 62 65 20 70 61 72 73 65 64 2e 20 20 43 68 65   be parsed.  Che
03a0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
03b0: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20   schema for the 
03c0: 64 61 74 61 62 61 73 65 20 6e 65 65 64 73 0a 2a  database needs.*
03d0: 2a 20 74 6f 20 62 65 20 72 65 61 64 20 66 72 6f  * to be read fro
03e0: 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  m the SQLITE_MAS
03f0: 54 45 52 20 61 6e 64 20 53 51 4c 49 54 45 5f 54  TER and SQLITE_T
0400: 45 4d 50 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  EMP_MASTER table
0410: 73 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73  s..** If it does
0420: 2c 20 74 68 65 6e 20 72 65 61 64 20 69 74 2e 0a  , then read it..
0430: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
0440: 65 67 69 6e 50 61 72 73 65 28 50 61 72 73 65 20  eginParse(Parse 
0450: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 78 70  *pParse, int exp
0460: 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 73 71 6c  lainFlag){.  sql
0470: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
0480: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
0490: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
04a0: 20 3d 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a   = explainFlag;.
04b0: 20 20 69 66 28 28 64 62 2d 3e 66 6c 61 67 73 20    if((db->flags 
04c0: 26 20 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c  & SQLITE_Initial
04d0: 69 7a 65 64 29 3d 3d 30 20 26 26 20 64 62 2d 3e  ized)==0 && db->
04e0: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
04f0: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
0500: 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26 70 50  ite3Init(db, &pP
0510: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  arse->zErrMsg);.
0520: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
0530: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
0540: 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a  Parse->rc = rc;.
0550: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
0560: 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rr++;.    }.  }.
0570: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
0580: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
0590: 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
05a0: 64 62 2c 20 69 2c 20 44 42 5f 4c 6f 63 6b 65 64  db, i, DB_Locked
05b0: 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  );.    if( !db->
05c0: 61 44 62 5b 69 5d 2e 69 6e 54 72 61 6e 73 20 29  aDb[i].inTrans )
05d0: 7b 0a 20 20 20 20 20 20 44 62 43 6c 65 61 72 50  {.      DbClearP
05e0: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44  roperty(db, i, D
05f0: 42 5f 43 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 7d  B_Cookie);.    }
0600: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
0610: 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Var = 0;.}../*.*
0620: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
0630: 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61  s called after a
0640: 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61 74   single SQL stat
0650: 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a  ement has been.*
0660: 2a 20 70 61 72 73 65 64 20 61 6e 64 20 77 65 20  * parsed and we 
0670: 77 61 6e 74 20 74 6f 20 65 78 65 63 75 74 65 20  want to execute 
0680: 74 68 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f  the VDBE code to
0690: 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 74   implement .** t
06a0: 68 61 74 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  hat statement.  
06b0: 50 72 69 6f 72 20 61 63 74 69 6f 6e 20 72 6f 75  Prior action rou
06c0: 74 69 6e 65 73 20 73 68 6f 75 6c 64 20 68 61 76  tines should hav
06d0: 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 63 6f 6e  e already.** con
06e0: 73 74 72 75 63 74 65 64 20 56 44 42 45 20 63 6f  structed VDBE co
06f0: 64 65 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  de to do the wor
0700: 6b 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61  k of the SQL sta
0710: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20  tement..** This 
0720: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61 73  routine just has
0730: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
0740: 56 44 42 45 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  VDBE code..**.**
0750: 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61 6e   Note that if an
0760: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
0770: 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68 65   it might be the
0780: 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f   case that.** no
0790: 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20 67   VDBE code was g
07a0: 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  enerated..*/.voi
07b0: 64 20 73 71 6c 69 74 65 33 45 78 65 63 28 50 61  d sqlite3Exec(Pa
07c0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
07d0: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
07e0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
07f0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
0800: 62 65 3b 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20  be;..  if( v==0 
0810: 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47  && (v = sqlite3G
0820: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21  etVdbe(pParse))!
0830: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
0840: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
0850: 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20  _Halt, 0, 0);.  
0860: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  }.  if( sqlite3_
0870: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
0880: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 76 20  return;.  if( v 
0890: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
08a0: 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a  =0 ){.    FILE *
08b0: 74 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61  trace = (db->fla
08c0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
08d0: 54 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f  Trace)!=0 ? stdo
08e0: 75 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69  ut : 0;.    sqli
08f0: 74 65 33 56 64 62 65 54 72 61 63 65 28 76 2c 20  te3VdbeTrace(v, 
0900: 74 72 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69  trace);.    sqli
0910: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
0920: 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  (v, pParse->nVar
0930: 2c 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  , pParse->explai
0940: 6e 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  n);.    pParse->
0950: 72 63 20 3d 20 70 50 61 72 73 65 2d 3e 6e 45 72  rc = pParse->nEr
0960: 72 20 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  r ? SQLITE_ERROR
0970: 20 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   : SQLITE_DONE;.
0980: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e      pParse->colN
0990: 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d  amesSet = 0;.  }
09a0: 65 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d  else if( pParse-
09b0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
09c0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  {.    pParse->rc
09d0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
09e0: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
09f0: 54 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Tab = 0;.  pPars
0a00: 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70  e->nMem = 0;.  p
0a10: 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b  Parse->nSet = 0;
0a20: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20  .  pParse->nAgg 
0a30: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
0a40: 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Var = 0;.}../*.*
0a50: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
0a60: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
0a70: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
0a80: 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72  .** a particular
0a90: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
0aa0: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 0a 2a  given the name.*
0ab0: 2a 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20  * of that table 
0ac0: 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
0ad0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
0ae0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
0af0: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
0b00: 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
0b10: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
0b20: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
0b30: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
0b40: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
0b50: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
0b60: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
0b70: 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20   matching table 
0b80: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
0b90: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
0ba0: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
0bb0: 65 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  e names is done.
0bc0: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
0bd0: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
0be0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
0bf0: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
0c00: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
0c10: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
0c20: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
0c30: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
0c40: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
0c50: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
0c60: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
0c70: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e  (sqlite *db, con
0c80: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
0c90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
0ca0: 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20  abase){.  Table 
0cb0: 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  *p = 0;.  int i;
0cc0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
0cd0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
0ce0: 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f   int j = (i<2) ?
0cf0: 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53   i^1 : i;   /* S
0d00: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
0d10: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66  e MAIN */.    if
0d20: 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26  ( zDatabase!=0 &
0d30: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
0d40: 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e  (zDatabase, db->
0d50: 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20  aDb[j].zName) ) 
0d60: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20  continue;.    p 
0d70: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
0d80: 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62  d(&db->aDb[j].tb
0d90: 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74  lHash, zName, st
0da0: 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a  rlen(zName)+1);.
0db0: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
0dc0: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
0dd0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
0de0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
0df0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
0e00: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
0e10: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
0e20: 61 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ase table given 
0e30: 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74  the name.** of t
0e40: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f  hat table and (o
0e50: 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e  ptionally) the n
0e60: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
0e70: 61 73 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e  ase.** containin
0e80: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  g the table.  Re
0e90: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
0ea0: 20 66 6f 75 6e 64 2e 0a 2a 2a 20 41 6c 73 6f 20   found..** Also 
0eb0: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
0ec0: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
0ed0: 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
0ee0: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
0ef0: 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
0f00: 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33  tine and sqlite3
0f10: 46 69 6e 64 54 61 62 6c 65 28 29 0a 2a 2a 20 69  FindTable().** i
0f20: 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  s that this rout
0f30: 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72  ine leaves an er
0f40: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
0f50: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 0a 2a  Parse->zErrMsg.*
0f60: 2a 20 77 68 65 72 65 20 73 71 6c 69 74 65 33 46  * where sqlite3F
0f70: 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20  indTable() does 
0f80: 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  not..*/.Table *s
0f90: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
0fa0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
0fb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
0fc0: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
0fd0: 7a 44 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  zDbase){.  Table
0fe0: 20 2a 70 3b 0a 0a 20 20 70 20 3d 20 73 71 6c 69   *p;..  p = sqli
0ff0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61  te3FindTable(pPa
1000: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  rse->db, zName, 
1010: 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  zDbase);.  if( p
1020: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  ==0 ){.    if( z
1030: 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73  Dbase ){.      s
1040: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1050: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
1060: 74 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20 7a  table: %s.%s", z
1070: 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  Dbase, zName);. 
1080: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
1090: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50  ite3FindTable(pP
10a0: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  arse->db, zName,
10b0: 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)!=0 ){.      
10c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
10d0: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 5c  pParse, "table \
10e0: 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 69 6e 20  "%s\" is not in 
10f0: 64 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22 22  database \"%s\""
1100: 2c 0a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  ,.         zName
1110: 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 20 20 7d  , zDbase);.    }
1120: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
1130: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1140: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  se, "no such tab
1150: 6c 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  le: %s", zName);
1160: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1170: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
1180: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
1190: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
11a0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a  hat describes .*
11b0: 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  * a particular i
11c0: 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e  ndex given the n
11d0: 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65  ame of that inde
11e0: 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d  x.** and the nam
11f0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1200: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
1210: 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65  the index..** Re
1220: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
1230: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
1240: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
1250: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
1260: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
1270: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64  the.** table and
1280: 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
1290: 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65 74  ing index is ret
12a0: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
12b0: 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c  king.** for dupl
12c0: 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65  icate index name
12d0: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
12e0: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
12f0: 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20  .** TEMP first, 
1300: 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20  then MAIN, then 
1310: 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61  any auxiliary da
1320: 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a  tabases added.**
1330: 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43   using the ATTAC
1340: 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e  H command..*/.In
1350: 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  dex *sqlite3Find
1360: 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62  Index(sqlite *db
1370: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
1380: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
1390: 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a  *zDb){.  Index *
13a0: 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  p = 0;.  int i;.
13b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
13c0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
13d0: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
13e0: 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61  i^1 : i;  /* Sea
13f0: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
1400: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  MAIN */.    if( 
1410: 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33 53 74  zDb && sqlite3St
1420: 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61  rICmp(zDb, db->a
1430: 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63  Db[j].zName) ) c
1440: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d  ontinue;.    p =
1450: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
1460: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 69 64 78  (&db->aDb[j].idx
1470: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  Hash, zName, str
1480: 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20  len(zName)+1);. 
1490: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
14a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
14b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
14c0: 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65  e the given inde
14d0: 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  x from the index
14e0: 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64   hash table, and
14f0: 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d   free.** its mem
1500: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a  ory structures..
1510: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  **.** The index 
1520: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
1530: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
1540: 68 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20  h tables but.** 
1550: 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b  it is not unlink
1560: 65 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c  ed from the Tabl
1570: 65 20 74 68 61 74 20 69 74 20 69 6e 64 65 78 65  e that it indexe
1580: 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20  s..** Unlinking 
1590: 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d  from the Table m
15a0: 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74  ust be done by t
15b0: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
15c0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
15d0: 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65  oid sqliteDelete
15e0: 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62  Index(sqlite *db
15f0: 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49  , Index *p){.  I
1600: 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 0a 20 20 61  ndex *pOld;..  a
1610: 73 73 65 72 74 28 20 64 62 21 3d 30 20 26 26 20  ssert( db!=0 && 
1620: 70 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20  p->zName!=0 );. 
1630: 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48   pOld = sqlite3H
1640: 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61  ashInsert(&db->a
1650: 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61  Db[p->iDb].idxHa
1660: 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  sh, p->zName,.  
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e 28 70          strlen(p
1690: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a  ->zName)+1, 0);.
16a0: 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 26 26    if( pOld!=0 &&
16b0: 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20   pOld!=p ){.    
16c0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
16d0: 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44  t(&db->aDb[p->iD
16e0: 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 4f 6c 64  b].idxHash, pOld
16f0: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
1710: 72 6c 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65  rlen(pOld->zName
1720: 29 2b 31 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d 0a  )+1, pOld);.  }.
1730: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
1740: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
1750: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
1760: 20 66 72 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c   from its table,
1770: 20 74 68 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20   then remove.** 
1780: 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  the index from t
1790: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
17a0: 62 6c 65 20 61 6e 64 20 66 72 65 65 20 69 74 73  ble and free its
17b0: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63   memory.** struc
17c0: 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tures..*/.void s
17d0: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
17e0: 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74  eleteIndex(sqlit
17f0: 65 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49  e *db, Index *pI
1800: 6e 64 65 78 29 7b 0a 20 20 69 66 28 20 70 49 6e  ndex){.  if( pIn
1810: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
1820: 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20  dex==pIndex ){. 
1830: 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c     pIndex->pTabl
1840: 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  e->pIndex = pInd
1850: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c  ex->pNext;.  }el
1860: 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  se{.    Index *p
1870: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 49 6e 64  ;.    for(p=pInd
1880: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
1890: 65 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65 78  ex; p && p->pNex
18a0: 74 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e  t!=pIndex; p=p->
18b0: 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 69 66 28  pNext){}.    if(
18c0: 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d   p && p->pNext==
18d0: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
18e0: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  p->pNext = pInde
18f0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  x->pNext;.    }.
1900: 20 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 6c 65    }.  sqliteDele
1910: 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  teIndex(db, pInd
1920: 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  ex);.}../*.** Er
1930: 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69  ase all schema i
1940: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
1950: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
1960: 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20  sh tables of.** 
1970: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1980: 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ion.  This routi
1990: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
19a0: 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a  reclaim memory.*
19b0: 2a 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f 6e  * before the con
19c0: 6e 65 63 74 69 6f 6e 20 63 6c 6f 73 65 73 2e 20  nection closes. 
19d0: 20 49 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c   It is also call
19e0: 65 64 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ed during a roll
19f0: 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65  back.** if there
1a00: 20 77 65 72 65 20 73 63 68 65 6d 61 20 63 68 61   were schema cha
1a10: 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65 20  nges during the 
1a20: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1a30: 2a 2a 20 49 66 20 69 44 62 3c 3d 30 20 74 68 65  ** If iDb<=0 the
1a40: 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65  n reset the inte
1a50: 72 6e 61 6c 20 73 63 68 65 6d 61 20 74 61 62 6c  rnal schema tabl
1a60: 65 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  es for all datab
1a70: 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20 49  ase.** files.  I
1a80: 66 20 69 44 62 3e 3d 32 20 74 68 65 6e 20 72 65  f iDb>=2 then re
1a90: 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  set the internal
1aa0: 20 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c 79   schema for only
1ab0: 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 66   the.** single f
1ac0: 69 6c 65 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a  ile indicated..*
1ad0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
1ae0: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
1af0: 61 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 69 6e  a(sqlite *db, in
1b00: 74 20 69 44 62 29 7b 0a 20 20 48 61 73 68 45 6c  t iDb){.  HashEl
1b10: 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73  em *pElem;.  Has
1b20: 68 20 74 65 6d 70 31 3b 0a 20 20 48 61 73 68 20  h temp1;.  Hash 
1b30: 74 65 6d 70 32 3b 0a 20 20 69 6e 74 20 69 2c 20  temp2;.  int i, 
1b40: 6a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44  j;..  assert( iD
1b50: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
1b60: 6e 44 62 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  nDb );.  db->fla
1b70: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
1b80: 69 74 69 61 6c 69 7a 65 64 3b 0a 20 20 66 6f 72  itialized;.  for
1b90: 28 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44  (i=iDb; i<db->nD
1ba0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20  b; i++){.    Db 
1bb0: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
1bc0: 69 5d 3b 0a 20 20 20 20 74 65 6d 70 31 20 3d 20  i];.    temp1 = 
1bd0: 70 44 62 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20  pDb->tblHash;.  
1be0: 20 20 74 65 6d 70 32 20 3d 20 70 44 62 2d 3e 74    temp2 = pDb->t
1bf0: 72 69 67 48 61 73 68 3b 0a 20 20 20 20 73 71 6c  rigHash;.    sql
1c00: 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 70 44  ite3HashInit(&pD
1c10: 62 2d 3e 74 72 69 67 48 61 73 68 2c 20 53 51 4c  b->trigHash, SQL
1c20: 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c  ITE_HASH_STRING,
1c30: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1c40: 48 61 73 68 43 6c 65 61 72 28 26 70 44 62 2d 3e  HashClear(&pDb->
1c50: 61 46 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69  aFKey);.    sqli
1c60: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 70 44  te3HashClear(&pD
1c70: 62 2d 3e 69 64 78 48 61 73 68 29 3b 0a 20 20 20  b->idxHash);.   
1c80: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
1c90: 65 48 61 73 68 46 69 72 73 74 28 26 74 65 6d 70  eHashFirst(&temp
1ca0: 32 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  2); pElem; pElem
1cb0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
1cc0: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 54  pElem)){.      T
1cd0: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
1ce0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
1cf0: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20  a(pElem);.      
1d00: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69  sqlite3DeleteTri
1d10: 67 67 65 72 28 70 54 72 69 67 67 65 72 29 3b 0a  gger(pTrigger);.
1d20: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1d30: 33 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70  3HashClear(&temp
1d40: 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48  2);.    sqlite3H
1d50: 61 73 68 49 6e 69 74 28 26 70 44 62 2d 3e 74 62  ashInit(&pDb->tb
1d60: 6c 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41  lHash, SQLITE_HA
1d70: 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20  SH_STRING, 0);. 
1d80: 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c     for(pElem=sql
1d90: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74 65  iteHashFirst(&te
1da0: 6d 70 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  mp1); pElem; pEl
1db0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
1dc0: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20  t(pElem)){.     
1dd0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
1de0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
1df0: 6c 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lem);.      sqli
1e00: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
1e10: 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  b, pTab);.    }.
1e20: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43      sqlite3HashC
1e30: 6c 65 61 72 28 26 74 65 6d 70 31 29 3b 0a 20 20  lear(&temp1);.  
1e40: 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74    DbClearPropert
1e50: 79 28 64 62 2c 20 69 2c 20 44 42 5f 53 63 68 65  y(db, i, DB_Sche
1e60: 6d 61 4c 6f 61 64 65 64 29 3b 0a 20 20 20 20 69  maLoaded);.    i
1e70: 66 28 20 69 44 62 3e 30 20 29 20 72 65 74 75 72  f( iDb>0 ) retur
1e80: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
1e90: 20 69 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d   iDb==0 );.  db-
1ea0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
1eb0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
1ec0: 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72  ..  /* If one or
1ed0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 61 75 78   more of the aux
1ee0: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
1ef0: 66 69 6c 65 73 20 68 61 73 20 62 65 65 6e 20 63  files has been c
1f00: 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e  losed,.  ** then
1f10: 20 72 65 6d 6f 76 65 20 74 68 65 6e 20 66 72 6f   remove then fro
1f20: 6d 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  m the auxiliary 
1f30: 64 61 74 61 62 61 73 65 20 6c 69 73 74 2e 20 20  database list.  
1f40: 57 65 20 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a  We take the.  **
1f50: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
1f60: 64 6f 20 74 68 69 73 20 68 65 72 65 20 73 69 6e  do this here sin
1f70: 63 65 20 77 65 20 68 61 76 65 20 6a 75 73 74 20  ce we have just 
1f80: 64 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20 74  deleted all of t
1f90: 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 68  he.  ** schema h
1fa0: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74  ash tables and t
1fb0: 68 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20  herefore do not 
1fc0: 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79  have to make any
1fd0: 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f   changes.  ** to
1fe0: 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 74 61   any of those ta
1ff0: 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  bles..  */.  for
2000: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
2010: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
2020: 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d  t Db *pDb = &db-
2030: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
2040: 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a   pDb->pBt==0 ){.
2050: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70        if( pDb->p
2060: 41 75 78 20 26 26 20 70 44 62 2d 3e 78 46 72 65  Aux && pDb->xFre
2070: 65 41 75 78 20 29 20 70 44 62 2d 3e 78 46 72 65  eAux ) pDb->xFre
2080: 65 41 75 78 28 70 44 62 2d 3e 70 41 75 78 29 3b  eAux(pDb->pAux);
2090: 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 41 75 78  .      pDb->pAux
20a0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
20b0: 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64    for(i=j=2; i<d
20c0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
20d0: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
20e0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
20f0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
2100: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2110: 69 74 65 46 72 65 65 28 70 44 62 2d 3e 7a 4e 61  iteFree(pDb->zNa
2120: 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  me);.      pDb->
2130: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
2140: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
2150: 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a  .    if( j<i ){.
2160: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d        db->aDb[j]
2170: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20   = db->aDb[i];. 
2180: 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20     }.    j++;.  
2190: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e  }.  memset(&db->
21a0: 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e  aDb[j], 0, (db->
21b0: 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62  nDb-j)*sizeof(db
21c0: 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62  ->aDb[j]));.  db
21d0: 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28  ->nDb = j;.  if(
21e0: 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64   db->nDb<=2 && d
21f0: 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53  b->aDb!=db->aDbS
2200: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d  tatic ){.    mem
2210: 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69  cpy(db->aDbStati
2220: 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69  c, db->aDb, 2*si
2230: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29  zeof(db->aDb[0])
2240: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
2250: 65 28 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20  e(db->aDb);.    
2260: 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
2270: 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a  bStatic;.  }.}..
2280: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2290: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
22a0: 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  never a rollback
22b0: 20 6f 63 63 75 72 73 2e 20 20 49 66 20 74 68 65   occurs.  If the
22c0: 72 65 20 77 65 72 65 0a 2a 2a 20 73 63 68 65 6d  re were.** schem
22d0: 61 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67  a changes during
22e0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
22f0: 2c 20 74 68 65 6e 20 77 65 20 68 61 76 65 20 74  , then we have t
2300: 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 69  o reset the.** i
2310: 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62  nternal hash tab
2320: 6c 65 73 20 61 6e 64 20 72 65 6c 6f 61 64 20 74  les and reload t
2330: 68 65 6d 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a  hem from disk..*
2340: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
2350: 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43 68  llbackInternalCh
2360: 61 6e 67 65 73 28 73 71 6c 69 74 65 20 2a 64 62  anges(sqlite *db
2370: 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  ){.  if( db->fla
2380: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs & SQLITE_Inte
2390: 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20  rnChanges ){.   
23a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
23b0: 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
23c0: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
23d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
23e0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63   called when a c
23f0: 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f  ommit occurs..*/
2400: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
2410: 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
2420: 65 73 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a  es(sqlite *db){.
2430: 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 63 68    db->aDb[0].sch
2440: 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d  ema_cookie = db-
2450: 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 3b 0a 20 20  >next_cookie;.  
2460: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
2470: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
2480: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  es;.}../*.** Rem
2490: 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 64  ove the memory d
24a0: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61  ata structures a
24b0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
24c0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c  he given.** Tabl
24d0: 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  e.  No changes a
24e0: 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b 20  re made to disk 
24f0: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
2500: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2510: 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65 73  ine just deletes
2520: 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74   the data struct
2530: 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ure.  It does no
2540: 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20  t unlink.** the 
2550: 74 61 62 6c 65 20 64 61 74 61 20 73 74 72 75 63  table data struc
2560: 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68 61  ture from the ha
2570: 73 68 20 74 61 62 6c 65 2e 20 20 4e 6f 72 20 64  sh table.  Nor d
2580: 6f 65 73 20 69 74 20 72 65 6d 6f 76 65 0a 2a 2a  oes it remove.**
2590: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 66 72   foreign keys fr
25a0: 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 2e 61 46  om the sqlite.aF
25b0: 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65 2e 20  Key hash table. 
25c0: 20 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73   But it does des
25d0: 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73  troy.** memory s
25e0: 74 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65  tructures of the
25f0: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
2600: 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69  eign keys associ
2610: 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68  ated with .** th
2620: 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  e table..**.** I
2630: 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
2640: 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
2650: 20 61 72 65 20 75 6e 6c 69 6e 6b 65 64 20 66 72   are unlinked fr
2660: 6f 6d 20 74 68 65 20 22 64 62 22 0a 2a 2a 20 64  om the "db".** d
2670: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69 66  ata structure if
2680: 20 64 62 21 3d 4e 55 4c 4c 2e 20 20 49 66 20 64   db!=NULL.  If d
2690: 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63 65 73  b==NULL, indices
26a0: 20 61 74 74 61 63 68 65 64 20 74 6f 0a 2a 2a 20   attached to.** 
26b0: 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 64 65  the table are de
26c0: 6c 65 74 65 64 2c 20 62 75 74 20 69 74 20 69 73  leted, but it is
26d0: 20 61 73 73 75 6d 65 64 20 74 68 65 79 20 68 61   assumed they ha
26e0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a  ve already been.
26f0: 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a  ** unlinked..*/.
2700: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
2710: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 20 2a  teTable(sqlite *
2720: 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  db, Table *pTabl
2730: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 49  e){.  int i;.  I
2740: 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70  ndex *pIndex, *p
2750: 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46  Next;.  FKey *pF
2760: 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b  Key, *pNextFKey;
2770: 0a 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ..  if( pTable==
2780: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  0 ) return;..  /
2790: 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64  * Delete all ind
27a0: 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
27b0: 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 0a  with this table.
27c0: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65    */.  for(pInde
27d0: 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64  x = pTable->pInd
27e0: 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
27f0: 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ex=pNext){.    p
2800: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
2810: 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74  Next;.    assert
2820: 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 70  ( pIndex->iDb==p
2830: 54 61 62 6c 65 2d 3e 69 44 62 20 7c 7c 20 28 70  Table->iDb || (p
2840: 54 61 62 6c 65 2d 3e 69 44 62 3d 3d 30 20 26 26  Table->iDb==0 &&
2850: 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 31 29   pIndex->iDb==1)
2860: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65   );.    sqliteDe
2870: 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49  leteIndex(db, pI
2880: 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ndex);.  }..  /*
2890: 20 44 65 6c 65 74 65 20 61 6c 6c 20 66 6f 72 65   Delete all fore
28a0: 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61  ign keys associa
28b0: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61  ted with this ta
28c0: 62 6c 65 2e 20 20 54 68 65 20 6b 65 79 73 0a 20  ble.  The keys. 
28d0: 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20   ** should have 
28e0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 75 6e 6c  already been unl
28f0: 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 64  inked from the d
2900: 62 2d 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61  b->aFKey hash ta
2910: 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ble .  */.  for(
2920: 70 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46  pFKey=pTable->pF
2930: 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65  Key; pFKey; pFKe
2940: 79 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20  y=pNextFKey){.  
2950: 20 20 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46    pNextFKey = pF
2960: 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a  Key->pNextFrom;.
2970: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
2980: 6c 65 2d 3e 69 44 62 3c 64 62 2d 3e 6e 44 62 20  le->iDb<db->nDb 
2990: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
29a0: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
29b0: 64 62 2d 3e 61 44 62 5b 70 54 61 62 6c 65 2d 3e  db->aDb[pTable->
29c0: 69 44 62 5d 2e 61 46 4b 65 79 2c 0a 20 20 20 20  iDb].aFKey,.    
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e0: 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54         pFKey->zT
29f0: 6f 2c 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d  o, strlen(pFKey-
2a00: 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79 20  >zTo)+1)!=pFKey 
2a10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
2a20: 65 28 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 0a 20  e(pFKey);.  }.. 
2a30: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54   /* Delete the T
2a40: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  able structure i
2a50: 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 66 6f  tself..  */.  fo
2a60: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d  r(i=0; i<pTable-
2a70: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
2a80: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
2a90: 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  le->aCol[i].zNam
2aa0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
2ab0: 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  ee(pTable->aCol[
2ac0: 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73  i].zDflt);.    s
2ad0: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
2ae0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29  ->aCol[i].zType)
2af0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
2b00: 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ee(pTable->zName
2b10: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
2b20: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20  pTable->aCol);. 
2b30: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
2b40: 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53 65  lete(pTable->pSe
2b50: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46  lect);.  sqliteF
2b60: 72 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a  ree(pTable);.}..
2b70: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  /*.** Unlink the
2b80: 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f   given table fro
2b90: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
2ba0: 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65  s and the delete
2bb0: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74   the.** table st
2bc0: 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c  ructure with all
2bd0: 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64   its indices and
2be0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a   foreign keys..*
2bf0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
2c00: 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  liteUnlinkAndDel
2c10: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 20  eteTable(sqlite 
2c20: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a  *db, Table *p){.
2c30: 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20    Table *pOld;. 
2c40: 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46 32   FKey *pF1, *pF2
2c50: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d 3e 69  ;.  int i = p->i
2c60: 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  Db;.  assert( db
2c70: 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20  !=0 );.  pOld = 
2c80: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
2c90: 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 74 62  t(&db->aDb[i].tb
2ca0: 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  lHash, p->zName,
2cb0: 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65   strlen(p->zName
2cc0: 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  )+1, 0);.  asser
2cd0: 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f  t( pOld==0 || pO
2ce0: 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 6f 72 28 70  ld==p );.  for(p
2cf0: 46 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31  F1=p->pFKey; pF1
2d00: 3b 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74  ; pF1=pF1->pNext
2d10: 46 72 6f 6d 29 7b 0a 20 20 20 20 69 6e 74 20 6e  From){.    int n
2d20: 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 31 2d  To = strlen(pF1-
2d30: 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 70  >zTo) + 1;.    p
2d40: 46 32 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  F2 = sqlite3Hash
2d50: 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 69 5d  Find(&db->aDb[i]
2d60: 2e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f  .aFKey, pF1->zTo
2d70: 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 69 66 28 20  , nTo);.    if( 
2d80: 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20  pF2==pF1 ){.    
2d90: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73    sqlite3HashIns
2da0: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e  ert(&db->aDb[i].
2db0: 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c  aFKey, pF1->zTo,
2dc0: 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78 74   nTo, pF1->pNext
2dd0: 54 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  To);.    }else{.
2de0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 32        while( pF2
2df0: 20 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f   && pF2->pNextTo
2e00: 21 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32  !=pF1 ){ pF2=pF2
2e10: 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20  ->pNextTo; }.   
2e20: 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a 20 20     if( pF2 ){.  
2e30: 20 20 20 20 20 20 70 46 32 2d 3e 70 4e 65 78 74        pF2->pNext
2e40: 54 6f 20 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54  To = pF1->pNextT
2e50: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
2e60: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
2e70: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29  leteTable(db, p)
2e80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  ;.}../*.** Const
2e90: 72 75 63 74 20 74 68 65 20 6e 61 6d 65 20 6f 66  ruct the name of
2ea0: 20 61 20 75 73 65 72 20 74 61 62 6c 65 20 6f 72   a user table or
2eb0: 20 69 6e 64 65 78 20 66 72 6f 6d 20 61 20 74 6f   index from a to
2ec0: 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  ken..**.** Space
2ed0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d   to hold the nam
2ee0: 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  e is obtained fr
2ef0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
2f00: 29 20 61 6e 64 20 6d 75 73 74 0a 2a 2a 20 62 65  ) and must.** be
2f10: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
2f20: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
2f30: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
2f40: 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b  TableNameFromTok
2f50: 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  en(Token *pName)
2f60: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  {.  char *zName 
2f70: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
2f80: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
2f90: 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  >n);.  sqlite3De
2fa0: 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
2fb0: 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
2fc0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
2fd0: 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  code to open the
2fe0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61 73   appropriate mas
2ff0: 74 65 72 20 74 61 62 6c 65 2e 20 20 54 68 65 20  ter table.  The 
3000: 74 61 62 6c 65 0a 2a 2a 20 6f 70 65 6e 65 64 20  table.** opened 
3010: 77 69 6c 6c 20 62 65 20 53 51 4c 49 54 45 5f 4d  will be SQLITE_M
3020: 41 53 54 45 52 20 66 6f 72 20 70 65 72 73 69 73  ASTER for persis
3030: 74 65 6e 74 20 74 61 62 6c 65 73 20 61 6e 64 20  tent tables and 
3040: 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  .** SQLITE_TEMP_
3050: 4d 41 53 54 45 52 20 66 6f 72 20 74 65 6d 70 6f  MASTER for tempo
3060: 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 54 68  rary tables.  Th
3070: 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65  e table is opene
3080: 64 0a 2a 2a 20 6f 6e 20 63 75 72 73 6f 72 20 30  d.** on cursor 0
3090: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
30a0: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
30b0: 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 73  (Vdbe *v, int is
30c0: 54 65 6d 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  Temp){.  sqlite3
30d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
30e0: 49 6e 74 65 67 65 72 2c 20 69 73 54 65 6d 70 2c  Integer, isTemp,
30f0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
3100: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
3110: 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54  enWrite, 0, MAST
3120: 45 52 5f 52 4f 4f 54 29 3b 0a 7d 0a 0a 2f 2a 0a  ER_ROOT);.}../*.
3130: 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75  ** Begin constru
3140: 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  cting a new tabl
3150: 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
3160: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
3170: 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  s is.** the firs
3180: 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74  t of several act
3190: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ion routines tha
31a0: 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20  t get called in 
31b0: 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61  response.** to a
31c0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
31d0: 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72  atement.  In par
31e0: 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f  ticular, this ro
31f0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a  utine is called.
3200: 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20  ** after seeing 
3210: 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20  tokens "CREATE" 
3220: 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20  and "TABLE" and 
3230: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  the table name. 
3240: 20 54 68 65 0a 2a 2a 20 70 53 74 61 72 74 20 74   The.** pStart t
3250: 6f 6b 65 6e 20 69 73 20 74 68 65 20 43 52 45 41  oken is the CREA
3260: 54 45 20 61 6e 64 20 70 4e 61 6d 65 20 69 73 20  TE and pName is 
3270: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  the table name. 
3280: 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66   The isTemp.** f
3290: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
32a0: 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  he table should 
32b0: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
32c0: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
32d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74  ase.** file inst
32e0: 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61  ead of in the ma
32f0: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
3300: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
3310: 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20  lly the case.** 
3320: 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20  when the "TEMP" 
3330: 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b  or "TEMPORARY" k
3340: 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e  eyword occurs in
3350: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41   between.** CREA
3360: 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a  TE and TABLE..**
3370: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c  .** The new tabl
3380: 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74  e record is init
3390: 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20  ialized and put 
33a0: 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  in pParse->pNewT
33b0: 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65  able..** As more
33c0: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
33d0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
33e0: 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69  s parsed, additi
33f0: 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72  onal action.** r
3400: 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20  outines will be 
3410: 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f  called to add mo
3420: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  re information t
3430: 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a  o this record..*
3440: 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
3450: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
3460: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
3470: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
3480: 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  ) routine.** is 
3490: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65  called to comple
34a0: 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  te the construct
34b0: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ion of the new t
34c0: 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a  able record..*/.
34d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61 72  void sqlite3Star
34e0: 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  tTable(.  Parse 
34f0: 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
3500: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
3510: 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c    Token *pStart,
3520: 20 20 20 2f 2a 20 54 68 65 20 22 43 52 45 41 54     /* The "CREAT
3530: 45 22 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f  E" token */.  To
3540: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f  ken *pName,    /
3550: 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20  * Name of table 
3560: 6f 72 20 76 69 65 77 20 74 6f 20 63 72 65 61 74  or view to creat
3570: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  e */.  int isTem
3580: 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  p,      /* True 
3590: 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  if this is a TEM
35a0: 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  P table */.  int
35b0: 20 69 73 56 69 65 77 20 20 20 20 20 20 20 2f 2a   isView       /*
35c0: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
35d0: 20 61 20 56 49 45 57 20 2a 2f 0a 29 7b 0a 20 20   a VIEW */.){.  
35e0: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
35f0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
3600: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73  char *zName;.  s
3610: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
3620: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
3630: 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  v;.  int iDb;.. 
3640: 20 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54   pParse->sFirstT
3650: 6f 6b 65 6e 20 3d 20 2a 70 53 74 61 72 74 3b 0a  oken = *pStart;.
3660: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
3670: 33 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f  3TableNameFromTo
3680: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66  ken(pName);.  if
3690: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
36a0: 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 69  urn;.  if( db->i
36b0: 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54  nit.iDb==1 ) isT
36c0: 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  emp = 1;.#ifndef
36d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
36e0: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73  HORIZATION.  ass
36f0: 65 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31  ert( (isTemp & 1
3700: 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b  )==isTemp );.  {
3710: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
3720: 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 69     char *zDb = i
3730: 73 54 65 6d 70 20 3f 20 22 74 65 6d 70 22 20 3a  sTemp ? "temp" :
3740: 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 69 66 28   "main";.    if(
3750: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
3760: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
3770: 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f  _INSERT, SCHEMA_
3780: 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30  TABLE(isTemp), 0
3790: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
37a0: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
37b0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
37c0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
37d0: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
37e0: 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  f( isTemp ){.   
37f0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
3800: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
3810: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
3820: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
3830: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
3840: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
3850: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
3860: 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  ( isTemp ){.    
3870: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
3880: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
3890: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
38a0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
38b0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
38c0: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
38d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
38e0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
38f0: 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65  rse, code, zName
3900: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
3910: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
3920: 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
3930: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  rn;.    }.  }.#e
3940: 6e 64 69 66 0a 20 0a 0a 20 20 2f 2a 20 42 65 66  ndif. ..  /* Bef
3950: 6f 72 65 20 74 72 79 69 6e 67 20 74 6f 20 63 72  ore trying to cr
3960: 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  eate a temporary
3970: 20 74 61 62 6c 65 2c 20 6d 61 6b 65 20 73 75 72   table, make sur
3980: 65 20 74 68 65 20 42 74 72 65 65 20 66 6f 72 0a  e the Btree for.
3990: 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 74 65 6d    ** holding tem
39a0: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 69 73  porary tables is
39b0: 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66   open..  */.  if
39c0: 28 20 69 73 54 65 6d 70 20 26 26 20 64 62 2d 3e  ( isTemp && db->
39d0: 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26  aDb[1].pBt==0 &&
39e0: 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
39f0: 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  n ){.    int rc 
3a00: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 61  = sqlite3BtreeFa
3a10: 63 74 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c 20  ctory(db, 0, 0, 
3a20: 4d 41 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e  MAX_PAGES, &db->
3a30: 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[1].pBt);.   
3a40: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
3a50: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
3a60: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3a70: 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f  se, "unable to o
3a80: 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
3a90: 64 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20  database ".     
3aa0: 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f     "file for sto
3ab0: 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74  ring temporary t
3ac0: 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70  ables");.      p
3ad0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
3ae0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
3af0: 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66   }.    if( db->f
3b00: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
3b10: 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 72  Trans ){.      r
3b20: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
3b30: 42 65 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e 61  BeginTrans(db->a
3b40: 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[1].pBt);.    
3b50: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
3b60: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
3b70: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3b80: 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
3b90: 6f 20 67 65 74 20 61 20 77 72 69 74 65 20 6c 6f  o get a write lo
3ba0: 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20 20 20  ck on ".        
3bb0: 20 20 22 74 68 65 20 74 65 6d 70 6f 72 61 72 79    "the temporary
3bc0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 29   database file")
3bd0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
3be0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3bf0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
3c00: 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c  ure the new tabl
3c10: 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20  e name does not 
3c20: 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20  collide with an 
3c30: 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e  existing.  ** in
3c40: 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d  dex or table nam
3c50: 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72  e.  Issue an err
3c60: 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20 69 74  or message if it
3c70: 20 64 6f 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   does..  **.  **
3c80: 20 49 66 20 77 65 20 61 72 65 20 72 65 2d 72 65   If we are re-re
3c90: 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
3ca0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65  _master table be
3cb0: 63 61 75 73 65 20 6f 66 20 61 20 73 63 68 65 6d  cause of a schem
3cc0: 61 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20 61 6e  a.  ** change an
3cd0: 64 20 61 20 6e 65 77 20 70 65 72 6d 61 6e 65 6e  d a new permanen
3ce0: 74 20 74 61 62 6c 65 20 69 73 20 66 6f 75 6e 64  t table is found
3cf0: 20 77 68 6f 73 65 20 6e 61 6d 65 20 63 6f 6c 6c   whose name coll
3d00: 69 64 65 73 20 77 69 74 68 0a 20 20 2a 2a 20 61  ides with.  ** a
3d10: 6e 20 65 78 69 73 74 69 6e 67 20 74 65 6d 70 6f  n existing tempo
3d20: 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 61 74  rary table, that
3d30: 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   is not an error
3d40: 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 6c 65 20  ..  */.  pTable 
3d50: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
3d60: 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  le(db, zName, 0)
3d70: 3b 0a 20 20 69 44 62 20 3d 20 69 73 54 65 6d 70  ;.  iDb = isTemp
3d80: 20 3f 20 31 20 3a 20 64 62 2d 3e 69 6e 69 74 2e   ? 1 : db->init.
3d90: 69 44 62 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  iDb;.  if( pTabl
3da0: 65 21 3d 30 20 26 26 20 28 70 54 61 62 6c 65 2d  e!=0 && (pTable-
3db0: 3e 69 44 62 3d 3d 69 44 62 20 7c 7c 20 21 64 62  >iDb==iDb || !db
3dc0: 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a  ->init.busy) ){.
3dd0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3de0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
3df0: 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65 78  le %T already ex
3e00: 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ists", pName);. 
3e10: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
3e20: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
3e30: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 49 64  ;.  }.  if( (pId
3e40: 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
3e50: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
3e60: 30 29 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20  0))!=0 &&.      
3e70: 20 20 20 20 28 70 49 64 78 2d 3e 69 44 62 3d 3d      (pIdx->iDb==
3e80: 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62  0 || !db->init.b
3e90: 75 73 79 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  usy) ){.    sqli
3ea0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3eb0: 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  se, "there is al
3ec0: 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e  ready an index n
3ed0: 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29  amed %s", zName)
3ee0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
3ef0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  (zName);.    ret
3f00: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  urn;.  }.  pTabl
3f10: 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  e = sqliteMalloc
3f20: 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  ( sizeof(Table) 
3f30: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
3f40: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
3f50: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
3f60: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
3f70: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
3f80: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
3f90: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  nCol = 0;.  pTab
3fa0: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->aCol = 0;.  
3fb0: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20  pTable->iPKey = 
3fc0: 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49  -1;.  pTable->pI
3fd0: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54 61 62  ndex = 0;.  pTab
3fe0: 6c 65 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20  le->iDb = iDb;. 
3ff0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65   if( pParse->pNe
4000: 77 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65 33  wTable ) sqlite3
4010: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
4020: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4030: 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e  e);.  pParse->pN
4040: 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65  ewTable = pTable
4050: 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  ;..  /* Begin ge
4060: 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64  nerating the cod
4070: 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65  e that will inse
4080: 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  rt the table rec
4090: 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ord into.  ** th
40a0: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
40b0: 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20  table.  Note in 
40c0: 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20  particular that 
40d0: 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64  we must go ahead
40e0: 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61  .  ** and alloca
40f0: 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  te the record nu
4100: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
4110: 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42  le entry now.  B
4120: 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50  efore any.  ** P
4130: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
4140: 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72  IQUE keywords ar
4150: 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65  e parsed.  Those
4160: 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63   keywords will c
4170: 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65  ause.  ** indice
4180: 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  s to be created 
4190: 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65  and the table re
41a0: 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62  cord must come b
41b0: 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20  efore the .  ** 
41c0: 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c  indices.  Hence,
41d0: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
41e0: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
41f0: 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
4200: 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a  ed.  ** now..  *
4210: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
4220: 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73  t.busy && (v = s
4230: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
4240: 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20  arse))!=0 ){.   
4250: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
4260: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
4270: 73 65 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a  se, 0, isTemp);.
4280: 20 20 20 20 69 66 28 20 21 69 73 54 65 6d 70 20      if( !isTemp 
4290: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
42a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
42b0: 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 66 69 6c  Integer, db->fil
42c0: 65 5f 66 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20  e_format, 0);.  
42d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
42e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
42f0: 6f 6b 69 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  okie, 0, 1);.   
4300: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70   }.    sqlite3Op
4310: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c  enMasterTable(v,
4320: 20 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 73 71   isTemp);.    sq
4330: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4340: 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30  , OP_NewRecno, 0
4350: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4360: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4370: 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
4380: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4390: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
43a0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
43b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
43c0: 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20  P_PutIntKey, 0, 
43d0: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
43e0: 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d   Add a new colum
43f0: 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  n to the table c
4400: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
4410: 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a  onstructed..**.*
4420: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
4430: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
4440: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f  once for each co
4450: 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  lumn declaration
4460: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
4470: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
4480: 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
4490: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
44a0: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
44b0: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
44c0: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
44d0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
44e0: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
44f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4500: 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20  AddColumn(Parse 
4510: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
4520: 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  pName){.  Table 
4530: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
4540: 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 43 6f  har *z = 0;.  Co
4550: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66  lumn *pCol;.  if
4560: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
4570: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
4580: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
4590: 53 65 74 4e 53 74 72 69 6e 67 28 26 7a 2c 20 70  SetNString(&z, p
45a0: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
45b0: 6e 2c 20 30 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  n, 0);.  if( z==
45c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
45d0: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b  lite3Dequote(z);
45e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
45f0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
4600: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
4610: 43 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69  Cmp(z, p->aCol[i
4620: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
4630: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
4640: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75  rMsg(pParse, "du
4650: 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e  plicate column n
4660: 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ame: %s", z);.  
4670: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
4680: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
4690: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
46a0: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
46b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
46c0: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
46d0: 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
46e0: 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e  c( p->aCol, (p->
46f0: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
4700: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  ->aCol[0]));.   
4710: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72   if( aNew==0 ) r
4720: 65 74 75 72 6e 3b 0a 20 20 20 20 70 2d 3e 61 43  eturn;.    p->aC
4730: 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20  ol = aNew;.  }. 
4740: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
4750: 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d  [p->nCol];.  mem
4760: 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a  set(pCol, 0, siz
4770: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
4780: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20  ;.  pCol->zName 
4790: 3d 20 7a 3b 0a 20 20 70 43 6f 6c 2d 3e 73 6f 72  = z;.  pCol->sor
47a0: 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45 5f  tOrder = SQLITE_
47b0: 53 4f 5f 4e 55 4d 3b 0a 20 20 70 2d 3e 6e 43 6f  SO_NUM;.  p->nCo
47c0: 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  l++;.}../*.** Th
47d0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
47e0: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
47f0: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
4800: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
4810: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
4820: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
4830: 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e  A "NOT NULL" con
4840: 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62  straint has.** b
4850: 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f  een seen on a co
4860: 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  lumn.  This rout
4870: 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74  ine sets the not
4880: 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20  Null flag on.** 
4890: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  the column curre
48a0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
48b0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
48c0: 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75   sqlite3AddNotNu
48d0: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
48e0: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
48f0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
4900: 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  t i;.  if( (p = 
4910: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4920: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
4930: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
4940: 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d  .  if( i>=0 ) p-
4950: 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c  >aCol[i].notNull
4960: 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f   = onError;.}../
4970: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4980: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
4990: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
49a0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
49b0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
49c0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
49d0: 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73  ment.  The pFirs
49e0: 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66  t token is the f
49f0: 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e  irst.** token in
4a00: 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66   the sequence of
4a10: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73   tokens that des
4a20: 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f  cribe the type o
4a30: 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  f the.** column 
4a40: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
4a50: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20  construction.   
4a60: 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73  pLast is the las
4a70: 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68  t token.** in th
4a80: 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65  e sequence.  Use
4a90: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
4aa0: 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61  n to construct a
4ab0: 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20   string.** that 
4ac0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70  contains the typ
4ad0: 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c  ename of the col
4ae0: 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  umn and store th
4af0: 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20  at string.** in 
4b00: 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20  zType..*/ .void 
4b10: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
4b20: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
4b30: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 46 69 72 73  se, Token *pFirs
4b40: 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74 29  t, Token *pLast)
4b50: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
4b60: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
4b70: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a 2a  n;.  char *z, **
4b80: 70 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  pz;.  Column *pC
4b90: 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  ol;.  if( (p = p
4ba0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
4bb0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
4bc0: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
4bd0: 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75    if( i<0 ) retu
4be0: 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d  rn;.  pCol = &p-
4bf0: 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 70 7a 20 3d  >aCol[i];.  pz =
4c00: 20 26 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20   &pCol->zType;. 
4c10: 20 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b 20   n = pLast->n + 
4c20: 41 64 64 72 28 70 4c 61 73 74 2d 3e 7a 29 20 2d  Addr(pLast->z) -
4c30: 20 41 64 64 72 28 70 46 69 72 73 74 2d 3e 7a 29   Addr(pFirst->z)
4c40: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53  ;.  sqlite3SetNS
4c50: 74 72 69 6e 67 28 70 7a 2c 20 70 46 69 72 73 74  tring(pz, pFirst
4c60: 2d 3e 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 7a 20  ->z, n, 0);.  z 
4c70: 3d 20 2a 70 7a 3b 0a 20 20 69 66 28 20 7a 3d 3d  = *pz;.  if( z==
4c80: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
4c90: 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69  r(i=j=0; z[i]; i
4ca0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d  ++){.    int c =
4cb0: 20 7a 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 69   z[i];.    if( i
4cc0: 73 73 70 61 63 65 28 63 29 20 29 20 63 6f 6e 74  sspace(c) ) cont
4cd0: 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d  inue;.    z[j++]
4ce0: 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d   = c;.  }.  z[j]
4cf0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 72   = 0;.  if( pPar
4d00: 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72  se->db->file_for
4d10: 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 70 43  mat>=4 ){.    pC
4d20: 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  ol->sortOrder = 
4d30: 73 71 6c 69 74 65 33 43 6f 6c 6c 61 74 65 54 79  sqlite3CollateTy
4d40: 70 65 28 7a 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73  pe(z, n);.  }els
4d50: 65 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 6f 72  e{.    pCol->sor
4d60: 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45 5f  tOrder = SQLITE_
4d70: 53 4f 5f 4e 55 4d 3b 0a 20 20 7d 0a 7d 0a 0a 2f  SO_NUM;.  }.}../
4d80: 2a 0a 2a 2a 20 54 68 65 20 67 69 76 65 6e 20 74  *.** The given t
4d90: 6f 6b 65 6e 20 69 73 20 74 68 65 20 64 65 66 61  oken is the defa
4da0: 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
4db0: 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64  e last column ad
4dc0: 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61  ded to.** the ta
4dd0: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
4de0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
4df0: 2e 20 20 49 66 20 22 6d 69 6e 75 73 46 6c 61 67  .  If "minusFlag
4e00: 22 20 69 73 20 74 72 75 65 2c 20 69 74 0a 2a 2a  " is true, it.**
4e10: 20 6d 65 61 6e 73 20 74 68 65 20 76 61 6c 75 65   means the value
4e20: 20 74 6f 6b 65 6e 20 77 61 73 20 70 72 65 63 65   token was prece
4e30: 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73  ded by a minus s
4e40: 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ign..**.** This 
4e50: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
4e60: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
4e70: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
4e80: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
4e90: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
4ea0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
4eb0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65  oid sqlite3AddDe
4ec0: 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65  faultValue(Parse
4ed0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
4ee0: 2a 70 56 61 6c 2c 20 69 6e 74 20 6d 69 6e 75 73  *pVal, int minus
4ef0: 46 6c 61 67 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Flag){.  Table *
4f00: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
4f10: 61 72 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20 28  ar **pz;.  if( (
4f20: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
4f30: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
4f40: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
4f50: 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29  l-1;.  if( i<0 )
4f60: 20 72 65 74 75 72 6e 3b 0a 20 20 70 7a 20 3d 20   return;.  pz = 
4f70: 26 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c  &p->aCol[i].zDfl
4f80: 74 3b 0a 20 20 69 66 28 20 6d 69 6e 75 73 46 6c  t;.  if( minusFl
4f90: 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ag ){.    sqlite
4fa0: 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20  3SetNString(pz, 
4fb0: 22 2d 22 2c 20 31 2c 20 70 56 61 6c 2d 3e 7a 2c  "-", 1, pVal->z,
4fc0: 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20   pVal->n, 0);.  
4fd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
4fe0: 65 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c  e3SetNString(pz,
4ff0: 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e   pVal->z, pVal->
5000: 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  n, 0);.  }.  sql
5010: 69 74 65 33 44 65 71 75 6f 74 65 28 2a 70 7a 29  ite3Dequote(*pz)
5020: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67  ;.}../*.** Desig
5030: 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59  nate the PRIMARY
5040: 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61 62   KEY for the tab
5050: 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20  le.  pList is a 
5060: 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a  list of names .*
5070: 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61  * of columns tha
5080: 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61  t form the prima
5090: 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73  ry key.  If pLis
50a0: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
50b0: 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
50c0: 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d  ntly added colum
50d0: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  n of the table i
50e0: 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  s the primary ke
50f0: 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65  y..**.** A table
5100: 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73   can have at mos
5110: 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  t one primary ke
5120: 79 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65  y.  If the table
5130: 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20   already has.** 
5140: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61  a primary key (a
5150: 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 73  nd this is the s
5160: 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65  econd primary ke
5170: 79 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  y) then create a
5180: 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n.** error..**.*
5190: 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59  * If the PRIMARY
51a0: 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e   KEY is on a sin
51b0: 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65  gle column whose
51c0: 20 64 61 74 61 74 79 70 65 20 69 73 20 49 4e 54   datatype is INT
51d0: 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65  EGER,.** then we
51e0: 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65   will try to use
51f0: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20   that column as 
5200: 74 68 65 20 72 6f 77 20 69 64 2e 20 20 28 45 78  the row id.  (Ex
5210: 63 65 70 74 69 6f 6e 3a 0a 2a 2a 20 46 6f 72 20  ception:.** For 
5220: 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
5230: 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64  ibility with old
5240: 65 72 20 64 61 74 61 62 61 73 65 73 2c 20 64 6f  er databases, do
5250: 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 2a 2a 20   not do this.** 
5260: 69 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d  if the file form
5270: 61 74 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  at version numbe
5280: 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31  r is less than 1
5290: 2e 29 20 20 53 65 74 20 74 68 65 20 54 61 62 6c  .)  Set the Tabl
52a0: 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64  e.iPKey.** field
52b0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e   of the table un
52c0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
52d0: 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78   to be the index
52e0: 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47   of the.** INTEG
52f0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
5300: 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50  olumn.  Table.iP
5310: 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31  Key is set to -1
5320: 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   if there is.** 
5330: 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  no INTEGER PRIMA
5340: 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66  RY KEY..**.** If
5350: 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20   the key is not 
5360: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
5370: 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65  RY KEY, then cre
5380: 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20  ate a unique.** 
5390: 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65  index for the ke
53a0: 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20  y.  No index is 
53b0: 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45  created for INTE
53c0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73  GER PRIMARY KEYs
53d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
53e0: 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 50  3AddPrimaryKey(P
53f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 64  arse *pParse, Id
5400: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74  List *pList, int
5410: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
5420: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
5430: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
5440: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b  char *zType = 0;
5450: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31  .  int iCol = -1
5460: 2c 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  , i;.  if( pTab=
5470: 3d 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72  =0 ) goto primar
5480: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66  y_key_exit;.  if
5490: 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b  ( pTab->hasPrimK
54a0: 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
54b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
54c0: 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20  , .      "table 
54d0: 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20  \"%s\" has more 
54e0: 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79  than one primary
54f0: 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61   key", pTab->zNa
5500: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72  me);.    goto pr
5510: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
5520: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73 50    }.  pTab->hasP
5530: 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66  rimKey = 1;.  if
5540: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
5550: 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e    iCol = pTab->n
5560: 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61  Col - 1;.    pTa
5570: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73  b->aCol[iCol].is
5580: 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d  PrimKey = 1;.  }
5590: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
55a0: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
55b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72   i++){.      for
55c0: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
55d0: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
55e0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
55f0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c  qlite3StrICmp(pL
5600: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
5610: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
5620: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
5630: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5640: 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62     if( iCol<pTab
5650: 2d 3e 6e 43 6f 6c 20 29 20 70 54 61 62 2d 3e 61  ->nCol ) pTab->a
5660: 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d  Col[iCol].isPrim
5670: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Key = 1;.    }. 
5680: 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49     if( pList->nI
5690: 64 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b  d>1 ) iCol = -1;
56a0: 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e  .  }.  if( iCol>
56b0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
56c0: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79  >nCol ){.    zTy
56d0: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
56e0: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d  iCol].zType;.  }
56f0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
5700: 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  b->file_format>=
5710: 31 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  1 && .          
5720: 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74 65   zType && sqlite
5730: 33 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20  3StrICmp(zType, 
5740: 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 20 29 7b  "INTEGER")==0 ){
5750: 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  .    pTab->iPKey
5760: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61   = iCol;.    pTa
5770: 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45  b->keyConf = onE
5780: 72 72 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rror;.  }else{. 
5790: 20 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65     sqlite3Create
57a0: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c  Index(pParse, 0,
57b0: 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72   0, pList, onErr
57c0: 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70  or, 0, 0);.    p
57d0: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70  List = 0;.  }..p
57e0: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a  rimary_key_exit:
57f0: 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  .  sqlite3IdList
5800: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
5810: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
5820: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70  * Return the app
5830: 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69  ropriate collati
5840: 6e 67 20 74 79 70 65 20 67 69 76 65 6e 20 61 20  ng type given a 
5850: 74 79 70 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  type name..**.**
5860: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 74   The collation t
5870: 79 70 65 20 69 73 20 74 65 78 74 20 28 53 51 4c  ype is text (SQL
5880: 49 54 45 5f 53 4f 5f 54 45 58 54 29 20 69 66 20  ITE_SO_TEXT) if 
5890: 74 68 65 20 74 79 70 65 0a 2a 2a 20 6e 61 6d 65  the type.** name
58a0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 68   contains the ch
58b0: 61 72 61 63 74 65 72 20 73 74 72 65 61 6d 20 22  aracter stream "
58c0: 74 65 78 74 22 20 6f 72 20 22 62 6c 6f 62 22 20  text" or "blob" 
58d0: 6f 72 0a 2a 2a 20 22 63 6c 6f 62 22 2e 20 20 41  or.** "clob".  A
58e0: 6e 79 20 6f 74 68 65 72 20 74 79 70 65 20 6e 61  ny other type na
58f0: 6d 65 20 69 73 20 63 6f 6c 6c 61 74 65 64 20 61  me is collated a
5900: 73 20 6e 75 6d 65 72 69 63 0a 2a 2a 20 28 53 51  s numeric.** (SQ
5910: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 29 2e 0a 2a 2f  LITE_SO_NUM)..*/
5920: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 6c 6c  .int sqlite3Coll
5930: 61 74 65 54 79 70 65 28 63 6f 6e 73 74 20 63 68  ateType(const ch
5940: 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e  ar *zType, int n
5950: 54 79 70 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Type){.  int i;.
5960: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 79    for(i=0; i<nTy
5970: 70 65 2d 33 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  pe-3; i++){.    
5980: 69 6e 74 20 63 20 3d 20 2a 28 7a 54 79 70 65 2b  int c = *(zType+
5990: 2b 29 20 7c 20 30 78 36 30 3b 0a 20 20 20 20 69  +) | 0x60;.    i
59a0: 66 28 20 28 63 3d 3d 27 62 27 20 7c 7c 20 63 3d  f( (c=='b' || c=
59b0: 3d 27 63 27 29 20 26 26 20 73 71 6c 69 74 65 33  ='c') && sqlite3
59c0: 53 74 72 4e 49 43 6d 70 28 7a 54 79 70 65 2c 20  StrNICmp(zType, 
59d0: 22 6c 6f 62 22 2c 20 33 29 3d 3d 30 20 29 7b 0a  "lob", 3)==0 ){.
59e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
59f0: 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20  ITE_SO_TEXT;.   
5a00: 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 63   }.    if( c=='c
5a10: 27 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e  ' && sqlite3StrN
5a20: 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 68 61 72  ICmp(zType, "har
5a30: 22 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 3)==0 ){.    
5a40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5a50: 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20  SO_TEXT;.    }. 
5a60: 20 20 20 69 66 28 20 63 3d 3d 27 74 27 20 26 26     if( c=='t' &&
5a70: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
5a80: 28 7a 54 79 70 65 2c 20 22 65 78 74 22 2c 20 33  (zType, "ext", 3
5a90: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
5aa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 54  turn SQLITE_SO_T
5ab0: 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  EXT;.    }.  }. 
5ac0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53   return SQLITE_S
5ad0: 4f 5f 4e 55 4d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  O_NUM;.}../*.** 
5ae0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5af0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
5b00: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
5b10: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
5b20: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
5b30: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
5b40: 20 20 41 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c    A "COLLATE" cl
5b50: 61 75 73 65 20 68 61 73 0a 2a 2a 20 62 65 65 6e  ause has.** been
5b60: 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d   seen on a colum
5b70: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
5b80: 20 73 65 74 73 20 74 68 65 20 43 6f 6c 75 6d 6e   sets the Column
5b90: 2e 73 6f 72 74 4f 72 64 65 72 20 6f 6e 0a 2a 2a  .sortOrder on.**
5ba0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72   the column curr
5bb0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
5bc0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
5bd0: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c  d sqlite3AddColl
5be0: 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70  ateType(Parse *p
5bf0: 50 61 72 73 65 2c 20 69 6e 74 20 63 6f 6c 6c 54  Parse, int collT
5c00: 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ype){.  Table *p
5c10: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
5c20: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
5c30: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
5c40: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
5c50: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d  Col-1;.  if( i>=
5c60: 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 73  0 ) p->aCol[i].s
5c70: 6f 72 74 4f 72 64 65 72 20 3d 20 63 6f 6c 6c 54  ortOrder = collT
5c80: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ype;.}../*.** Co
5c90: 6d 65 20 75 70 20 77 69 74 68 20 61 20 6e 65 77  me up with a new
5ca0: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 66 6f   random value fo
5cb0: 72 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  r the schema coo
5cc0: 6b 69 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 0a  kie.  Make sure.
5cd0: 2a 2a 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65  ** the new value
5ce0: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
5cf0: 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a 2a 2a 0a 2a  om the old..**.*
5d00: 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * The schema coo
5d10: 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  kie is used to d
5d20: 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68  etermine when th
5d30: 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65  e schema for the
5d40: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
5d50: 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63  nges.  After eac
5d60: 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c  h schema change,
5d70: 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75   the cookie valu
5d80: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57  e.** changes.  W
5d90: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69  hen a process fi
5da0: 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63  rst reads the sc
5db0: 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20  hema it records 
5dc0: 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20  the.** cookie.  
5dd0: 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e  Thereafter, when
5de0: 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20  ever it goes to 
5df0: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
5e00: 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b  ase,.** it check
5e10: 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  s the cookie to 
5e20: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63  make sure the sc
5e30: 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61  hema has not cha
5e40: 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74  nged.** since it
5e50: 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a   was last read..
5e60: 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20  **.** This plan 
5e70: 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  is not completel
5e80: 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20  y bullet-proof. 
5e90: 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
5ea0: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d  for.** the schem
5eb0: 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74  a to change mult
5ec0: 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66  iple times and f
5ed0: 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  or the cookie to
5ee0: 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20   be.** set back 
5ef0: 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20  to prior value. 
5f00: 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e   But schema chan
5f10: 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65  ges are infreque
5f20: 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72  nt.** and the pr
5f30: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74  obability of hit
5f40: 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f  ting the same co
5f50: 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e  okie value is on
5f60: 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69  ly.** 1 chance i
5f70: 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72  n 2^32.  So we'r
5f80: 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a  e safe enough..*
5f90: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68  /.void sqlite3Ch
5fa0: 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74  angeCookie(sqlit
5fb0: 65 20 2a 64 62 2c 20 56 64 62 65 20 2a 76 29 7b  e *db, Vdbe *v){
5fc0: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 65 78 74 5f  .  if( db->next_
5fd0: 63 6f 6f 6b 69 65 3d 3d 64 62 2d 3e 61 44 62 5b  cookie==db->aDb[
5fe0: 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  0].schema_cookie
5ff0: 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   ){.    unsigned
6000: 20 63 68 61 72 20 72 3b 0a 20 20 20 20 73 71 6c   char r;.    sql
6010: 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 31  ite3Randomness(1
6020: 2c 20 26 72 29 3b 0a 20 20 20 20 64 62 2d 3e 6e  , &r);.    db->n
6030: 65 78 74 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d  ext_cookie = db-
6040: 3e 61 44 62 5b 30 5d 2e 73 63 68 65 6d 61 5f 63  >aDb[0].schema_c
6050: 6f 6f 6b 69 65 20 2b 20 72 20 2b 20 31 3b 0a 20  ookie + r + 1;. 
6060: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
6070: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
6080: 6e 67 65 73 3b 0a 20 20 20 20 73 71 6c 69 74 65  nges;.    sqlite
6090: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
60a0: 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 6e 65  _Integer, db->ne
60b0: 78 74 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20  xt_cookie, 0);. 
60c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
60d0: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  dOp(v, OP_SetCoo
60e0: 6b 69 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  kie, 0, 0);.  }.
60f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65  }../*.** Measure
6100: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
6110: 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65 64  haracters needed
6120: 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67   to output the g
6130: 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69  iven.** identifi
6140: 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  er.  The number 
6150: 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65  returned include
6160: 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65  s any quotes use
6170: 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f  d.** but does no
6180: 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75  t include the nu
6190: 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a  ll terminator..*
61a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65  /.static int ide
61b0: 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63  ntLength(const c
61c0: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e  har *z){.  int n
61d0: 3b 0a 20 20 69 6e 74 20 6e 65 65 64 51 75 6f 74  ;.  int needQuot
61e0: 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6e 3d 30  e = 0;.  for(n=0
61f0: 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b  ; *z; n++, z++){
6200: 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 27  .    if( *z=='\'
6210: 27 20 29 7b 20 6e 2b 2b 3b 20 6e 65 65 64 51 75  ' ){ n++; needQu
6220: 6f 74 65 3d 31 3b 20 7d 0a 20 20 7d 0a 20 20 72  ote=1; }.  }.  r
6230: 65 74 75 72 6e 20 6e 20 2b 20 6e 65 65 64 51 75  eturn n + needQu
6240: 6f 74 65 2a 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ote*2;.}../*.** 
6250: 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69 66  Write an identif
6260: 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ier onto the end
6270: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73 74   of the given st
6280: 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75  ring.  Add.** qu
6290: 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20 61  ote characters a
62a0: 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  s needed..*/.sta
62b0: 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75  tic void identPu
62c0: 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a  t(char *z, int *
62d0: 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 49 64 65  pIdx, char *zIde
62e0: 6e 74 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  nt){.  int i, j,
62f0: 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20   needQuote;.  i 
6300: 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a  = *pIdx;.  for(j
6310: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
6320: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73  ++){.    if( !is
6330: 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29  alnum(zIdent[j])
6340: 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27   && zIdent[j]!='
6350: 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  _' ) break;.  }.
6360: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a    needQuote =  z
6370: 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69  Ident[j]!=0 || i
6380: 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d  sdigit(zIdent[0]
6390: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
63a0: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65      || sqlite3Ke
63b0: 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74  ywordCode(zIdent
63c0: 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69  , j)!=TK_ID;.  i
63d0: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
63e0: 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  [i++] = '\'';.  
63f0: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
6400: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b  j]; j++){.    z[
6410: 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d  i++] = zIdent[j]
6420: 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74  ;.    if( zIdent
6430: 5b 6a 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b 69 2b  [j]=='\'' ) z[i+
6440: 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a 20  +] = '\'';.  }. 
6450: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
6460: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a   z[i++] = '\'';.
6470: 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70    z[i] = 0;.  *p
6480: 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  Idx = i;.}../*.*
6490: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45  * Generate a CRE
64a0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
64b0: 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20  ent appropriate 
64c0: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
64d0: 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20   table.  Memory 
64e0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74  to hold the text
64f0: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
6500: 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  t is obtained.**
6510: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
6520: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
6530: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
6540: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
6550: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
6560: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
6570: 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Table *p){.  int
6580: 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72   i, k, n;.  char
6590: 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20   *zStmt;.  char 
65a0: 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a  *zSep, *zSep2, *
65b0: 7a 45 6e 64 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  zEnd;.  n = 0;. 
65c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
65d0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  Col; i++){.    n
65e0: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
65f0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
6600: 29 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64  );.  }.  n += id
6610: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61  entLength(p->zNa
6620: 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 34 30 20  me);.  if( n<40 
6630: 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22  ){.    zSep = ""
6640: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
6650: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29  ";.    zEnd = ")
6660: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
6670: 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20  zSep = "\n  ";. 
6680: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20     zSep2 = ",\n 
6690: 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22   ";.    zEnd = "
66a0: 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d  \n)";.  }.  n +=
66b0: 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b   35 + 6*p->nCol;
66c0: 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  zStmt = sqlit
66d0: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b  eMallocRaw( n );
66e0: 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20  .  if( zStmt==0 
66f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 74  ) return 0;.  st
6700: 72 63 70 79 28 7a 53 74 6d 74 2c 20 70 2d 3e 69  rcpy(zStmt, p->i
6710: 44 62 3d 3d 31 20 3f 20 22 43 52 45 41 54 45 20  Db==1 ? "CREATE 
6720: 54 45 4d 50 20 54 41 42 4c 45 20 22 20 3a 20 22  TEMP TABLE " : "
6730: 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b  CREATE TABLE ");
6740: 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53  .  k = strlen(zS
6750: 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74  tmt);.  identPut
6760: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a  (zStmt, &k, p->z
6770: 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b  Name);.  zStmt[k
6780: 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72  ++] = '(';.  for
6790: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
67a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63 70   i++){.    strcp
67b0: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65  y(&zStmt[k], zSe
67c0: 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72  p);.    k += str
67d0: 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a  len(&zStmt[k]);.
67e0: 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32      zSep = zSep2
67f0: 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a  ;.    identPut(z
6800: 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 61 43 6f  Stmt, &k, p->aCo
6810: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  l[i].zName);.  }
6820: 0a 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74  .  strcpy(&zStmt
6830: 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65  [k], zEnd);.  re
6840: 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f  turn zStmt;.}../
6850: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6860: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  e is called to r
6870: 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20  eport the final 
6880: 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ")" that termina
6890: 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20  tes.** a CREATE 
68a0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
68b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
68c0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
68d0: 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75  other action rou
68e0: 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20  tines have been 
68f0: 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61  building.** is a
6900: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65  dded to the inte
6910: 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73  rnal hash tables
6920: 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  , assuming no er
6930: 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63  rors have.** occ
6940: 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  urred..**.** An 
6950: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61  entry for the ta
6960: 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74  ble is made in t
6970: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
6980: 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a  on disk, unless.
6990: 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  ** this is a tem
69a0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20  porary table or 
69b0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
69c0: 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74  .  When db->init
69d0: 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d  .busy==1.** it m
69e0: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
69f0: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
6a00: 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61  aster table beca
6a10: 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63  use we just.** c
6a20: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20  onnected to the 
6a30: 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61  database or beca
6a40: 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  use the sqlite_m
6a50: 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a  aster table has.
6a60: 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e  ** recently chan
6a70: 67 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74 72  ges, so the entr
6a80: 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65  y for this table
6a90: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
6aa0: 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  in.** the sqlite
6ab0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20  _master table.  
6ac0: 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  We do not want t
6ad0: 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69  o create it agai
6ae0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
6af0: 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74  pSelect argument
6b00: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
6b10: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
6b20: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20   routine.** was 
6b30: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
6b40: 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74   a table generat
6b50: 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43  ed from a .** "C
6b60: 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20  REATE TABLE ... 
6b70: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73  AS SELECT ..." s
6b80: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63  tatement.  The c
6b90: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a  olumn names of.*
6ba0: 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * the new table 
6bb0: 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72  will match the r
6bc0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
6bd0: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
6be0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
6bf0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6c00: 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65 6c  Token *pEnd, Sel
6c10: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
6c20: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c   Table *p;.  sql
6c30: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
6c40: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45  ->db;..  if( (pE
6c50: 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74  nd==0 && pSelect
6c60: 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ==0) || pParse->
6c70: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f  nErr || sqlite3_
6c80: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
6c90: 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50  return;.  p = pP
6ca0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
6cb0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
6cc0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  turn;..  /* If t
6cd0: 68 65 20 74 61 62 6c 65 20 69 73 20 67 65 6e 65  he table is gene
6ce0: 72 61 74 65 64 20 66 72 6f 6d 20 61 20 53 45 4c  rated from a SEL
6cf0: 45 43 54 2c 20 74 68 65 6e 20 63 6f 6e 73 74 72  ECT, then constr
6d00: 75 63 74 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73  uct the.  ** lis
6d10: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64  t of columns and
6d20: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
6d30: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
6d40: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
6d50: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
6d60: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
6d70: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
6d80: 73 65 2c 20 30 2c 20 70 53 65 6c 65 63 74 29 3b  se, 0, pSelect);
6d90: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62  .    if( pSelTab
6da0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
6db0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
6dc0: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e  l==0 );.    p->n
6dd0: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
6de0: 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c  Col;.    p->aCol
6df0: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
6e00: 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e  ;.    pSelTab->n
6e10: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 65  Col = 0;.    pSe
6e20: 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  lTab->aCol = 0;.
6e30: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
6e40: 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61  eTable(0, pSelTa
6e50: 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  b);.  }..  /* If
6e60: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   the db->init.bu
6e70: 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73  sy is 1 it means
6e80: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
6e90: 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a  the SQL off the.
6ea0: 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73    ** "sqlite_mas
6eb0: 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f  ter" or "sqlite_
6ec0: 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62  temp_master" tab
6ed0: 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a  le on the disk..
6ee0: 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77    ** So do not w
6ef0: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
6f00: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
6f10: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
6f20: 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  umber.  ** for t
6f30: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
6f40: 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  e db->init.newTn
6f50: 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20  um field.  (The 
6f60: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
6f70: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
6f80: 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74  n put there by t
6f90: 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20  he sqliteOpenCb 
6fa0: 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20  routine.).  */. 
6fb0: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
6fc0: 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75  sy ){.    p->tnu
6fd0: 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
6fe0: 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Tnum;.  }..  /* 
6ff0: 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  If not initializ
7000: 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ing, then create
7010: 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68   a record for th
7020: 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a  e new table.  **
7030: 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
7040: 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74  ASTER table of t
7050: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
7060: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a  e record number.
7070: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77    ** for the new
7080: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 73 68 6f   table entry sho
7090: 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 6f  uld already be o
70a0: 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a  n the stack..  *
70b0: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69  *.  ** If this i
70c0: 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61  s a TEMPORARY ta
70d0: 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65  ble, write the e
70e0: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75  ntry into the au
70f0: 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c  xiliary.  ** fil
7100: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74  e instead of int
7110: 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
7120: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
7130: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
7140: 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  usy ){.    int n
7150: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 0a  ;.    Vdbe *v;..
7160: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
7170: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
7180: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
7190: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70  eturn;.    if( p
71a0: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
71b0: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c        /* A regul
71c0: 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ar table */.    
71d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
71e0: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
71f0: 6c 65 2c 20 30 2c 20 70 2d 3e 69 44 62 2c 20 28  le, 0, p->iDb, (
7200: 63 68 61 72 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20  char*)&p->tnum, 
7210: 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20  P3_POINTER);.   
7220: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
7230: 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20   A view */.     
7240: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7250: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
7260: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
7270: 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20    p->tnum = 0;. 
7280: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7290: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
72a0: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
72b0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
72c0: 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20 70 2d  String, 0, 0, p-
72d0: 3e 70 53 65 6c 65 63 74 3d 3d 30 3f 22 74 61 62  >pSelect==0?"tab
72e0: 6c 65 22 3a 22 76 69 65 77 22 2c 20 50 33 5f 53  le":"view", P3_S
72f0: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
7300: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
7310: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20 70  _String, 0, 0, p
7320: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
7330: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
7340: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
7350: 20 30 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29   0, p->zName, 0)
7360: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7370: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
7380: 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 4, 0);.    sql
7390: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
73a0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
73b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  );.    if( pSele
73c0: 63 74 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  ct ){.      char
73d0: 20 2a 7a 20 3d 20 63 72 65 61 74 65 54 61 62 6c   *z = createTabl
73e0: 65 53 74 6d 74 28 70 29 3b 0a 20 20 20 20 20 20  eStmt(p);.      
73f0: 6e 20 3d 20 7a 20 3f 20 73 74 72 6c 65 6e 28 7a  n = z ? strlen(z
7400: 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  ) : 0;.      sql
7410: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
7420: 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20  (v, -1, z, n);. 
7430: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
7440: 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  z);.    }else{. 
7450: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e       assert( pEn
7460: 64 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 20  d!=0 );.      n 
7470: 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20  = Addr(pEnd->z) 
7480: 2d 20 41 64 64 72 28 70 50 61 72 73 65 2d 3e 73  - Addr(pParse->s
7490: 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 29 20 2b 20  FirstToken.z) + 
74a0: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
74b0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
74c0: 2d 31 2c 20 70 50 61 72 73 65 2d 3e 73 46 69 72  -1, pParse->sFir
74d0: 73 74 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a 20  stToken.z, n);. 
74e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
74f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7500: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30  MakeRecord, 5, 0
7510: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7520: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
7530: 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a  tIntKey, 0, 0);.
7540: 20 20 20 20 69 66 28 20 21 70 2d 3e 69 44 62 20      if( !p->iDb 
7550: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7560: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
7570: 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   v);.    }.    s
7580: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
7590: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20  v, OP_Close, 0, 
75a0: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c  0);.    if( pSel
75b0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ect ){.      sql
75c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
75d0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e   OP_Integer, p->
75e0: 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  iDb, 0);.      s
75f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
7600: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
7610: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50   1, 0);.      pP
7620: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a  arse->nTab = 2;.
7630: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
7640: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
7650: 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20  ect, SRT_Table, 
7660: 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  1, 0, 0, 0);.   
7670: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e   }.    sqlite3En
7680: 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
7690: 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20  pParse);.  }..  
76a0: 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65  /* Add the table
76b0: 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   to the in-memor
76c0: 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
76d0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
76e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
76f0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 20  rse->explain==0 
7700: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
7710: 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  =0 ){.    Table 
7720: 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65 79 20  *pOld;.    FKey 
7730: 2a 70 46 4b 65 79 3b 0a 20 20 20 20 70 4f 6c 64  *pFKey;.    pOld
7740: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
7750: 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d  sert(&db->aDb[p-
7760: 3e 69 44 62 5d 2e 74 62 6c 48 61 73 68 2c 20 0a  >iDb].tblHash, .
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7780: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a              p->z
7790: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e  Name, strlen(p->
77a0: 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20  zName)+1, p);.  
77b0: 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20    if( pOld ){.  
77c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
77d0: 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  Old );  /* Mallo
77e0: 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
77f0: 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e  ed inside HashIn
7800: 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20  sert() */.      
7810: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
7820: 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70    for(pFKey=p->p
7830: 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b  FKey; pFKey; pFK
7840: 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  ey=pFKey->pNextF
7850: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  rom){.      int 
7860: 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b  nTo = strlen(pFK
7870: 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20  ey->zTo) + 1;.  
7880: 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74      pFKey->pNext
7890: 54 6f 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  To = sqlite3Hash
78a0: 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70 2d  Find(&db->aDb[p-
78b0: 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 20 70 46 4b  >iDb].aFKey, pFK
78c0: 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20  ey->zTo, nTo);. 
78d0: 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68       sqlite3Hash
78e0: 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b  Insert(&db->aDb[
78f0: 70 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 20 70  p->iDb].aFKey, p
7900: 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20  FKey->zTo, nTo, 
7910: 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20  pFKey);.    }.  
7920: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
7930: 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  ble = 0;.    db-
7940: 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64  >nTable++;.    d
7950: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
7960: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
7970: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
7980: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
7990: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20  this routine in 
79a0: 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20  order to create 
79b0: 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f  a new VIEW.*/.vo
79c0: 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
79d0: 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70  View(.  Parse *p
79e0: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68  Parse,     /* Th
79f0: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
7a00: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42  t */.  Token *pB
7a10: 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65  egin,     /* The
7a20: 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
7a30: 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74  at begins the st
7a40: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
7a50: 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20  en *pName,      
7a60: 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
7a70: 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
7a80: 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
7a90: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
7aa0: 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54  t,   /* A SELECT
7ab0: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
7ac0: 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
7ad0: 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  new view */.  in
7ae0: 74 20 69 73 54 65 6d 70 20 20 20 20 20 20 20 20  t isTemp        
7af0: 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54   /* TRUE for a T
7b00: 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f  EMPORARY view */
7b10: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
7b20: 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74    int n;.  const
7b30: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65   char *z;.  Toke
7b40: 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65  n sEnd;.  DbFixe
7b50: 72 20 73 46 69 78 3b 0a 0a 20 20 73 71 6c 69 74  r sFix;..  sqlit
7b60: 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50 61  e3StartTable(pPa
7b70: 72 73 65 2c 20 70 42 65 67 69 6e 2c 20 70 4e 61  rse, pBegin, pNa
7b80: 6d 65 2c 20 69 73 54 65 6d 70 2c 20 31 29 3b 0a  me, isTemp, 1);.
7b90: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
7ba0: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
7bb0: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
7bc0: 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
7bd0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
7be0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74  Select);.    ret
7bf0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  urn;.  }.  if( s
7c00: 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
7c10: 46 69 78 2c 20 70 50 61 72 73 65 2c 20 70 2d 3e  Fix, pParse, p->
7c20: 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61  iDb, "view", pNa
7c30: 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74  me).    && sqlit
7c40: 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69  e3FixSelect(&sFi
7c50: 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b  x, pSelect).  ){
7c60: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
7c70: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
7c80: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
7c90: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20   }..  /* Make a 
7ca0: 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69  copy of the enti
7cb0: 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  re SELECT statem
7cc0: 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
7cd0: 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20   the view..  ** 
7ce0: 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20  This will force 
7cf0: 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b  all the Expr.tok
7d00: 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62  en.z values to b
7d10: 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20  e dynamically.  
7d20: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74  ** allocated rat
7d30: 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74  her than point t
7d40: 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  o the input stri
7d50: 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73  ng - which means
7d60: 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20   that.  ** they 
7d70: 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74  will persist aft
7d80: 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  er the current s
7d90: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61  qlite3_exec() ca
7da0: 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f  ll returns..  */
7db0: 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20  .  p->pSelect = 
7dc0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
7dd0: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  (pSelect);.  sql
7de0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
7df0: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28  (pSelect);.  if(
7e00: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
7e10: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73  it.busy ){.    s
7e20: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
7e30: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
7e40: 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c   p);.  }..  /* L
7e50: 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  ocate the end of
7e60: 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57   the CREATE VIEW
7e70: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b   statement.  Mak
7e80: 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a  e sEnd point to.
7e90: 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20    ** the end..  
7ea0: 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72  */.  sEnd = pPar
7eb0: 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a  se->sLastToken;.
7ec0: 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21    if( sEnd.z[0]!
7ed0: 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21  =0 && sEnd.z[0]!
7ee0: 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64  =';' ){.    sEnd
7ef0: 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20  .z += sEnd.n;.  
7f00: 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a  }.  sEnd.n = 0;.
7f10: 20 20 6e 20 3d 20 28 28 69 6e 74 29 73 45 6e 64    n = ((int)sEnd
7f20: 2e 7a 29 20 2d 20 28 69 6e 74 29 70 42 65 67 69  .z) - (int)pBegi
7f30: 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 70 42 65 67  n->z;.  z = pBeg
7f40: 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20  in->z;.  while( 
7f50: 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d  n>0 && (z[n-1]==
7f60: 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a  ';' || isspace(z
7f70: 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20  [n-1])) ){ n--; 
7f80: 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b  }.  sEnd.z = &z[
7f90: 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d  n-1];.  sEnd.n =
7fa0: 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71   1;..  /* Use sq
7fb0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
7fc0: 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20  to add the view 
7fd0: 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  to the SQLITE_MA
7fe0: 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20  STER table */.  
7ff0: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
8000: 70 50 61 72 73 65 2c 20 26 73 45 6e 64 2c 20 30  pParse, &sEnd, 0
8010: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
8020: 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  /*.** The Table 
8030: 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65  structure pTable
8040: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45   is really a VIE
8050: 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  W.  Fill in the 
8060: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
8070: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76  columns of the v
8080: 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c  iew in the pTabl
8090: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  e structure.  Re
80a0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a  turn the number.
80b0: 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  ** of errors.  I
80c0: 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
80d0: 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  en leave an erro
80e0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
80f0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f  rse->zErrMsg..*/
8100: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77  .int sqlite3View
8110: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50  GetColumnNames(P
8120: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
8130: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
8140: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
8150: 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  ;.  Select *pSel
8160: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54  ;.  Table *pSelT
8170: 61 62 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d  ab;.  int nErr =
8180: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
8190: 54 61 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41  Table );..  /* A
81a0: 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d   positive nCol m
81b0: 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73  eans the columns
81c0: 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20   names for this 
81d0: 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c  view are.  ** al
81e0: 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a  ready known..  *
81f0: 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
8200: 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20  nCol>0 ) return 
8210: 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74  0;..  /* A negat
8220: 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70  ive nCol is a sp
8230: 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61  ecial marker mea
8240: 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72 65  ning that we are
8250: 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20   currently.  ** 
8260: 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74  trying to comput
8270: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
8280: 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72  es.  If we enter
8290: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
82a0: 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69  th.  ** a negati
82b0: 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e  ve nCol, it mean
82c0: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69  s two or more vi
82d0: 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c  ews form a loop,
82e0: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a   like this:.  **
82f0: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
8300: 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c   VIEW one AS SEL
8310: 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a  ECT * FROM two;.
8320: 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
8330: 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45  VIEW two AS SELE
8340: 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20  CT * FROM one;. 
8350: 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c   **.  ** Actuall
8360: 79 2c 20 74 68 69 73 20 65 72 72 6f 72 20 69 73  y, this error is
8370: 20 63 61 75 67 68 74 20 70 72 65 76 69 6f 75 73   caught previous
8380: 6c 79 20 61 6e 64 20 73 6f 20 74 68 65 20 66 6f  ly and so the fo
8390: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a 20 20 2a  llowing test.  *
83a0: 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  * should always 
83b0: 66 61 69 6c 2e 20 20 42 75 74 20 77 65 20 77 69  fail.  But we wi
83c0: 6c 6c 20 6c 65 61 76 65 20 69 74 20 69 6e 20 70  ll leave it in p
83d0: 6c 61 63 65 20 6a 75 73 74 20 74 6f 20 62 65 20  lace just to be 
83e0: 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  safe..  */.  if(
83f0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20   pTable->nCol<0 
8400: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
8410: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8420: 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63 75  view %s is circu
8430: 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20  larly defined", 
8440: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
8450: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
8460: 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65  }..  /* If we ge
8470: 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
8480: 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20  eans we need to 
8490: 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c  compute the tabl
84a0: 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20  e names..  */.  
84b0: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
84c0: 70 53 65 6c 65 63 74 20 29 3b 20 2f 2a 20 49 66  pSelect ); /* If
84d0: 20 6e 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 70   nCol==0, then p
84e0: 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 20  Table must be a 
84f0: 56 49 45 57 20 2a 2f 0a 20 20 70 53 65 6c 20 3d  VIEW */.  pSel =
8500: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
8510: 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61  ;..  /* Note tha
8520: 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  t the call to sq
8530: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
8540: 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78  Select() will ex
8550: 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a  pand any.  ** "*
8560: 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  " elements in th
8570: 69 73 20 6c 69 73 74 2e 20 20 42 75 74 20 77 65  is list.  But we
8580: 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 72 65   will need to re
8590: 73 74 6f 72 65 20 74 68 65 20 6c 69 73 74 0a 20  store the list. 
85a0: 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74 73 20   ** back to its 
85b0: 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75  original configu
85c0: 72 61 74 69 6f 6e 20 61 66 74 65 72 77 61 72 64  ration afterward
85d0: 73 2c 20 73 6f 20 77 65 20 73 61 76 65 20 61 20  s, so we save a 
85e0: 63 6f 70 79 20 6f 66 0a 20 20 2a 2a 20 74 68 65  copy of.  ** the
85f0: 20 6f 72 69 67 69 6e 61 6c 20 69 6e 20 70 45 4c   original in pEL
8600: 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 45 4c 69  ist..  */.  pELi
8610: 73 74 20 3d 20 70 53 65 6c 2d 3e 70 45 4c 69 73  st = pSel->pELis
8620: 74 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73  t;.  pSel->pELis
8630: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
8640: 69 73 74 44 75 70 28 70 45 4c 69 73 74 29 3b 0a  istDup(pEList);.
8650: 20 20 69 66 28 20 70 53 65 6c 2d 3e 70 45 4c 69    if( pSel->pELi
8660: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 53 65  st==0 ){.    pSe
8670: 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69  l->pEList = pELi
8680: 73 74 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  st;.    return 1
8690: 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69  ;  /* Malloc fai
86a0: 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 61  led */.  }.  pTa
86b0: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a  ble->nCol = -1;.
86c0: 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
86d0: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
86e0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20  lect(pParse, 0, 
86f0: 70 53 65 6c 29 3b 0a 20 20 69 66 28 20 70 53 65  pSel);.  if( pSe
8700: 6c 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  lTab ){.    asse
8710: 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  rt( pTable->aCol
8720: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 6c  ==0 );.    pTabl
8730: 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->nCol = pSelTa
8740: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 54 61  b->nCol;.    pTa
8750: 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c  ble->aCol = pSel
8760: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70  Tab->aCol;.    p
8770: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30  SelTab->nCol = 0
8780: 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61  ;.    pSelTab->a
8790: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  Col = 0;.    sql
87a0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
87b0: 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20  0, pSelTab);.   
87c0: 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 70   DbSetProperty(p
87d0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 6c  Parse->db, pTabl
87e0: 65 2d 3e 69 44 62 2c 20 44 42 5f 55 6e 72 65 73  e->iDb, DB_Unres
87f0: 65 74 56 69 65 77 73 29 3b 0a 20 20 7d 65 6c 73  etViews);.  }els
8800: 65 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  e{.    pTable->n
8810: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 6e 45 72  Col = 0;.    nEr
8820: 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  r++;.  }.  sqlit
8830: 65 33 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 70  e3SelectUnbind(p
8840: 53 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Sel);.  sqlite3E
8850: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 53  xprListDelete(pS
8860: 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70  el->pEList);.  p
8870: 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45  Sel->pEList = pE
8880: 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e  List;.  return n
8890: 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Err;  .}../*.** 
88a0: 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  Clear the column
88b0: 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68 65 20   names from the 
88c0: 56 49 45 57 20 70 54 61 62 6c 65 2e 0a 2a 2a 0a  VIEW pTable..**.
88d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
88e0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76  is called whenev
88f0: 65 72 20 61 6e 79 20 6f 74 68 65 72 20 74 61 62  er any other tab
8900: 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 6d 6f  le or view is mo
8910: 64 69 66 69 65 64 2e 0a 2a 2a 20 54 68 65 20 76  dified..** The v
8920: 69 65 77 20 70 61 73 73 65 64 20 69 6e 74 6f 20  iew passed into 
8930: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
8940: 68 74 20 64 65 70 65 6e 64 20 64 69 72 65 63 74  ht depend direct
8950: 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79  ly or indirectly
8960: 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 64 69 66  .** on the modif
8970: 69 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 74  ied or deleted t
8980: 61 62 6c 65 20 73 6f 20 77 65 20 6e 65 65 64 20  able so we need 
8990: 74 6f 20 63 6c 65 61 72 20 74 68 65 20 6f 6c 64  to clear the old
89a0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d 65 73   column.** names
89b0: 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69   so that they wi
89c0: 6c 6c 20 62 65 20 72 65 63 6f 6d 70 75 74 65 64  ll be recomputed
89d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
89e0: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
89f0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c  ColumnNames(Tabl
8a00: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e  e *pTable){.  in
8a10: 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  t i;.  Column *p
8a20: 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Col;.  assert( p
8a30: 54 61 62 6c 65 21 3d 30 20 26 26 20 70 54 61 62  Table!=0 && pTab
8a40: 6c 65 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29  le->pSelect!=0 )
8a50: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ;.  for(i=0, pCo
8a60: 6c 3d 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 20  l=pTable->aCol; 
8a70: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
8a80: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
8a90: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f    sqliteFree(pCo
8aa0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  l->zName);.    s
8ab0: 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e  qliteFree(pCol->
8ac0: 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69  zDflt);.    sqli
8ad0: 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79  teFree(pCol->zTy
8ae0: 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  pe);.  }.  sqlit
8af0: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
8b00: 6f 6c 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61  ol);.  pTable->a
8b10: 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  Col = 0;.  pTabl
8b20: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a  e->nCol = 0;.}..
8b30: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
8b40: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
8b50: 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20  m every VIEW in 
8b60: 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f  database idx..*/
8b70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
8b80: 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
8b90: 73 71 6c 69 74 65 20 2a 64 62 2c 20 69 6e 74 20  sqlite *db, int 
8ba0: 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  idx){.  HashElem
8bb0: 20 2a 69 3b 0a 20 20 69 66 28 20 21 44 62 48 61   *i;.  if( !DbHa
8bc0: 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  sProperty(db, id
8bd0: 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
8be0: 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ws) ) return;.  
8bf0: 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
8c00: 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69  First(&db->aDb[i
8c10: 64 78 5d 2e 74 62 6c 48 61 73 68 29 3b 20 69 3b  dx].tblHash); i;
8c20: 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   i=sqliteHashNex
8c30: 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  t(i)){.    Table
8c40: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
8c50: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
8c60: 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
8c70: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
8c80: 65 56 69 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e  eViewResetColumn
8c90: 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20  Names(pTab);.   
8ca0: 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72   }.  }.  DbClear
8cb0: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
8cc0: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
8cd0: 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  s);.}../*.** Giv
8ce0: 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b  en a token, look
8cf0: 20 75 70 20 61 20 74 61 62 6c 65 20 77 69 74 68   up a table with
8d00: 20 74 68 61 74 20 6e 61 6d 65 2e 20 20 49 66 20   that name.  If 
8d10: 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65  not found, leave
8d20: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 66 6f 72  .** an error for
8d30: 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 66   the parser to f
8d40: 69 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ind and return N
8d50: 55 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ULL..*/.Table *s
8d60: 71 6c 69 74 65 33 54 61 62 6c 65 46 72 6f 6d 54  qlite3TableFromT
8d70: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
8d80: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29  se, Token *pTok)
8d90: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
8da0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
8db0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
8dc0: 33 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f  3TableNameFromTo
8dd0: 6b 65 6e 28 70 54 6f 6b 29 3b 0a 20 20 69 66 28  ken(pTok);.  if(
8de0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75   zName==0 ) retu
8df0: 72 6e 20 30 3b 0a 20 20 70 54 61 62 20 3d 20 73  rn 0;.  pTab = s
8e00: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
8e10: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d  pParse->db, zNam
8e20: 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 46  e, 0);.  sqliteF
8e30: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ree(zName);.  if
8e40: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
8e50: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8e60: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
8e70: 68 20 74 61 62 6c 65 3a 20 25 54 22 2c 20 70 54  h table: %T", pT
8e80: 6f 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ok);.  }.  retur
8e90: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
8ea0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
8eb0: 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68   called to do th
8ec0: 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50  e work of a DROP
8ed0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
8ee0: 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68  ..** pName is th
8ef0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
8f00: 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65  ble to be droppe
8f10: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
8f20: 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  e3DropTable(Pars
8f30: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
8f40: 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56   *pName, int isV
8f50: 69 65 77 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  iew){.  Table *p
8f60: 54 61 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a 76  Table;.  Vdbe *v
8f70: 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20  ;.  int base;.  
8f80: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
8f90: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
8fa0: 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Db;..  if( pPars
8fb0: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
8fc0: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
8fd0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 61   ) return;.  pTa
8fe0: 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 54 61 62  ble = sqlite3Tab
8ff0: 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  leFromToken(pPar
9000: 73 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  se, pName);.  if
9010: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65  ( pTable==0 ) re
9020: 74 75 72 6e 3b 0a 20 20 69 44 62 20 3d 20 70 54  turn;.  iDb = pT
9030: 61 62 6c 65 2d 3e 69 44 62 3b 0a 20 20 61 73 73  able->iDb;.  ass
9040: 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
9050: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 23 69  Db<db->nDb );.#i
9060: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9070: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
9080: 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
9090: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
90a0: 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
90b0: 54 41 42 4c 45 28 70 54 61 62 6c 65 2d 3e 69 44  TABLE(pTable->iD
90c0: 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  b);.    const ch
90d0: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
90e0: 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62 5d 2e 7a  b[pTable->iDb].z
90f0: 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
9100: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
9110: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
9120: 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
9130: 44 62 29 29 7b 0a 20 20 20 20 20 20 72 65 74 75  Db)){.      retu
9140: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rn;.    }.    if
9150: 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20  ( isView ){.    
9160: 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a    if( iDb==1 ){.
9170: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
9180: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
9190: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  VIEW;.      }els
91a0: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
91b0: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49  = SQLITE_DROP_VI
91c0: 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EW;.      }.    
91d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
91e0: 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
91f0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
9200: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
9210: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9220: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
9230: 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b  LITE_DROP_TABLE;
9240: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9250: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
9260: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
9270: 63 6f 64 65 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  code, pTable->zN
9280: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
9290: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
92a0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
92b0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
92c0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
92d0: 54 45 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  TE, pTable->zNam
92e0: 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
92f0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
9300: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  }.  }.#endif.  i
9310: 66 28 20 70 54 61 62 6c 65 2d 3e 72 65 61 64 4f  f( pTable->readO
9320: 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nly ){.    sqlit
9330: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9340: 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
9350: 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22   not be dropped"
9360: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
9370: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
9380: 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
9390: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 56 69  ;.  }.  if( isVi
93a0: 65 77 20 26 26 20 70 54 61 62 6c 65 2d 3e 70 53  ew && pTable->pS
93b0: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
93c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
93d0: 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
93e0: 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74  P TABLE to delet
93f0: 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61  e table %s", pTa
9400: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  ble->zName);.   
9410: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
9420: 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54  f( !isView && pT
9430: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 7b  able->pSelect ){
9440: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
9450: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
9460: 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64  e DROP VIEW to d
9470: 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c 20  elete view %s", 
9480: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
9490: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
94a0: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
94b0: 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
94c0: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
94d0: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20   master table.  
94e0: 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f  ** on disk..  */
94f0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
9500: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
9510: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74   if( v ){.    st
9520: 61 74 69 63 20 56 64 62 65 4f 70 4c 69 73 74 20  atic VdbeOpList 
9530: 64 72 6f 70 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a  dropTable[] = {.
9540: 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e        { OP_Rewin
9550: 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28 38  d,     0, ADDR(8
9560: 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  ),  0},.      { 
9570: 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30  OP_String,     0
9580: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 0,        0}, 
9590: 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 1 */.      { 
95a0: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31  OP_MemStore,   1
95b0: 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 1,        0},.
95c0: 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f        { OP_MemLo
95d0: 61 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20  ad,    1, 0,    
95e0: 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a      0}, /* 3 */.
95f0: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
9600: 6e 2c 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20  n,     0, 2,    
9610: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
9620: 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 30  OP_Ne,         0
9630: 2c 20 41 44 44 52 28 37 29 2c 20 20 30 7d 2c 0a  , ADDR(7),  0},.
9640: 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74        { OP_Delet
9650: 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  e,     0, 0,    
9660: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
9670: 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30  OP_Next,       0
9680: 2c 20 41 44 44 52 28 33 29 2c 20 20 30 7d 2c 20  , ADDR(3),  0}, 
9690: 2f 2a 20 37 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  /* 7 */.    };. 
96a0: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
96b0: 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72      Trigger *pTr
96c0: 69 67 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  igger;.    sqlit
96d0: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
96e0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
96f0: 20 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 0a   pTable->iDb);..
9700: 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20      /* Drop all 
9710: 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61  triggers associa
9720: 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
9730: 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
9740: 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72   */.    pTrigger
9750: 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54 72 69 67   = pTable->pTrig
9760: 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ger;.    while( 
9770: 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  pTrigger ){.    
9780: 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
9790: 65 72 2d 3e 69 44 62 3d 3d 70 54 61 62 6c 65 2d  er->iDb==pTable-
97a0: 3e 69 44 62 20 7c 7c 20 70 54 72 69 67 67 65 72  >iDb || pTrigger
97b0: 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20  ->iDb==1 );.    
97c0: 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69    sqlite3DropTri
97d0: 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20  ggerPtr(pParse, 
97e0: 70 54 72 69 67 67 65 72 2c 20 31 29 3b 0a 20 20  pTrigger, 1);.  
97f0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
9800: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20  explain ){.     
9810: 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
9820: 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  rigger->pNext;. 
9830: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9840: 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
9850: 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72 3b  Table->pTrigger;
9860: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
9870: 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20      /* Drop all 
9880: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 65 6e  SQLITE_MASTER en
9890: 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72  tries that refer
98a0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   to the table */
98b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
98c0: 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70  MasterTable(v, p
98d0: 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 20 20 20  Table->iDb);.   
98e0: 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56   base = sqlite3V
98f0: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
9900: 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70 54 61  ArraySize(dropTa
9910: 62 6c 65 29 2c 20 64 72 6f 70 54 61 62 6c 65 29  ble), dropTable)
9920: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
9930: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73  eChangeP3(v, bas
9940: 65 2b 31 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  e+1, pTable->zNa
9950: 6d 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  me, 0);..    /* 
9960: 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f  Drop all SQLITE_
9970: 54 45 4d 50 5f 4d 41 53 54 45 52 20 65 6e 74 72  TEMP_MASTER entr
9980: 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74  ies that refer t
9990: 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  o the table */. 
99a0: 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 69     if( pTable->i
99b0: 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  Db!=1 ){.      s
99c0: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
99d0: 54 61 62 6c 65 28 76 2c 20 31 29 3b 0a 20 20 20  Table(v, 1);.   
99e0: 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65     base = sqlite
99f0: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  3VdbeAddOpList(v
9a00: 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70  , ArraySize(drop
9a10: 54 61 62 6c 65 29 2c 20 64 72 6f 70 54 61 62 6c  Table), dropTabl
9a20: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
9a30: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
9a40: 20 62 61 73 65 2b 31 2c 20 70 54 61 62 6c 65 2d   base+1, pTable-
9a50: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
9a60: 7d 0a 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c  }..    if( pTabl
9a70: 65 2d 3e 69 44 62 3d 3d 30 20 29 7b 0a 20 20 20  e->iDb==0 ){.   
9a80: 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
9a90: 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a 20  Cookie(db, v);. 
9aa0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
9ab0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9ac0: 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Close, 0, 0);.  
9ad0: 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b    if( !isView ){
9ae0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9af0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
9b00: 73 74 72 6f 79 2c 20 70 54 61 62 6c 65 2d 3e 74  stroy, pTable->t
9b10: 6e 75 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62  num, pTable->iDb
9b20: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64  );.      for(pId
9b30: 78 3d 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  x=pTable->pIndex
9b40: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
9b50: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
9b60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9b70: 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  dOp(v, OP_Destro
9b80: 79 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70  y, pIdx->tnum, p
9b90: 49 64 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20  Idx->iDb);.     
9ba0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
9bb0: 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72  ite3EndWriteOper
9bc0: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
9bd0: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
9be0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 65  the in-memory de
9bf0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
9c00: 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a   table..  **.  *
9c10: 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 69 66 20  * Exception: if 
9c20: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
9c30: 74 20 62 65 67 61 6e 20 77 69 74 68 20 74 68 65  t began with the
9c40: 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64   EXPLAIN keyword
9c50: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6e 6f 20 63  ,.  ** then no c
9c60: 68 61 6e 67 65 73 20 73 68 6f 75 6c 64 20 62 65  hanges should be
9c70: 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   made..  */.  if
9c80: 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  ( !pParse->expla
9c90: 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  in ){.    sqlite
9ca0: 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54  UnlinkAndDeleteT
9cb0: 61 62 6c 65 28 64 62 2c 20 70 54 61 62 6c 65 29  able(db, pTable)
9cc0: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
9cd0: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
9ce0: 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 20 20 73  Changes;.  }.  s
9cf0: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
9d00: 6c 28 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f  l(db, iDb);.}../
9d10: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9d20: 65 20 63 6f 6e 73 74 72 75 63 74 73 20 61 20 50  e constructs a P
9d30: 33 20 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c  3 string suitabl
9d40: 65 20 66 6f 72 20 61 6e 20 4f 50 5f 4d 61 6b 65  e for an OP_Make
9d50: 49 64 78 4b 65 79 0a 2a 2a 20 6f 70 63 6f 64 65  IdxKey.** opcode
9d60: 20 61 6e 64 20 61 64 64 73 20 74 68 61 74 20 50   and adds that P
9d70: 33 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65 20  3 string to the 
9d80: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e  most recently in
9d90: 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 69  serted instructi
9da0: 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 76 69 72  on.** in the vir
9db0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54  tual machine.  T
9dc0: 68 65 20 50 33 20 73 74 72 69 6e 67 20 63 6f 6e  he P3 string con
9dd0: 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c  sists of a singl
9de0: 65 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 66  e character.** f
9df0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69  or each column i
9e00: 6e 20 74 68 65 20 69 6e 64 65 78 20 70 49 64 78  n the index pIdx
9e10: 20 6f 66 20 74 61 62 6c 65 20 70 54 61 62 2e 20   of table pTab. 
9e20: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 75   If the column u
9e30: 73 65 73 0a 2a 2a 20 61 20 6e 75 6d 65 72 69 63  ses.** a numeric
9e40: 20 73 6f 72 74 20 6f 72 64 65 72 2c 20 74 68 65   sort order, the
9e50: 6e 20 74 68 65 20 50 33 20 73 74 72 69 6e 67 20  n the P3 string 
9e60: 63 68 61 72 61 63 74 65 72 20 63 6f 72 72 65 73  character corres
9e70: 70 6f 6e 64 69 6e 67 20 74 6f 0a 2a 2a 20 74 68  ponding to.** th
9e80: 61 74 20 63 6f 6c 75 6d 6e 20 69 73 20 27 6e 27  at column is 'n'
9e90: 2e 20 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  .  If the column
9ea0: 20 75 73 65 73 20 61 20 74 65 78 74 20 73 6f 72   uses a text sor
9eb0: 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68  t order, then th
9ec0: 65 0a 2a 2a 20 50 33 20 73 74 72 69 6e 67 20 69  e.** P3 string i
9ed0: 73 20 27 74 27 2e 20 20 53 65 65 20 74 68 65 20  s 't'.  See the 
9ee0: 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 20 6f 70  OP_MakeIdxKey op
9ef0: 63 6f 64 65 20 64 6f 63 75 6d 65 6e 74 61 74 69  code documentati
9f00: 6f 6e 20 66 6f 72 0a 2a 2a 20 61 64 64 69 74 69  on for.** additi
9f10: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
9f20: 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20  .  See also the 
9f30: 73 71 6c 69 74 65 33 41 64 64 4b 65 79 54 79 70  sqlite3AddKeyTyp
9f40: 65 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  e() routine..*/.
9f50: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 49  void sqlite3AddI
9f60: 64 78 4b 65 79 54 79 70 65 28 56 64 62 65 20 2a  dxKeyType(Vdbe *
9f70: 76 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  v, Index *pIdx){
9f80: 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  .  char *zType;.
9f90: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
9fa0: 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61 73 73   int i, n;.  ass
9fb0: 65 72 74 28 20 70 49 64 78 21 3d 30 20 26 26 20  ert( pIdx!=0 && 
9fc0: 70 49 64 78 2d 3e 70 54 61 62 6c 65 21 3d 30 20  pIdx->pTable!=0 
9fd0: 29 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 64 78  );.  pTab = pIdx
9fe0: 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20  ->pTable;.  n = 
9ff0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  pIdx->nColumn;. 
a000: 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 4d   zType = sqliteM
a010: 61 6c 6c 6f 63 52 61 77 28 20 6e 2b 31 20 29 3b  allocRaw( n+1 );
a020: 0a 20 20 69 66 28 20 7a 54 79 70 65 3d 3d 30 20  .  if( zType==0 
a030: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
a040: 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
a050: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
a060: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
a070: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 43  ;.    assert( iC
a080: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
a090: 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
a0a0: 69 66 28 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  if( (pTab->aCol[
a0b0: 69 43 6f 6c 5d 2e 73 6f 72 74 4f 72 64 65 72 20  iCol].sortOrder 
a0c0: 26 20 53 51 4c 49 54 45 5f 53 4f 5f 54 59 50 45  & SQLITE_SO_TYPE
a0d0: 4d 41 53 4b 29 3d 3d 53 51 4c 49 54 45 5f 53 4f  MASK)==SQLITE_SO
a0e0: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 7a  _TEXT ){.      z
a0f0: 54 79 70 65 5b 69 5d 20 3d 20 27 74 27 3b 0a 20  Type[i] = 't';. 
a100: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a110: 7a 54 79 70 65 5b 69 5d 20 3d 20 27 6e 27 3b 0a  zType[i] = 'n';.
a120: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 54 79 70      }.  }.  zTyp
a130: 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  e[n] = 0;.  sqli
a140: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
a150: 76 2c 20 2d 31 2c 20 7a 54 79 70 65 2c 20 6e 29  v, -1, zType, n)
a160: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
a170: 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Type);.}../*.** 
a180: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a190: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
a1a0: 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b   a new foreign k
a1b0: 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a  ey on the table.
a1c0: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  ** currently und
a1d0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
a1e0: 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72    pFromCol deter
a1f0: 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75  mines which colu
a200: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75  mns.** in the cu
a210: 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e  rrent table poin
a220: 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e  t to the foreign
a230: 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43   key.  If pFromC
a240: 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f  ol==0 then.** co
a250: 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f  nnect the key to
a260: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
a270: 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20   inserted.  pTo 
a280: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a  is the name of.*
a290: 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65  * the table refe
a2a0: 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c  rred to.  pToCol
a2b0: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 61   is a list of ta
a2c0: 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68 65  bles in the othe
a2d0: 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20 74  r.** pTo table t
a2e0: 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20  hat the foreign 
a2f0: 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  key points to.  
a300: 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61  flags contains a
a310: 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
a320: 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66  n about the conf
a330: 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
a340: 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69  algorithms speci
a350: 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  fied.** in the O
a360: 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44  N DELETE, ON UPD
a370: 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52  ATE and ON INSER
a380: 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  T clauses..**.**
a390: 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75   An FKey structu
a3a0: 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  re is created an
a3b0: 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  d added to the t
a3c0: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a  able currently.*
a3d0: 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  * under construc
a3e0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72  tion in the pPar
a3f0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69  se->pNewTable fi
a400: 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20 46 4b  eld.  The new FK
a410: 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e  ey.** is not lin
a420: 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b  ked into db->aFK
a430: 65 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ey at this point
a440: 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74   - that does not
a450: 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c   happen.** until
a460: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
a470: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ()..**.** The fo
a480: 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74  reign key is set
a490: 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70   for IMMEDIATE p
a4a0: 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75  rocessing.  A su
a4b0: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a  bsequent call.**
a4c0: 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72   to sqlite3Defer
a4d0: 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67  ForeignKey() mig
a4e0: 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74  ht change this t
a4f0: 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76  o DEFERRED..*/.v
a500: 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
a510: 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50  eForeignKey(.  P
a520: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
a530: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
a540: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 64 4c 69  ontext */.  IdLi
a550: 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 20  st *pFromCol,   
a560: 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
a570: 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70  his table that p
a580: 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61  oint to other ta
a590: 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
a5a0: 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  pTo,          /*
a5b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68   Name of the oth
a5c0: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 64  er table */.  Id
a5d0: 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20  List *pToCol,   
a5e0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e     /* Columns in
a5f0: 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
a600: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
a610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
a620: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
a630: 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f  n algorithms. */
a640: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d  .){.  Table *p =
a650: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
a660: 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  le;.  int nByte;
a670: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
a680: 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nCol;.  char *z;
a690: 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d  .  FKey *pFKey =
a6a0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
a6b0: 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
a6c0: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
a6d0: 45 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  Err ) goto fk_en
a6e0: 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  d;.  if( pFromCo
a6f0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  l==0 ){.    int 
a700: 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  iCol = p->nCol-1
a710: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  ;.    if( iCol<0
a720: 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
a730: 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26      if( pToCol &
a740: 26 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 31  & pToCol->nId!=1
a750: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a760: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a770: 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  , "foreign key o
a780: 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22  n %s".         "
a790: 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63   should referenc
a7a0: 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d  e only one colum
a7b0: 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a  n of table %T",.
a7c0: 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c           p->aCol
a7d0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54  [iCol].zName, pT
a7e0: 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  o);.      goto f
a7f0: 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  k_end;.    }.   
a800: 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c   nCol = 1;.  }el
a810: 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26  se if( pToCol &&
a820: 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 70 46   pToCol->nId!=pF
a830: 72 6f 6d 43 6f 6c 2d 3e 6e 49 64 20 29 7b 0a 20  romCol->nId ){. 
a840: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
a850: 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
a860: 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f     "number of co
a870: 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
a880: 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
a890: 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
a8a0: 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c  f ".        "col
a8b0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
a8c0: 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a  renced table");.
a8d0: 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
a8e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
a8f0: 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  ol = pFromCol->n
a900: 49 64 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20  Id;.  }.  nByte 
a910: 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29  = sizeof(*pFKey)
a920: 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70   + nCol*sizeof(p
a930: 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b  FKey->aCol[0]) +
a940: 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69   pTo->n + 1;.  i
a950: 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
a960: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43   for(i=0; i<pToC
a970: 6f 6c 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  ol->nId; i++){. 
a980: 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74       nByte += st
a990: 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  rlen(pToCol->a[i
a9a0: 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ].zName) + 1;.  
a9b0: 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20    }.  }.  pFKey 
a9c0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
a9d0: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70  nByte );.  if( p
a9e0: 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 66  FKey==0 ) goto f
a9f0: 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d 3e  k_end;.  pFKey->
aa00: 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b  pFrom = p;.  pFK
aa10: 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20  ey->pNextFrom = 
aa20: 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20  p->pFKey;.  z = 
aa30: 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d  (char*)&pFKey[1]
aa40: 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20  ;.  pFKey->aCol 
aa50: 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61  = (struct sColMa
aa60: 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a  p*)z;.  z += siz
aa70: 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d  eof(struct sColM
aa80: 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65  ap)*nCol;.  pFKe
aa90: 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65  y->zTo = z;.  me
aaa0: 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20  mcpy(z, pTo->z, 
aab0: 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f  pTo->n);.  z[pTo
aac0: 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d  ->n] = 0;.  z +=
aad0: 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b   pTo->n+1;.  pFK
aae0: 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b  ey->pNextTo = 0;
aaf0: 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d  .  pFKey->nCol =
ab00: 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72   nCol;.  if( pFr
ab10: 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
ab20: 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69  pFKey->aCol[0].i
ab30: 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  From = p->nCol-1
ab40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
ab50: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
ab60: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
ab70: 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
ab80: 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  ; j<p->nCol; j++
ab90: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
aba0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d  qlite3StrICmp(p-
abb0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[j].zName, 
abc0: 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
abd0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
abe0: 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
abf0: 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a  l[i].iFrom = j;.
ac00: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
ac10: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ac20: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d   }.      if( j>=
ac30: 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  p->nCol ){.     
ac40: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
ac50: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
ac60: 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63        "unknown c
ac70: 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20  olumn \"%s\" in 
ac80: 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
ac90: 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20  nition", .      
aca0: 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b      pFromCol->a[
acb0: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
acc0: 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
acd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ace0: 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  }.  if( pToCol )
acf0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
ad00: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
ad10: 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65     int n = strle
ad20: 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  n(pToCol->a[i].z
ad30: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b  Name);.      pFK
ad40: 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c  ey->aCol[i].zCol
ad50: 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63   = z;.      memc
ad60: 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b  py(z, pToCol->a[
ad70: 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20  i].zName, n);.  
ad80: 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20      z[n] = 0;.  
ad90: 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20      z += n+1;.  
ada0: 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d    }.  }.  pFKey-
adb0: 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b  >isDeferred = 0;
adc0: 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65  .  pFKey->delete
add0: 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30  Conf = flags & 0
ade0: 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70  xff;.  pFKey->up
adf0: 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67  dateConf = (flag
ae00: 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b  s >> 8 ) & 0xff;
ae10: 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74  .  pFKey->insert
ae20: 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e  Conf = (flags >>
ae30: 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20   16 ) & 0xff;.. 
ae40: 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72   /* Link the for
ae50: 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20  eign key to the 
ae60: 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73  table as the las
ae70: 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70  t step..  */.  p
ae80: 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b  ->pFKey = pFKey;
ae90: 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66  .  pFKey = 0;..f
aea0: 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46  k_end:.  sqliteF
aeb0: 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 73 71  ree(pFKey);.  sq
aec0: 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
aed0: 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73  e(pFromCol);.  s
aee0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
aef0: 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f  te(pToCol);.}../
af00: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
af10: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
af20: 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d   an INITIALLY IM
af30: 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49  MEDIATE or INITI
af40: 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a  ALLY DEFERRED.**
af50: 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20   clause is seen 
af60: 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72  as part of a for
af70: 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
af80: 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65  ion.  The isDefe
af90: 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  rred.** paramete
afa0: 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49  r is 1 for INITI
afb0: 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e  ALLY DEFERRED an
afc0: 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  d 0 for INITIALL
afd0: 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20  Y IMMEDIATE..** 
afe0: 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  The behavior of 
aff0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
b000: 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67  y created foreig
b010: 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65  n key is adjuste
b020: 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79  d.** accordingly
b030: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b040: 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
b050: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
b060: 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b  int isDeferred){
b070: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
b080: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20    FKey *pFKey;. 
b090: 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61   if( (pTab = pPa
b0a0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
b0b0: 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70  =0 || (pFKey = p
b0c0: 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29  Tab->pFKey)==0 )
b0d0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79   return;.  pFKey
b0e0: 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 69  ->isDeferred = i
b0f0: 73 44 65 66 65 72 72 65 64 3b 0a 7d 0a 0a 2f 2a  sDeferred;.}../*
b100: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
b110: 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51   index for an SQ
b120: 4c 20 74 61 62 6c 65 2e 20 20 70 49 6e 64 65 78  L table.  pIndex
b130: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
b140: 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e  the index .** an
b150: 64 20 70 54 61 62 6c 65 20 69 73 20 74 68 65 20  d pTable is the 
b160: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
b170: 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
b180: 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77  indexed.  Both w
b190: 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20  ill .** be NULL 
b1a0: 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65  for a primary ke
b1b0: 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68  y or an index th
b1c0: 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f  at is created to
b1d0: 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e   satisfy a.** UN
b1e0: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
b1f0: 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20    If pTable and 
b200: 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c  pIndex are NULL,
b210: 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   use pParse->pNe
b220: 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65  wTable.** as the
b230: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
b240: 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70  exed.  pParse->p
b250: 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61  NewTable is a ta
b260: 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63  ble that is.** c
b270: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
b280: 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20  onstructed by a 
b290: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
b2a0: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  tement..**.** pL
b2b0: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
b2c0: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
b2d0: 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77  ndexed.  pList w
b2e0: 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74  ill be NULL if t
b2f0: 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d  his.** is a prim
b300: 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75  ary key or uniqu
b310: 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e-constraint on 
b320: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
b330: 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20  column added.** 
b340: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
b350: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
b360: 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a  struction.  .*/.
b370: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
b380: 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  teIndex(.  Parse
b390: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 41   *pParse,   /* A
b3a0: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
b3b0: 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20  bout this parse 
b3c0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
b3d0: 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  e,    /* Name of
b3e0: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 79   the index.  May
b3f0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72   be NULL */.  Sr
b400: 63 4c 69 73 74 20 2a 70 54 61 62 6c 65 2c 20 2f  cList *pTable, /
b410: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
b420: 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 20 55  ble to index.  U
b430: 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
b440: 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 49  able if 0 */.  I
b450: 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  dList *pList,   
b460: 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c  /* A list of col
b470: 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
b480: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ed */.  int onEr
b490: 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f 45 5f 41  ror,     /* OE_A
b4a0: 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  bort, OE_Ignore,
b4b0: 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20   OE_Replace, or 
b4c0: 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b  OE_None */.  Tok
b4d0: 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a  en *pStart,   /*
b4e0: 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
b4f0: 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 61 20  n that begins a 
b500: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
b510: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
b520: 6e 20 2a 70 45 6e 64 20 20 20 20 20 20 2f 2a 20  n *pEnd      /* 
b530: 54 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f  The ")" that clo
b540: 73 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49  ses the CREATE I
b550: 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
b560: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
b570: 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ab;     /* Table
b580: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
b590: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
b5a0: 78 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  x;   /* The inde
b5b0: 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  x to be created 
b5c0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
b5d0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a   = 0;.  int i, j
b5e0: 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64  ;.  Token nullId
b5f0: 3b 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b  ;    /* Fake tok
b600: 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20  en for an empty 
b610: 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46  ID list */.  DbF
b620: 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 2f 2a  ixer sFix;    /*
b630: 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64   For assigning d
b640: 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f  atabase names to
b650: 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   pTable */.  int
b660: 20 69 73 54 65 6d 70 3b 20 20 20 20 20 20 2f 2a   isTemp;      /*
b670: 20 54 72 75 65 20 66 6f 72 20 61 20 74 65 6d 70   True for a temp
b680: 6f 72 61 72 79 20 69 6e 64 65 78 20 2a 2f 0a 20  orary index */. 
b690: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
b6a0: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
b6b0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
b6c0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
b6d0: 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78  failed ) goto ex
b6e0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
b6f0: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
b700: 62 75 73 79 20 0a 20 20 20 20 20 26 26 20 73 71  busy .     && sq
b710: 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
b720: 69 78 2c 20 70 50 61 72 73 65 2c 20 64 62 2d 3e  ix, pParse, db->
b730: 69 6e 69 74 2e 69 44 62 2c 20 22 69 6e 64 65 78  init.iDb, "index
b740: 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20 20 26  ", pName).     &
b750: 26 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c  & sqlite3FixSrcL
b760: 69 73 74 28 26 73 46 69 78 2c 20 70 54 61 62 6c  ist(&sFix, pTabl
b770: 65 29 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f  e).  ){.    goto
b780: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
b790: 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ex;.  }..  /*.  
b7a0: 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c  ** Find the tabl
b7b0: 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
b7c0: 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e  indexed.  Return
b7d0: 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f   early if not fo
b7e0: 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  und..  */.  if( 
b7f0: 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20  pTable!=0 ){.   
b800: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 21 3d   assert( pName!=
b810: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
b820: 20 70 54 61 62 6c 65 2d 3e 6e 53 72 63 3d 3d 31   pTable->nSrc==1
b830: 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20   );.    pTab =  
b840: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f  sqlite3SrcListLo
b850: 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 61  okup(pParse, pTa
b860: 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ble);.  }else{. 
b870: 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
b880: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20  ==0 );.    pTab 
b890: 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  =  pParse->pNewT
b8a0: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
b8b0: 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73  pTab==0 || pPars
b8c0: 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65  e->nErr ) goto e
b8d0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
b8e0: 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65  ;.  if( pTab->re
b8f0: 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71  adOnly ){.    sq
b900: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
b910: 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
b920: 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
b930: 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
b940: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
b950: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
b960: 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69   }.  if( pTab->i
b970: 44 62 3e 3d 32 20 26 26 20 64 62 2d 3e 69 6e 69  Db>=2 && db->ini
b980: 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20  t.busy==0 ){.   
b990: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
b9a0: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
b9b0: 25 73 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  %s may not have 
b9c0: 69 6e 64 69 63 65 73 20 61 64 64 65 64 22 2c 20  indices added", 
b9d0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
b9e0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
b9f0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
ba00: 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
ba10: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
ba20: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
ba30: 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20   "views may not 
ba40: 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
ba50: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
ba60: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
ba70: 69 73 54 65 6d 70 20 3d 20 70 54 61 62 2d 3e 69  isTemp = pTab->i
ba80: 44 62 3d 3d 31 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  Db==1;..  /*.  *
ba90: 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20  * Find the name 
baa0: 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d  of the index.  M
bab0: 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
bac0: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e  s not already an
bad0: 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78  other.  ** index
bae0: 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74   or table with t
baf0: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a  he same name.  .
bb00: 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74    **.  ** Except
bb10: 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20  ion:  If we are 
bb20: 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65  reading the name
bb30: 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69  s of permanent i
bb40: 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a  ndices from the.
bb50: 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74    ** sqlite_mast
bb60: 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73  er table (becaus
bb70: 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
bb80: 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65  cess changed the
bb90: 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a   schema) and.  *
bba0: 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64  * one of the ind
bbb0: 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65  ex names collide
bbc0: 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20  s with the name 
bbd0: 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  of a temporary t
bbe0: 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64  able or.  ** ind
bbf0: 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ex, then we will
bc00: 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f   continue to pro
bc10: 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e  cess this index.
bc20: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e  .  **.  ** If pN
bc30: 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
bc40: 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a  that we are.  **
bc50: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
bc60: 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55  primary key or U
bc70: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
bc80: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  .  We have to in
bc90: 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77  vent our.  ** ow
bca0: 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  n name..  */.  i
bcb0: 66 28 20 70 4e 61 6d 65 20 26 26 20 21 64 62 2d  f( pName && !db-
bcc0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
bcd0: 20 20 49 6e 64 65 78 20 2a 70 49 53 61 6d 65 4e    Index *pISameN
bce0: 61 6d 65 3b 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ame;    /* Anoth
bcf0: 65 72 20 69 6e 64 65 78 20 77 69 74 68 20 74 68  er index with th
bd00: 65 20 73 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20  e same name */. 
bd10: 20 20 20 54 61 62 6c 65 20 2a 70 54 53 61 6d 65     Table *pTSame
bd20: 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74 61  Name;    /* A ta
bd30: 62 6c 65 20 77 69 74 68 20 73 61 6d 65 20 6e 61  ble with same na
bd40: 6d 65 20 61 73 20 74 68 65 20 69 6e 64 65 78 20  me as the index 
bd50: 2a 2f 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  */.    zName = s
bd60: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e 61  qliteStrNDup(pNa
bd70: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
bd80: 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
bd90: 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
bda0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
bdb0: 20 69 66 28 20 28 70 49 53 61 6d 65 4e 61 6d 65   if( (pISameName
bdc0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
bdd0: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  dex(db, zName, 0
bde0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ))!=0 ){.      s
bdf0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
be00: 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73  Parse, "index %s
be10: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
be20: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
be30: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
be40: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
be50: 20 20 69 66 28 20 28 70 54 53 61 6d 65 4e 61 6d    if( (pTSameNam
be60: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  e = sqlite3FindT
be70: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
be80: 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  0))!=0 ){.      
be90: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
bea0: 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69  pParse, "there i
beb0: 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c  s already a tabl
bec0: 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61  e named %s", zNa
bed0: 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  me);.      goto 
bee0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
bef0: 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  x;.    }.  }else
bf00: 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30 20 29 7b   if( pName==0 ){
bf10: 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33  .    char zBuf[3
bf20: 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  0];.    int n;. 
bf30: 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b     Index *pLoop;
bf40: 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
bf50: 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31  Tab->pIndex, n=1
bf60: 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
bf70: 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b  Loop->pNext, n++
bf80: 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28  ){}.    sprintf(
bf90: 7a 42 75 66 2c 22 25 64 29 22 2c 6e 29 3b 0a 20  zBuf,"%d)",n);. 
bfa0: 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20     zName = 0;.  
bfb0: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
bfc0: 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 28 22 2c 20  ng(&zName, "(", 
bfd0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 20 61  pTab->zName, " a
bfe0: 75 74 6f 69 6e 64 65 78 20 22 2c 20 7a 42 75 66  utoindex ", zBuf
bff0: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
c000: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
c010: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
c020: 5f 69 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b  _index;.  }else{
c030: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
c040: 69 74 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65  iteStrNDup(pName
c050: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a  ->z, pName->n);.
c060: 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
c070: 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  for authorizatio
c080: 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69  n to create an i
c090: 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  ndex..  */.#ifnd
c0a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
c0b0: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
c0c0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
c0d0: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70  *zDb = db->aDb[p
c0e0: 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b  Tab->iDb].zName;
c0f0: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ..    assert( pT
c100: 61 62 2d 3e 69 44 62 3d 3d 64 62 2d 3e 69 6e 69  ab->iDb==db->ini
c110: 74 2e 69 44 62 20 7c 7c 20 69 73 54 65 6d 70 20  t.iDb || isTemp 
c120: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
c130: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
c140: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
c150: 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
c160: 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29  isTemp), 0, zDb)
c170: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
c180: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
c190: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  ;.    }.    i = 
c1a0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
c1b0: 44 45 58 3b 0a 20 20 20 20 69 66 28 20 69 73 54  DEX;.    if( isT
c1c0: 65 6d 70 20 29 20 69 20 3d 20 53 51 4c 49 54 45  emp ) i = SQLITE
c1d0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
c1e0: 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
c1f0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
c200: 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70  rse, i, zName, p
c210: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
c220: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
c230: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
c240: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
c250: 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73  if..  /* If pLis
c260: 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74  t==0, it means t
c270: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
c280: 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61  called to make a
c290: 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65   primary.  ** ke
c2a0: 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73  y out of the las
c2b0: 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74  t column added t
c2c0: 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65  o the table unde
c2d0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
c2e0: 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61    ** So create a
c2f0: 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69   fake list to si
c300: 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a  mulate this..  *
c310: 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  /.  if( pList==0
c320: 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a   ){.    nullId.z
c330: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54   = pTab->aCol[pT
c340: 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d  ab->nCol-1].zNam
c350: 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20  e;.    nullId.n 
c360: 3d 20 73 74 72 6c 65 6e 28 6e 75 6c 6c 49 64 2e  = strlen(nullId.
c370: 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  z);.    pList = 
c380: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70  sqlite3IdListApp
c390: 65 6e 64 28 30 2c 20 26 6e 75 6c 6c 49 64 29 3b  end(0, &nullId);
c3a0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
c3b0: 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
c3c0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
c3d0: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f  .  /* .  ** Allo
c3e0: 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73  cate the index s
c3f0: 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a  tructure. .  */.
c400: 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
c410: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
c420: 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e 28  Index) + strlen(
c430: 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20 20 20  zName) + 1 +.   
c440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c450: 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29       sizeof(int)
c460: 2a 70 4c 69 73 74 2d 3e 6e 49 64 20 29 3b 0a 20  *pList->nId );. 
c470: 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
c480: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
c490: 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49 6e 64 65  e_index;.  pInde
c4a0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69  x->aiColumn = (i
c4b0: 6e 74 2a 29 26 70 49 6e 64 65 78 5b 31 5d 3b 0a  nt*)&pIndex[1];.
c4c0: 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20    pIndex->zName 
c4d0: 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78  = (char*)&pIndex
c4e0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74  ->aiColumn[pList
c4f0: 2d 3e 6e 49 64 5d 3b 0a 20 20 73 74 72 63 70 79  ->nId];.  strcpy
c500: 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20  (pIndex->zName, 
c510: 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78  zName);.  pIndex
c520: 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b  ->pTable = pTab;
c530: 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  .  pIndex->nColu
c540: 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 49 64 3b  mn = pList->nId;
c550: 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  .  pIndex->onErr
c560: 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20  or = onError;.  
c570: 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65  pIndex->autoInde
c580: 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20 20  x = pName==0;.  
c590: 70 49 6e 64 65 78 2d 3e 69 44 62 20 3d 20 69 73  pIndex->iDb = is
c5a0: 54 65 6d 70 20 3f 20 31 20 3a 20 64 62 2d 3e 69  Temp ? 1 : db->i
c5b0: 6e 69 74 2e 69 44 62 3b 0a 0a 20 20 2f 2a 20 53  nit.iDb;..  /* S
c5c0: 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  can the names of
c5d0: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
c5e0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
c5f0: 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a  indexed and.  **
c600: 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e   load the column
c610: 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68   indices into th
c620: 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  e Index structur
c630: 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72  e.  Report an er
c640: 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  ror.  ** if any 
c650: 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f  column is not fo
c660: 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  und..  */.  for(
c670: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
c680: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  d; i++){.    for
c690: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
c6a0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
c6b0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
c6c0: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
c6d0: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
c6e0: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [j].zName)==0 ) 
c6f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
c700: 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
c710: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
c720: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
c730: 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
c740: 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s no column name
c750: 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  d %s",.        p
c760: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69 73  Tab->zName, pLis
c770: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
c780: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
c790: 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  (pIndex);.      
c7a0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
c7b0: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
c7c0: 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
c7d0: 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 7d 0a 0a  mn[i] = j;.  }..
c7e0: 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65    /* Link the ne
c7f0: 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  w Index structur
c800: 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61  e to its table a
c810: 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a  nd to the other.
c820: 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    ** in-memory d
c830: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
c840: 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  es. .  */.  if( 
c850: 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
c860: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
c870: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
c880: 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  3HashInsert(&db-
c890: 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62  >aDb[pIndex->iDb
c8a0: 5d 2e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20  ].idxHash, .    
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8c0: 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
c8d0: 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65  me, strlen(pInde
c8e0: 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e  x->zName)+1, pIn
c8f0: 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20  dex);.    if( p 
c900: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
c910: 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f   p==pIndex );  /
c920: 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
c930: 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  ve failed */.   
c940: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49     sqliteFree(pI
c950: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 67 6f 74  ndex);.      got
c960: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
c970: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  dex;.    }.    d
c980: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
c990: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
c9a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
c9b0: 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78   adding an index
c9c0: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
c9d0: 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61  indices for a ta
c9e0: 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  ble, make.  ** s
c9f0: 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ure all indices 
ca00: 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61  labeled OE_Repla
ca10: 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c  ce come after al
ca20: 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a  l those labeled.
ca30: 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20    ** OE_Ignore. 
ca40: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
ca50: 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ry for the corre
ca60: 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ct operation of 
ca70: 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20  UPDATE.  ** and 
ca80: 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69  INSERT..  */.  i
ca90: 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  f( onError!=OE_R
caa0: 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e  eplace || pTab->
cab0: 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20  pIndex==0.      
cac0: 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
cad0: 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  ->onError==OE_Re
cae0: 70 6c 61 63 65 29 7b 0a 20 20 20 20 70 49 6e 64  place){.    pInd
caf0: 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62  ex->pNext = pTab
cb00: 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54  ->pIndex;.    pT
cb10: 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  ab->pIndex = pIn
cb20: 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dex;.  }else{.  
cb30: 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20    Index *pOther 
cb40: 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
cb50: 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65      while( pOthe
cb60: 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68  r->pNext && pOth
cb70: 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72  er->pNext->onErr
cb80: 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29  or!=OE_Replace )
cb90: 7b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d  {.      pOther =
cba0: 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
cbb0: 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
cbc0: 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72  ->pNext = pOther
cbd0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 70 4f 74  ->pNext;.    pOt
cbe0: 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  her->pNext = pIn
cbf0: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dex;.  }..  /* I
cc00: 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
cc10: 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e  usy is 1 it mean
cc20: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
cc30: 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
cc40: 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
cc50: 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74  ster" table on t
cc60: 68 65 20 64 69 73 6b 2e 20 20 53 6f 20 64 6f 20  he disk.  So do 
cc70: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
cc80: 20 64 69 73 6b 0a 20 20 2a 2a 20 61 67 61 69 6e   disk.  ** again
cc90: 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20 74  .  Extract the t
cca0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 66 72 6f 6d  able number from
ccb0: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65   the db->init.ne
ccc0: 77 54 6e 75 6d 20 66 69 65 6c 64 2e 0a 20 20 2a  wTnum field..  *
ccd0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
cce0: 2e 62 75 73 79 20 26 26 20 70 54 61 62 6c 65 21  .busy && pTable!
ccf0: 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78  =0 ){.    pIndex
cd00: 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69  ->tnum = db->ini
cd10: 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a  t.newTnum;.  }..
cd20: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
cd30: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 74  init.busy is 0 t
cd40: 68 65 6e 20 63 72 65 61 74 65 20 74 68 65 20 69  hen create the i
cd50: 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54  ndex on disk.  T
cd60: 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65  his.  ** involve
cd70: 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e  s writing the in
cd80: 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73  dex into the mas
cd90: 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69  ter table and fi
cda0: 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a  lling in the.  *
cdb0: 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65  * index with the
cdc0: 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63   current table c
cdd0: 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20  ontents..  **.  
cde0: 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e  ** The db->init.
cdf0: 62 75 73 79 20 69 73 20 30 20 77 68 65 6e 20 74  busy is 0 when t
ce00: 68 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e  he user first en
ce10: 74 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e  ters a CREATE IN
ce20: 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e  DEX .  ** comman
ce30: 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  d.  db->init.bus
ce40: 79 20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61  y is 1 when a da
ce50: 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
ce60: 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54   and .  ** CREAT
ce70: 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
ce80: 74 73 20 61 72 65 20 72 65 61 64 20 6f 75 74 20  ts are read out 
ce90: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  of the master ta
cea0: 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68  ble.  In.  ** th
ceb0: 65 20 6c 61 74 74 65 72 20 63 61 73 65 20 74 68  e latter case th
cec0: 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
ced0: 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20  exists on disk, 
cee0: 77 68 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a  which is why.  *
cef0: 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20  * we don't want 
cf00: 74 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a  to recreate it..
cf10: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 61    **.  ** If pTa
cf20: 62 6c 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ble==0 it means 
cf30: 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65  this index is ge
cf40: 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72 69  nerated as a pri
cf50: 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72  mary key.  ** or
cf60: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
cf70: 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20 54  nt of a CREATE T
cf80: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
cf90: 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65   Since the table
cfa0: 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62  .  ** has just b
cfb0: 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20  een created, it 
cfc0: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
cfd0: 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
cfe0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
cff0: 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73  ** step can be s
d000: 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  kipped..  */.  e
d010: 6c 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  lse if( db->init
d020: 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20  .busy==0 ){.    
d030: 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20  int n;.    Vdbe 
d040: 2a 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31  *v;.    int lbl1
d050: 2c 20 6c 62 6c 32 3b 0a 20 20 20 20 69 6e 74 20  , lbl2;.    int 
d060: 69 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b  i;.    int addr;
d070: 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
d080: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
d090: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
d0a0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
d0b0: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  e_index;.    if(
d0c0: 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20   pTable!=0 ){.  
d0d0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
d0e0: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
d0f0: 50 61 72 73 65 2c 20 30 2c 20 69 73 54 65 6d 70  Parse, 0, isTemp
d100: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d110: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
d120: 76 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20 20  v, isTemp);.    
d130: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
d140: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77  eAddOp(v, OP_New
d150: 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20  Recno, 0, 0);.  
d160: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
d170: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
d180: 2c 20 30 2c 20 22 69 6e 64 65 78 22 2c 20 50 33  , 0, "index", P3
d190: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
d1a0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
d1b0: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c  OP_String, 0, 0,
d1c0: 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
d1d0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
d1e0: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72  dbeOp3(v, OP_Str
d1f0: 69 6e 67 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  ing, 0, 0, pTab-
d200: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
d210: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
d220: 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  , OP_CreateIndex
d230: 2c 20 30 2c 20 69 73 54 65 6d 70 2c 28 63 68 61  , 0, isTemp,(cha
d240: 72 2a 29 26 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  r*)&pIndex->tnum
d250: 2c 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20  ,P3_POINTER);.  
d260: 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
d270: 20 30 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62   0;.    if( pTab
d280: 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  le ){.      sqli
d290: 74 65 33 56 64 62 65 43 6f 64 65 28 76 2c 0a 20  te3VdbeCode(v,. 
d2a0: 20 20 20 20 20 20 20 20 20 4f 50 5f 44 75 70 2c           OP_Dup,
d2b0: 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 30         0,      0
d2c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 4f 50 5f 49  ,.          OP_I
d2d0: 6e 74 65 67 65 72 2c 20 20 20 69 73 54 65 6d 70  nteger,   isTemp
d2e0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 4f  , 0,.          O
d2f0: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20  P_OpenWrite, 1, 
d300: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30 29       0,.      0)
d310: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72  ;.    }.    addr
d320: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
d330: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
d340: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
d350: 20 70 53 74 61 72 74 20 26 26 20 70 45 6e 64 20   pStart && pEnd 
d360: 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 41 64 64  ){.      n = Add
d370: 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64  r(pEnd->z) - Add
d380: 72 28 70 53 74 61 72 74 2d 3e 7a 29 20 2b 20 31  r(pStart->z) + 1
d390: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d3a0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
d3b0: 64 64 72 2c 20 70 53 74 61 72 74 2d 3e 7a 2c 20  ddr, pStart->z, 
d3c0: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  n);.    }.    sq
d3d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d3e0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
d3f0: 20 35 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   5, 0);.    sqli
d400: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d410: 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c  OP_PutIntKey, 0,
d420: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61   0);.    if( pTa
d430: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ble ){.      sql
d440: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d450: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61   OP_Integer, pTa
d460: 62 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20  b->iDb, 0);.    
d470: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
d480: 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
d490: 20 32 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20   2, pTab->tnum, 
d4a0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
d4b0: 0a 20 20 20 20 20 20 6c 62 6c 32 20 3d 20 73 71  .      lbl2 = sq
d4c0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
d4d0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
d4e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d4f0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 32 2c 20 6c   OP_Rewind, 2, l
d500: 62 6c 32 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31  bl2);.      lbl1
d510: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
d520: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c  dOp(v, OP_Recno,
d530: 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f   2, 0);.      fo
d540: 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d  r(i=0; i<pIndex-
d550: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
d560: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
d570: 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c   = pIndex->aiCol
d580: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  umn[i];.        
d590: 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d  if( pTab->iPKey=
d5a0: 3d 69 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  =iCol ){.       
d5b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d5c0: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 69  dOp(v, OP_Dup, i
d5d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 0);.        }e
d5e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
d5f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d600: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 32 2c  v, OP_Column, 2,
d610: 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   iCol);.        
d620: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
d630: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d640: 28 76 2c 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65  (v, OP_MakeIdxKe
d650: 79 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  y, pIndex->nColu
d660: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  mn, 0);.      if
d670: 28 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  ( db->file_forma
d680: 74 3e 3d 34 20 29 20 73 71 6c 69 74 65 33 41 64  t>=4 ) sqlite3Ad
d690: 64 49 64 78 4b 65 79 54 79 70 65 28 76 2c 20 70  dIdxKeyType(v, p
d6a0: 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 73 71  Index);.      sq
d6b0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
d6c0: 4f 50 5f 49 64 78 50 75 74 2c 20 31 2c 20 70 49  OP_IdxPut, 1, pI
d6d0: 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
d6e0: 45 5f 4e 6f 6e 65 2c 0a 20 20 20 20 20 20 20 20  E_None,.        
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 69                "i
d700: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61  ndexed columns a
d710: 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20  re not unique", 
d720: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
d730: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d740: 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 32  Op(v, OP_Next, 2
d750: 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 73  , lbl1);.      s
d760: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
d770: 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 32 29 3b  eLabel(v, lbl2);
d780: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d790: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
d7a0: 6f 73 65 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  ose, 2, 0);.    
d7b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d7c0: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
d7d0: 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 0);.    }.   
d7e0: 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29   if( pTable!=0 )
d7f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 54  {.      if( !isT
d800: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73  emp ){.        s
d810: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
d820: 69 65 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 20  ie(db, v);.     
d830: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
d840: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d850: 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Close, 0, 0);.  
d860: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 57 72      sqlite3EndWr
d870: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
d880: 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rse);.    }.  }.
d890: 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62  .  /* Clean up b
d8a0: 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
d8b0: 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64  .exit_create_ind
d8c0: 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 49 64 4c  ex:.  sqlite3IdL
d8d0: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
d8e0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  ;.  sqlite3SrcLi
d8f0: 73 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65 29  stDelete(pTable)
d900: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
d910: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Name);.  return;
d920: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
d930: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70  outine will drop
d940: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d   an existing nam
d950: 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20  ed index.  This 
d960: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65  routine.** imple
d970: 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49  ments the DROP I
d980: 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a  NDEX statement..
d990: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
d9a0: 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a  ropIndex(Parse *
d9b0: 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
d9c0: 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78  *pName){.  Index
d9d0: 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65   *pIndex;.  Vdbe
d9e0: 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64   *v;.  sqlite *d
d9f0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
da00: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
da10: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
da20: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
da30: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
da40: 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
da50: 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  );.  pIndex = sq
da60: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
da70: 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  b, pName->a[0].z
da80: 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
da90: 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
daa0: 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b  if( pIndex==0 ){
dab0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
dac0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
dad0: 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22   such index: %S"
dae0: 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , pName, 0);.   
daf0: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
db00: 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
db10: 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
db20: 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
db30: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
db40: 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61  , "index associa
db50: 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20  ted with UNIQUE 
db60: 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d  ".      "or PRIM
db70: 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
db80: 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f  nt cannot be dro
db90: 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67  pped", 0);.    g
dba0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
dbb0: 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dex;.  }.  if( p
dbc0: 49 6e 64 65 78 2d 3e 69 44 62 3e 31 20 29 7b 0a  Index->iDb>1 ){.
dbd0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
dbe0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
dbf0: 6e 6f 74 20 61 6c 74 65 72 20 73 63 68 65 6d 61  not alter schema
dc00: 20 6f 66 20 61 74 74 61 63 68 65 64 20 22 0a 20   of attached ". 
dc10: 20 20 20 20 20 20 22 64 61 74 61 62 61 73 65 73        "databases
dc20: 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ", 0);.    goto 
dc30: 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
dc40: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
dc50: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
dc60: 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
dc70: 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45  nt code = SQLITE
dc80: 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _DROP_INDEX;.   
dc90: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
dca0: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20  Index->pTable;. 
dcb0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
dcc0: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e  Db = db->aDb[pIn
dcd0: 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b  dex->iDb].zName;
dce0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
dcf0: 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
dd00: 41 42 4c 45 28 70 49 6e 64 65 78 2d 3e 69 44 62  ABLE(pIndex->iDb
dd10: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
dd20: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
dd30: 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
dd40: 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
dd50: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
dd60: 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
dd70: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
dd80: 6e 64 65 78 2d 3e 69 44 62 20 29 20 63 6f 64 65  ndex->iDb ) code
dd90: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
dda0: 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
ddb0: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
ddc0: 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
ddd0: 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
dde0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
ddf0: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
de00: 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
de10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
de20: 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
de30: 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
de40: 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66   the index and f
de50: 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
de60: 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71  able */.  v = sq
de70: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
de80: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
de90: 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
dea0: 4f 70 4c 69 73 74 20 64 72 6f 70 49 6e 64 65 78  OpList dropIndex
deb0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f  [] = {.      { O
dec0: 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c  P_Rewind,     0,
ded0: 20 41 44 44 52 28 39 29 2c 20 30 7d 2c 20 0a 20   ADDR(9), 0}, . 
dee0: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
def0: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
df00: 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20    0}, /* 1 */.  
df10: 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72      { OP_MemStor
df20: 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20  e,   1, 1,      
df30: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
df40: 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30  MemLoad,    1, 0
df50: 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33  ,       0}, /* 3
df60: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43   */.      { OP_C
df70: 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c  olumn,     0, 1,
df80: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
df90: 20 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20 20 20   { OP_Eq,       
dfa0: 20 20 30 2c 20 41 44 44 52 28 38 29 2c 20 30 7d    0, ADDR(8), 0}
dfb0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78  ,.      { OP_Nex
dfc0: 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52  t,       0, ADDR
dfd0: 28 33 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b  (3), 0},.      {
dfe0: 20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20   OP_Goto,       
dff0: 30 2c 20 41 44 44 52 28 39 29 2c 20 30 7d 2c 0a  0, ADDR(9), 0},.
e000: 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74        { OP_Delet
e010: 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  e,     0, 0,    
e020: 20 20 20 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20     0}, /* 8 */. 
e030: 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 62 61     };.    int ba
e040: 73 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  se;..    sqlite3
e050: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
e060: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ion(pParse, 0, p
e070: 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20  Index->iDb);.   
e080: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
e090: 65 72 54 61 62 6c 65 28 76 2c 20 70 49 6e 64 65  erTable(v, pInde
e0a0: 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 62 61 73  x->iDb);.    bas
e0b0: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  e = sqlite3VdbeA
e0c0: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
e0d0: 79 53 69 7a 65 28 64 72 6f 70 49 6e 64 65 78 29  ySize(dropIndex)
e0e0: 2c 20 64 72 6f 70 49 6e 64 65 78 29 3b 0a 20 20  , dropIndex);.  
e0f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
e100: 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31 2c  ngeP3(v, base+1,
e110: 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
e120: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64  0);.    if( pInd
e130: 65 78 2d 3e 69 44 62 3d 3d 30 20 29 7b 0a 20 20  ex->iDb==0 ){.  
e140: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
e150: 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a  eCookie(db, v);.
e160: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e170: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
e180: 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20  _Close, 0, 0);. 
e190: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e1a0: 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  dOp(v, OP_Destro
e1b0: 79 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  y, pIndex->tnum,
e1c0: 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20   pIndex->iDb);. 
e1d0: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 57 72 69     sqlite3EndWri
e1e0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
e1f0: 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  se);.  }..  /* D
e200: 65 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  elete the in-mem
e210: 6f 72 79 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ory description 
e220: 6f 66 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  of this index.. 
e230: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
e240: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
e250: 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41    sqlite3UnlinkA
e260: 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62  ndDeleteIndex(db
e270: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 64  , pIndex);.    d
e280: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
e290: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
e2a0: 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70  ;.  }..exit_drop
e2b0: 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65  _index:.  sqlite
e2c0: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
e2d0: 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
e2e0: 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65  Append a new ele
e2f0: 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65  ment to the give
e300: 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74  n IdList.  Creat
e310: 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69  e a new IdList i
e320: 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a  f.** need be..**
e330: 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74  .** A new IdList
e340: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
e350: 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
e360: 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69  ) fails..*/.IdLi
e370: 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
e380: 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a  tAppend(IdList *
e390: 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
e3a0: 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69  oken){.  if( pLi
e3b0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
e3c0: 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  st = sqliteMallo
e3d0: 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74  c( sizeof(IdList
e3e0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
e3f0: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
e400: 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
e410: 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  loc = 0;.  }.  i
e420: 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3e 3d 70  f( pList->nId>=p
e430: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  List->nAlloc ){.
e440: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
e450: 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 70  t_item *a;.    p
e460: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  List->nAlloc = p
e470: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b  List->nAlloc*2 +
e480: 20 35 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69   5;.    a = sqli
e490: 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d  teRealloc(pList-
e4a0: 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  >a, pList->nAllo
e4b0: 63 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  c*sizeof(pList->
e4c0: 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
e4d0: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   a==0 ){.      s
e4e0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
e4f0: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  te(pList);.     
e500: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
e510: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
e520: 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  a;.  }.  memset(
e530: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
e540: 3e 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >nId], 0, sizeof
e550: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
e560: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
e570: 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20      char **pz = 
e580: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
e590: 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >nId].zName;.   
e5a0: 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69   sqlite3SetNStri
e5b0: 6e 67 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a  ng(pz, pToken->z
e5c0: 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b  , pToken->n, 0);
e5d0: 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20  .    if( *pz==0 
e5e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e5f0: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  IdListDelete(pLi
e600: 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
e610: 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n 0;.    }else{.
e620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
e630: 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d  uote(*pz);.    }
e640: 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e 49  .  }.  pList->nI
e650: 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  d++;.  return pL
e660: 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  ist;.}../*.** Ap
e670: 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65  pend a new table
e680: 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76   name to the giv
e690: 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65  en SrcList.  Cre
e6a0: 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73  ate a new SrcLis
e6b0: 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
e6c0: 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
e6d0: 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
e6e0: 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20  SrcList even if 
e6f0: 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a  pToken is NULL..
e700: 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c  **.** A new SrcL
e710: 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
e720: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c   or NULL if mall
e730: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a  oc() fails..**.*
e740: 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69  * If pDatabase i
e750: 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d  s not null, it m
e760: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61  eans that the ta
e770: 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f  ble has an optio
e780: 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  nal.** database 
e790: 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69  name prefix.  Li
e7a0: 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62  ke this:  "datab
e7b0: 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65  ase.table".  The
e7c0: 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f   pDatabase.** po
e7d0: 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c  ints to the tabl
e7e0: 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70  e name and the p
e7f0: 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  Table points to 
e800: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
e810: 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73  e..** The SrcLis
e820: 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c  t.a[].zName fiel
e830: 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  d is filled with
e840: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
e850: 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63  which might.** c
e860: 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20  ome from pTable 
e870: 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73  (if pDatabase is
e880: 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70   NULL) or from p
e890: 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53  Database.  .** S
e8a0: 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61  rcList.a[].zData
e8b0: 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77  base is filled w
e8c0: 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
e8d0: 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   name from pTabl
e8e0: 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55  e,.** or with NU
e8f0: 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73  LL if no databas
e900: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a  e is specified..
e910: 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
e920: 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69  ords, if call li
e930: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
e940: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
e950: 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c  cListAppend(A,B,
e960: 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42  0);.**.** Then B
e970: 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   is a table name
e980: 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
e990: 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63  e name is unspec
e9a0: 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65  ified.  If calle
e9b0: 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a  d.** like this:.
e9c0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
e9d0: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
e9e0: 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a  nd(A,B,C);.**.**
e9f0: 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74   Then C is the t
ea00: 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20  able name and B 
ea10: 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
ea20: 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  name..*/.SrcList
ea30: 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
ea40: 41 70 70 65 6e 64 28 53 72 63 4c 69 73 74 20 2a  Append(SrcList *
ea50: 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
ea60: 61 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70 44 61  able, Token *pDa
ea70: 74 61 62 61 73 65 29 7b 0a 20 20 69 66 28 20 70  tabase){.  if( p
ea80: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
ea90: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  List = sqliteMal
eaa0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53 72 63 4c  loc( sizeof(SrcL
eab0: 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
eac0: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
ead0: 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  n 0;.    pList->
eae0: 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a  nAlloc = 1;.  }.
eaf0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 53 72    if( pList->nSr
eb00: 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  c>=pList->nAlloc
eb10: 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
eb20: 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73 74  *pNew;.    pList
eb30: 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20  ->nAlloc *= 2;. 
eb40: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
eb50: 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a 20  Realloc(pList,. 
eb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
eb70: 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20 28  zeof(*pList) + (
eb80: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29  pList->nAlloc-1)
eb90: 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61  *sizeof(pList->a
eba0: 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
ebb0: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
ebc0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
ebd0: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
ebe0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ebf0: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20    }.    pList = 
ec00: 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  pNew;.  }.  mems
ec10: 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69  et(&pList->a[pLi
ec20: 73 74 2d 3e 6e 53 72 63 5d 2c 20 30 2c 20 73 69  st->nSrc], 0, si
ec30: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
ec40: 29 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62  ));.  if( pDatab
ec50: 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65  ase && pDatabase
ec60: 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  ->z==0 ){.    pD
ec70: 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
ec80: 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
ec90: 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a 20 20   && pTable ){.  
eca0: 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d    Token *pTemp =
ecb0: 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20   pDatabase;.    
ecc0: 70 44 61 74 61 62 61 73 65 20 3d 20 70 54 61 62  pDatabase = pTab
ecd0: 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d  le;.    pTable =
ece0: 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 69 66   pTemp;.  }.  if
ecf0: 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
ed00: 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69  char **pz = &pLi
ed10: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
ed20: 63 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71  c].zName;.    sq
ed30: 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28  lite3SetNString(
ed40: 70 7a 2c 20 70 54 61 62 6c 65 2d 3e 7a 2c 20 70  pz, pTable->z, p
ed50: 54 61 62 6c 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20  Table->n, 0);.  
ed60: 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a    if( *pz==0 ){.
ed70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
ed80: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
ed90: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
eda0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
edb0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
edc0: 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20  te(*pz);.    }. 
edd0: 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61   }.  if( pDataba
ede0: 73 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  se ){.    char *
edf0: 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  *pz = &pList->a[
ee00: 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a 44 61  pList->nSrc].zDa
ee10: 74 61 62 61 73 65 3b 0a 20 20 20 20 73 71 6c 69  tabase;.    sqli
ee20: 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a  te3SetNString(pz
ee30: 2c 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 2c 20  , pDatabase->z, 
ee40: 70 44 61 74 61 62 61 73 65 2d 3e 6e 2c 20 30 29  pDatabase->n, 0)
ee50: 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30  ;.    if( *pz==0
ee60: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ee70: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
ee80: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
ee90: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
eea0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
eeb0: 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20  equote(*pz);.   
eec0: 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e   }.  }.  pList->
eed0: 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 69  a[pList->nSrc].i
eee0: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70  Cursor = -1;.  p
eef0: 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20  List->nSrc++;.  
ef00: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
ef10: 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75  ./*.** Assign cu
ef20: 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61 62  rsors to all tab
ef30: 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74  les in a SrcList
ef40: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
ef50: 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
ef60: 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  sors(Parse *pPar
ef70: 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  se, SrcList *pLi
ef80: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
ef90: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
efa0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
efb0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
efc0: 5d 2e 69 43 75 72 73 6f 72 3c 30 20 29 7b 0a 20  ].iCursor<0 ){. 
efd0: 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d       pList->a[i]
efe0: 2e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  .iCursor = pPars
eff0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d  e->nTab++;.    }
f000: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
f010: 64 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68  d an alias to th
f020: 65 20 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65  e last identifie
f030: 72 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69  r on the given i
f040: 64 65 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a  dentifier list..
f050: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
f060: 72 63 4c 69 73 74 41 64 64 41 6c 69 61 73 28 53  rcListAddAlias(S
f070: 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  rcList *pList, T
f080: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
f090: 20 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c   if( pList && pL
f0a0: 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20  ist->nSrc>0 ){. 
f0b0: 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74     int i = pList
f0c0: 2d 3e 6e 53 72 63 20 2d 20 31 3b 0a 20 20 20 20  ->nSrc - 1;.    
f0d0: 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e  sqlite3SetNStrin
f0e0: 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  g(&pList->a[i].z
f0f0: 41 6c 69 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a  Alias, pToken->z
f100: 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b  , pToken->n, 0);
f110: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
f120: 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ote(pList->a[i].
f130: 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a  zAlias);.  }.}..
f140: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
f150: 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  IdList..*/.void 
f160: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
f170: 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  ete(IdList *pLis
f180: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
f190: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
f1a0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
f1b0: 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
f1c0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ++){.    sqliteF
f1d0: 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
f1e0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zName);.  }.  sq
f1f0: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
f200: 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  a);.  sqliteFree
f210: 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pList);.}../*.*
f220: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
f230: 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74  ex in pList of t
f240: 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61  he identifier na
f250: 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e  med zId.  Return
f260: 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f   -1.** if not fo
f270: 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
f280: 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49  te3IdListIndex(I
f290: 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f  dList *pList, co
f2a0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
f2b0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
f2c0: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
f2d0: 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30  rn -1;.  for(i=0
f2e0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
f2f0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
f300: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
f310: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
f320: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
f330: 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
f340: 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
f350: 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
f360: 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69   SrcList includi
f370: 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74  ng all its subst
f380: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64  ructure..*/.void
f390: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
f3a0: 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20 2a 70  elete(SrcList *p
f3b0: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
f3c0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
f3d0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
f3e0: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  =0; i<pList->nSr
f3f0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  c; i++){.    sql
f400: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
f410: 5b 69 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [i].zDatabase);.
f420: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
f430: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
f440: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
f450: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  e(pList->a[i].zA
f460: 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lias);.    if( p
f470: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20  List->a[i].pTab 
f480: 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  && pList->a[i].p
f490: 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74  Tab->isTransient
f4a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f4b0: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  3DeleteTable(0, 
f4c0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  pList->a[i].pTab
f4d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
f4e0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
f4f0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  (pList->a[i].pSe
f500: 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  lect);.    sqlit
f510: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 4c 69  e3ExprDelete(pLi
f520: 73 74 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20  st->a[i].pOn);. 
f530: 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
f540: 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b  Delete(pList->a[
f550: 69 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a  i].pUsing);.  }.
f560: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
f570: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  st);.}../*.** Be
f580: 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  gin a transactio
f590: 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
f5a0: 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  3BeginTransactio
f5b0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
f5c0: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20   int onError){. 
f5d0: 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20   sqlite *db;..  
f5e0: 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
f5f0: 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
f600: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
f610: 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
f620: 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
f630: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
f640: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
f650: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
f660: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
f670: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
f680: 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47  RANSACTION, "BEG
f690: 49 4e 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  IN", 0, 0) ) ret
f6a0: 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66  urn;.  if( db->f
f6b0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
f6c0: 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 73 71 6c  Trans ){.    sql
f6d0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
f6e0: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 73 74 61  rse, "cannot sta
f6f0: 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
f700: 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
f710: 63 74 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74  ction");.    ret
f720: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
f730: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
f740: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
f750: 20 30 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72   0);.  if( !pPar
f760: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
f770: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
f780: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a  SQLITE_InTrans;.
f790: 20 20 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20      db->onError 
f7a0: 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 7d  = onError;.  }.}
f7b0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
f7c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
f7d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d  void sqlite3Comm
f7e0: 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  itTransaction(Pa
f7f0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
f800: 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69  sqlite *db;..  i
f810: 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
f820: 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
f830: 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d  =0 || db->aDb[0]
f840: 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
f850: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
f860: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f  nErr || sqlite3_
f870: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
f880: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71  return;.  if( sq
f890: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
f8a0: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
f8b0: 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d  ANSACTION, "COMM
f8c0: 49 54 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  IT", 0, 0) ) ret
f8d0: 75 72 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e  urn;.  if( (db->
f8e0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
f8f0: 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20  nTrans)==0 ){.  
f900: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
f910: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
f920: 74 20 63 6f 6d 6d 69 74 20 2d 20 6e 6f 20 74 72  t commit - no tr
f930: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
f940: 69 76 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ive");.    retur
f950: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  n;.  }.  if( !pP
f960: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
f970: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  .    db->flags &
f980: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e  = ~SQLITE_InTran
f990: 73 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  s;.  }.  sqlite3
f9a0: 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
f9b0: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  n(pParse);.  if(
f9c0: 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
f9d0: 6e 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6f 6e 45  n ){.    db->onE
f9e0: 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c  rror = OE_Defaul
f9f0: 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t;.  }.}../*.** 
fa00: 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  Rollback a trans
fa10: 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
fa20: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72  qlite3RollbackTr
fa30: 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
fa40: 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
fa50: 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  te *db;.  Vdbe *
fa60: 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  v;..  if( pParse
fa70: 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
fa80: 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
fa90: 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
faa0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
fab0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
fac0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
fad0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
fae0: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
faf0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
fb00: 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
fb10: 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c  , "ROLLBACK", 0,
fb20: 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   0) ) return;.  
fb30: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
fb40: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29   SQLITE_InTrans)
fb50: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
fb60: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
fb70: 65 2c 20 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62  e, "cannot rollb
fb80: 61 63 6b 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63  ack - no transac
fb90: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 29  tion is active")
fba0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 0a 20  ;.    return; . 
fbb0: 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
fbc0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
fbd0: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
fbe0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fbf0: 28 76 2c 20 4f 50 5f 52 6f 6c 6c 62 61 63 6b 2c  (v, OP_Rollback,
fc00: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   0, 0);.  }.  if
fc10: 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  ( !pParse->expla
fc20: 69 6e 20 29 7b 0a 20 20 20 20 64 62 2d 3e 66 6c  in ){.    db->fl
fc30: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
fc40: 6e 54 72 61 6e 73 3b 0a 20 20 20 20 64 62 2d 3e  nTrans;.    db->
fc50: 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66  onError = OE_Def
fc60: 61 75 6c 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ault;.  }.}../*.
fc70: 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
fc80: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
fc90: 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d  verify the schem
fca0: 61 20 63 6f 6f 6b 69 65 20 66 6f 72 20 61 6c 6c  a cookie for all
fcb0: 0a 2a 2a 20 6e 61 6d 65 64 20 64 61 74 61 62 61  .** named databa
fcc0: 73 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 76 6f 69  se files..*/.voi
fcd0: 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  d sqlite3CodeVer
fce0: 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20  ifySchema(Parse 
fcf0: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
fd00: 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  ){.  sqlite *db 
fd10: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
fd20: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
fd30: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
fd40: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
fd50: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
fd60: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  b );.  assert( d
fd70: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21  b->aDb[iDb].pBt!
fd80: 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 44 62 21  =0 );.  if( iDb!
fd90: 3d 31 20 26 26 20 21 44 62 48 61 73 50 72 6f 70  =1 && !DbHasProp
fda0: 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42  erty(db, iDb, DB
fdb0: 5f 43 6f 6f 6b 69 65 29 20 29 7b 0a 20 20 20 20  _Cookie) ){.    
fdc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fdd0: 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f  (v, OP_VerifyCoo
fde0: 6b 69 65 2c 20 69 44 62 2c 20 64 62 2d 3e 61 44  kie, iDb, db->aD
fdf0: 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f  b[iDb].schema_co
fe00: 6f 6b 69 65 29 3b 0a 20 20 20 20 44 62 53 65 74  okie);.    DbSet
fe10: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62  Property(db, iDb
fe20: 2c 20 44 42 5f 43 6f 6f 6b 69 65 29 3b 0a 20 20  , DB_Cookie);.  
fe30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
fe40: 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68  ate VDBE code th
fe50: 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20  at prepares for 
fe60: 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69  doing an operati
fe70: 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74  on that.** might
fe80: 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61   change the data
fe90: 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  base..**.** This
fea0: 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20   routine starts 
feb0: 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
fec0: 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  n if we are not 
fed0: 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a  already within.*
fee0: 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  * a transaction.
fef0: 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65    If we are alre
ff00: 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61  ady within a tra
ff10: 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61  nsaction, then a
ff20: 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69   checkpoint.** i
ff30: 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74  s set if the set
ff40: 43 68 65 63 6b 70 6f 69 6e 74 20 70 61 72 61 6d  Checkpoint param
ff50: 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41  eter is true.  A
ff60: 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
ff70: 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72  ld.** be set for
ff80: 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74   operations that
ff90: 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65   might fail (due
ffa0: 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   to a constraint
ffb0: 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  ) part of.** the
ffc0: 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64   way through and
ffd0: 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64   which will need
ffe0: 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72   to undo some wr
fff0: 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76  ites without hav
10000 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61  ing to.** rollba
10010 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  ck the whole tra
10020 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f  nsaction.  For o
10030 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20  perations where 
10040 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
10050 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65  ** can be checke
10060 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  d before any cha
10070 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
10080 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
10090 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65  t is never.** ne
100a0 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
100b0 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20  a write and the 
100c0 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
100d0 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a  d not be set..**
100e0 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73  .** Only databas
100f0 65 20 69 44 62 20 61 6e 64 20 74 68 65 20 74 65  e iDb and the te
10100 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20  mp database are 
10110 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 62 79  made writable by
10120 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49   this call..** I
10130 66 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74  f iDb==0, then t
10140 68 65 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70  he main and temp
10150 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 6d   databases are m
10160 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20  ade writable.   
10170 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65  If.** iDb==1 the
10180 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20  n only the temp 
10190 64 61 74 61 62 61 73 65 20 69 73 20 6d 61 64 65  database is made
101a0 20 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69   writable.  If i
101b0 44 62 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a  Db>1 then the.**
101c0 20 73 70 65 63 69 66 69 65 64 20 61 75 78 69 6c   specified auxil
101d0 69 61 72 79 20 64 61 74 61 62 61 73 65 20 61 6e  iary database an
101e0 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  d the temp datab
101f0 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69  ase are made wri
10200 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
10210 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
10220 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
10230 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74  *pParse, int set
10240 43 68 65 63 6b 70 6f 69 6e 74 2c 20 69 6e 74 20  Checkpoint, int 
10250 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  iDb){.  Vdbe *v;
10260 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
10270 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
10280 28 20 44 62 48 61 73 50 72 6f 70 65 72 74 79 28  ( DbHasProperty(
10290 64 62 2c 20 69 44 62 2c 20 44 42 5f 4c 6f 63 6b  db, iDb, DB_Lock
102a0 65 64 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ed) ) return;.  
102b0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
102c0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
102d0 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
102e0 0a 20 20 69 66 28 20 21 64 62 2d 3e 61 44 62 5b  .  if( !db->aDb[
102f0 69 44 62 5d 2e 69 6e 54 72 61 6e 73 20 29 7b 0a  iDb].inTrans ){.
10300 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10310 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73  ddOp(v, OP_Trans
10320 61 63 74 69 6f 6e 2c 20 69 44 62 2c 20 30 29 3b  action, iDb, 0);
10330 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72  .    DbSetProper
10340 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 4c  ty(db, iDb, DB_L
10350 6f 63 6b 65 64 29 3b 0a 20 20 20 20 73 71 6c 69  ocked);.    sqli
10360 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
10370 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
10380 3b 0a 20 20 20 20 69 66 28 20 69 44 62 21 3d 31  ;.    if( iDb!=1
10390 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
103a0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
103b0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 73 65 74  tion(pParse, set
103c0 43 68 65 63 6b 70 6f 69 6e 74 2c 20 31 29 3b 0a  Checkpoint, 1);.
103d0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
103e0 28 20 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 20  ( setCheckpoint 
103f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
10400 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 68  beAddOp(v, OP_Ch
10410 65 63 6b 70 6f 69 6e 74 2c 20 69 44 62 2c 20 30  eckpoint, iDb, 0
10420 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70  );.    DbSetProp
10430 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42  erty(db, iDb, DB
10440 5f 4c 6f 63 6b 65 64 29 3b 0a 20 20 7d 0a 7d 0a  _Locked);.  }.}.
10450 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
10460 63 6f 64 65 20 74 68 61 74 20 63 6f 6e 63 6c 75  code that conclu
10470 64 65 73 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  des an operation
10480 20 74 68 61 74 20 6d 61 79 20 68 61 76 65 20 63   that may have c
10490 68 61 6e 67 65 64 0a 2a 2a 20 74 68 65 20 64 61  hanged.** the da
104a0 74 61 62 61 73 65 2e 20 20 49 66 20 61 20 73 74  tabase.  If a st
104b0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
104c0 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2c  ion was started,
104d0 20 74 68 65 6e 20 65 6d 69 74 0a 2a 2a 20 61 6e   then emit.** an
104e0 20 4f 50 5f 43 6f 6d 6d 69 74 20 74 68 61 74 20   OP_Commit that 
104f0 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 63  will cause the c
10500 68 61 6e 67 65 73 20 74 6f 20 62 65 20 63 6f 6d  hanges to be com
10510 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a  mitted to disk..
10520 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
10530 63 68 65 63 6b 70 6f 69 6e 74 73 20 61 72 65 20  checkpoints are 
10540 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f  automatically co
10550 6d 6d 69 74 74 65 64 20 61 74 20 74 68 65 20 65  mmitted at the e
10560 6e 64 20 6f 66 0a 2a 2a 20 61 20 73 74 61 74 65  nd of.** a state
10570 6d 65 6e 74 2e 20 20 4e 6f 74 65 20 61 6c 73 6f  ment.  Note also
10580 20 74 68 61 74 20 74 68 65 72 65 20 63 61 6e 20   that there can 
10590 62 65 20 6d 75 6c 74 69 70 6c 65 20 63 61 6c 6c  be multiple call
105a0 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33  s to .** sqlite3
105b0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
105c0 69 6f 6e 28 29 20 62 75 74 20 74 68 65 72 65 20  ion() but there 
105d0 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 61  should only be a
105e0 20 73 69 6e 67 6c 65 0a 2a 2a 20 63 61 6c 6c 20   single.** call 
105f0 74 6f 20 73 71 6c 69 74 65 33 45 6e 64 57 72 69  to sqlite3EndWri
10600 74 65 4f 70 65 72 61 74 69 6f 6e 28 29 20 61 74  teOperation() at
10610 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
10620 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
10630 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10640 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  3EndWriteOperati
10650 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
10660 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
10670 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
10680 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
10690 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
106a0 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 69 66   ) return; /* if
106b0 20 74 68 69 73 20 69 73 20 69 6e 20 61 20 74 72   this is in a tr
106c0 69 67 67 65 72 20 2a 2f 0a 20 20 76 20 3d 20 73  igger */.  v = s
106d0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
106e0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
106f0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
10700 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
10710 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a  LITE_InTrans ){.
10720 20 20 20 20 2f 2a 20 41 20 42 45 47 49 4e 20 68      /* A BEGIN h
10730 61 73 20 65 78 65 63 75 74 65 64 2e 20 20 44 6f  as executed.  Do
10740 20 6e 6f 74 20 63 6f 6d 6d 69 74 20 75 6e 74 69   not commit unti
10750 6c 20 77 65 20 73 65 65 20 61 6e 20 65 78 70 6c  l we see an expl
10760 69 63 69 74 0a 20 20 20 20 2a 2a 20 43 4f 4d 4d  icit.    ** COMM
10770 49 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f  IT statement. */
10780 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
10790 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
107a0 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20  , OP_Commit, 0, 
107b0 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a           0);.  }.}....