/ Hex Artifact Content
Login

Artifact 21b6645c966970dac51bcccfa8650403a3f56210:


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 37 20 32 30 30 34 2f 30 35 2f 30 38 20 30  177 2004/05/08 0
0300: 38 3a 32 33 3a 32 33 20 64 61 6e 69 65 6c 6b 31  8:23:23 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 5f 6d  }.  if( sqlite_m
0870: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
0880: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 76 20 26  eturn;.  if( v &
0890: 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  & pParse->nErr==
08a0: 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74  0 ){.    FILE *t
08b0: 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67  race = (db->flag
08c0: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54  s & SQLITE_VdbeT
08d0: 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75  race)!=0 ? stdou
08e0: 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  t : 0;.    sqlit
08f0: 65 33 56 64 62 65 54 72 61 63 65 28 76 2c 20 74  e3VdbeTrace(v, t
0900: 72 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  race);.    sqlit
0910: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
0920: 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  v, pParse->nVar,
0930: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
0940: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  );.    pParse->r
0950: 63 20 3d 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  c = pParse->nErr
0960: 20 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20   ? SQLITE_ERROR 
0970: 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  : SQLITE_DONE;. 
0980: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61     pParse->colNa
0990: 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65  mesSet = 0;.  }e
09a0: 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e  lse if( pParse->
09b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
09c0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
09d0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
09e0: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54    }.  pParse->nT
09f0: 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ab = 0;.  pParse
0a00: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50  ->nMem = 0;.  pP
0a10: 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a  arse->nSet = 0;.
0a20: 20 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d    pParse->nAgg =
0a30: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56   0;.  pParse->nV
0a40: 61 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ar = 0;.}../*.**
0a50: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
0a60: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
0a70: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a  that describes .
0a80: 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ** a particular 
0a90: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 67  database table g
0aa0: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  iven the name.**
0ab0: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
0ac0: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
0ad0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
0ae0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 74  database.** cont
0af0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
0b00: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
0b10: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
0b20: 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20  ** If zDatabase 
0b30: 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61  is 0, all databa
0b40: 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64  ses are searched
0b50: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c   for the.** tabl
0b60: 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  e and the first 
0b70: 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69  matching table i
0b80: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f  s returned.  (No
0b90: 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72   checking.** for
0ba0: 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65   duplicate table
0bb0: 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29   names is done.)
0bc0: 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64    The search ord
0bd0: 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69  er is.** TEMP fi
0be0: 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20  rst, then MAIN, 
0bf0: 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61  then any auxilia
0c00: 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64  ry databases add
0c10: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ed.** using the 
0c20: 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a  ATTACH command..
0c30: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
0c40: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
0c50: 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  e()..*/.Table *s
0c60: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
0c70: 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73  sqlite *db, cons
0c80: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63  t char *zName, c
0c90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61  onst char *zData
0ca0: 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  base){.  Table *
0cb0: 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  p = 0;.  int i;.
0cc0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
0cd0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
0ce0: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
0cf0: 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65  i^1 : i;   /* Se
0d00: 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65  arch TEMP before
0d10: 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28   MAIN */.    if(
0d20: 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26   zDatabase!=0 &&
0d30: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
0d40: 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61  zDatabase, db->a
0d50: 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63  Db[j].zName) ) c
0d60: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d  ontinue;.    p =
0d70: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
0d80: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62 6c  (&db->aDb[j].tbl
0d90: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  Hash, zName, str
0da0: 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20  len(zName)+1);. 
0db0: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
0dc0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
0dd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
0de0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
0df0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
0e00: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
0e10: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
0e20: 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  se table given t
0e30: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68  he name.** of th
0e40: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
0e50: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
0e60: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
0e70: 73 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  se.** containing
0e80: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
0e90: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
0ea0: 66 6f 75 6e 64 2e 0a 2a 2a 20 41 6c 73 6f 20 6c  found..** Also l
0eb0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
0ec0: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
0ed0: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
0ee0: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
0ef0: 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
0f00: 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46  ine and sqlite3F
0f10: 69 6e 64 54 61 62 6c 65 28 29 0a 2a 2a 20 69 73  indTable().** is
0f20: 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
0f30: 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72  ne leaves an err
0f40: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
0f50: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 0a 2a 2a  arse->zErrMsg.**
0f60: 20 77 68 65 72 65 20 73 71 6c 69 74 65 33 46 69   where sqlite3Fi
0f70: 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e  ndTable() does n
0f80: 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ot..*/.Table *sq
0f90: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
0fa0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
0fb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
0fc0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
0fd0: 44 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20  Dbase){.  Table 
0fe0: 2a 70 3b 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74  *p;..  p = sqlit
0ff0: 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
1000: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  se->db, zName, z
1010: 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  Dbase);.  if( p=
1020: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 44  =0 ){.    if( zD
1030: 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71  base ){.      sq
1040: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1050: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
1060: 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20 7a 44  able: %s.%s", zD
1070: 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  base, zName);.  
1080: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
1090: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61  te3FindTable(pPa
10a0: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  rse->db, zName, 
10b0: 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  0)!=0 ){.      s
10c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
10d0: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 5c 22  Parse, "table \"
10e0: 25 73 5c 22 20 69 73 20 6e 6f 74 20 69 6e 20 64  %s\" is not in d
10f0: 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22 22 2c  atabase \"%s\"",
1100: 0a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c  .         zName,
1110: 20 7a 44 62 61 73 65 29 3b 0a 20 20 20 20 7d 65   zDbase);.    }e
1120: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
1130: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1140: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
1150: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
1160: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1170: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn p;.}../*.** L
1180: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
1190: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
11a0: 61 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a  at describes .**
11b0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e   a particular in
11c0: 64 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61  dex given the na
11d0: 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78  me of that index
11e0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65  .** and the name
11f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1200: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
1210: 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74  he index..** Ret
1220: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
1230: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  found..**.** If 
1240: 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20  zDatabase is 0, 
1250: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72  all databases ar
1260: 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
1270: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  he.** table and 
1280: 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
1290: 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65 74 75  ng index is retu
12a0: 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b  rned.  (No check
12b0: 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69  ing.** for dupli
12c0: 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73  cate index names
12d0: 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20   is done.)  The 
12e0: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a  search order is.
12f0: 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74  ** TEMP first, t
1300: 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61  hen MAIN, then a
1310: 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ny auxiliary dat
1320: 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20  abases added.** 
1330: 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48  using the ATTACH
1340: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64   command..*/.Ind
1350: 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49  ex *sqlite3FindI
1360: 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c  ndex(sqlite *db,
1370: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1380: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
1390: 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  zDb){.  Index *p
13a0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
13b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
13c0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
13d0: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
13e0: 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72  ^1 : i;  /* Sear
13f0: 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d  ch TEMP before M
1400: 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  AIN */.    if( z
1410: 44 62 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  Db && sqlite3Str
1420: 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44  ICmp(zDb, db->aD
1430: 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f  b[j].zName) ) co
1440: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20  ntinue;.    p = 
1450: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
1460: 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 69 64 78 48  &db->aDb[j].idxH
1470: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c  ash, zName, strl
1480: 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20  en(zName)+1);.  
1490: 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b    if( p ) break;
14a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
14b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
14c0: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
14d0: 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20   from the index 
14e0: 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64 20  hash table, and 
14f0: 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f  free.** its memo
1500: 72 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  ry structures..*
1510: 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69  *.** The index i
1520: 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
1530: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 68  he database hash
1540: 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69   tables but.** i
1550: 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65  t is not unlinke
1560: 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65  d from the Table
1570: 20 74 68 61 74 20 69 74 20 69 6e 64 65 78 65 73   that it indexes
1580: 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66  ..** Unlinking f
1590: 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d 75  rom the Table mu
15a0: 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74 68  st be done by th
15b0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
15c0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
15d0: 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49  id sqliteDeleteI
15e0: 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c  ndex(sqlite *db,
15f0: 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e   Index *p){.  In
1600: 64 65 78 20 2a 70 4f 6c 64 3b 0a 0a 20 20 61 73  dex *pOld;..  as
1610: 73 65 72 74 28 20 64 62 21 3d 30 20 26 26 20 70  sert( db!=0 && p
1620: 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ->zName!=0 );.  
1630: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
1640: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44  shInsert(&db->aD
1650: 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73  b[p->iDb].idxHas
1660: 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  h, 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 73 74 72 6c 65 6e 28 70 2d         strlen(p-
1690: 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20  >zName)+1, 0);. 
16a0: 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 26 26 20   if( pOld!=0 && 
16b0: 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20 73  pOld!=p ){.    s
16c0: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
16d0: 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62  (&db->aDb[p->iDb
16e0: 5d 2e 69 64 78 48 61 73 68 2c 20 70 4f 6c 64 2d  ].idxHash, pOld-
16f0: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
1710: 6c 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 29  len(pOld->zName)
1720: 2b 31 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d 0a 20  +1, pOld);.  }. 
1730: 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a   sqliteFree(p);.
1740: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
1750: 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20  the given index 
1760: 66 72 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c 20  from its table, 
1770: 74 68 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20 74  then remove.** t
1780: 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68  he index from th
1790: 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62  e index hash tab
17a0: 6c 65 20 61 6e 64 20 66 72 65 65 20 69 74 73 20  le and free its 
17b0: 6d 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63 74  memory.** struct
17c0: 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ures..*/.void sq
17d0: 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65  lite3UnlinkAndDe
17e0: 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65  leteIndex(sqlite
17f0: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 6e   *db, Index *pIn
1800: 64 65 78 29 7b 0a 20 20 69 66 28 20 70 49 6e 64  dex){.  if( pInd
1810: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
1820: 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20  ex==pIndex ){.  
1830: 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
1840: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
1850: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  x->pNext;.  }els
1860: 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  e{.    Index *p;
1870: 0a 20 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65  .    for(p=pInde
1880: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
1890: 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74  x; p && p->pNext
18a0: 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70  !=pIndex; p=p->p
18b0: 4e 65 78 74 29 7b 7d 0a 20 20 20 20 69 66 28 20  Next){}.    if( 
18c0: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70  p && p->pNext==p
18d0: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70  Index ){.      p
18e0: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
18f0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
1900: 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74   }.  sqliteDelet
1910: 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  eIndex(db, pInde
1920: 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61  x);.}../*.** Era
1930: 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e  se all schema in
1940: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
1950: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  he in-memory has
1960: 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 64  h tables of.** d
1970: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1980: 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  on.  This routin
1990: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  e is called to r
19a0: 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a  eclaim memory.**
19b0: 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f 6e 6e   before the conn
19c0: 65 63 74 69 6f 6e 20 63 6c 6f 73 65 73 2e 20 20  ection closes.  
19d0: 49 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65  It is also calle
19e0: 64 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  d during a rollb
19f0: 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ack.** if there 
1a00: 77 65 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e  were schema chan
1a10: 67 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74  ges during the t
1a20: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
1a30: 2a 20 49 66 20 69 44 62 3c 3d 30 20 74 68 65 6e  * If iDb<=0 then
1a40: 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65 72   reset the inter
1a50: 6e 61 6c 20 73 63 68 65 6d 61 20 74 61 62 6c 65  nal schema table
1a60: 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61  s for all databa
1a70: 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20 49 66  se.** files.  If
1a80: 20 69 44 62 3e 3d 32 20 74 68 65 6e 20 72 65 73   iDb>=2 then res
1a90: 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  et the internal 
1aa0: 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c 79 20  schema for only 
1ab0: 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 66 69  the.** single fi
1ac0: 6c 65 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f  le indicated..*/
1ad0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73  .void sqlite3Res
1ae0: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
1af0: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 69 6e 74  (sqlite *db, int
1b00: 20 69 44 62 29 7b 0a 20 20 48 61 73 68 45 6c 65   iDb){.  HashEle
1b10: 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68  m *pElem;.  Hash
1b20: 20 74 65 6d 70 31 3b 0a 20 20 48 61 73 68 20 74   temp1;.  Hash t
1b30: 65 6d 70 32 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  emp2;.  int i, j
1b40: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  ;..  assert( iDb
1b50: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
1b60: 44 62 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  Db );.  db->flag
1b70: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 69  s &= ~SQLITE_Ini
1b80: 74 69 61 6c 69 7a 65 64 3b 0a 20 20 66 6f 72 28  tialized;.  for(
1b90: 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44 62  i=iDb; i<db->nDb
1ba0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a  ; i++){.    Db *
1bb0: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
1bc0: 5d 3b 0a 20 20 20 20 74 65 6d 70 31 20 3d 20 70  ];.    temp1 = p
1bd0: 44 62 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 20  Db->tblHash;.   
1be0: 20 74 65 6d 70 32 20 3d 20 70 44 62 2d 3e 74 72   temp2 = pDb->tr
1bf0: 69 67 48 61 73 68 3b 0a 20 20 20 20 73 71 6c 69  igHash;.    sqli
1c00: 74 65 33 48 61 73 68 49 6e 69 74 28 26 70 44 62  te3HashInit(&pDb
1c10: 2d 3e 74 72 69 67 48 61 73 68 2c 20 53 51 4c 49  ->trigHash, SQLI
1c20: 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20  TE_HASH_STRING, 
1c30: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48  0);.    sqlite3H
1c40: 61 73 68 43 6c 65 61 72 28 26 70 44 62 2d 3e 61  ashClear(&pDb->a
1c50: 46 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  FKey);.    sqlit
1c60: 65 33 48 61 73 68 43 6c 65 61 72 28 26 70 44 62  e3HashClear(&pDb
1c70: 2d 3e 69 64 78 48 61 73 68 29 3b 0a 20 20 20 20  ->idxHash);.    
1c80: 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65  for(pElem=sqlite
1c90: 48 61 73 68 46 69 72 73 74 28 26 74 65 6d 70 32  HashFirst(&temp2
1ca0: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
1cb0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
1cc0: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 54 72  Elem)){.      Tr
1cd0: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 20  igger *pTrigger 
1ce0: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
1cf0: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 73  (pElem);.      s
1d00: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67  qlite3DeleteTrig
1d10: 67 65 72 28 70 54 72 69 67 67 65 72 29 3b 0a 20  ger(pTrigger);. 
1d20: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1d30: 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70 32  HashClear(&temp2
1d40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61  );.    sqlite3Ha
1d50: 73 68 49 6e 69 74 28 26 70 44 62 2d 3e 74 62 6c  shInit(&pDb->tbl
1d60: 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53  Hash, SQLITE_HAS
1d70: 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20  H_STRING, 0);.  
1d80: 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
1d90: 74 65 48 61 73 68 46 69 72 73 74 28 26 74 65 6d  teHashFirst(&tem
1da0: 70 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  p1); pElem; pEle
1db0: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
1dc0: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20  (pElem)){.      
1dd0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
1de0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
1df0: 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  em);.      sqlit
1e00: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
1e10: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  , pTab);.    }. 
1e20: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c     sqlite3HashCl
1e30: 65 61 72 28 26 74 65 6d 70 31 29 3b 0a 20 20 20  ear(&temp1);.   
1e40: 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79   DbClearProperty
1e50: 28 64 62 2c 20 69 2c 20 44 42 5f 53 63 68 65 6d  (db, i, DB_Schem
1e60: 61 4c 6f 61 64 65 64 29 3b 0a 20 20 20 20 69 66  aLoaded);.    if
1e70: 28 20 69 44 62 3e 30 20 29 20 72 65 74 75 72 6e  ( iDb>0 ) return
1e80: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1e90: 69 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e  iDb==0 );.  db->
1ea0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
1eb0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
1ec0: 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72 20  .  /* If one or 
1ed0: 6d 6f 72 65 20 6f 66 20 74 68 65 20 61 75 78 69  more of the auxi
1ee0: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66  liary database f
1ef0: 69 6c 65 73 20 68 61 73 20 62 65 65 6e 20 63 6c  iles has been cl
1f00: 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  osed,.  ** then 
1f10: 72 65 6d 6f 76 65 20 74 68 65 6e 20 66 72 6f 6d  remove then from
1f20: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64   the auxiliary d
1f30: 61 74 61 62 61 73 65 20 6c 69 73 74 2e 20 20 57  atabase list.  W
1f40: 65 20 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a 20  e take the.  ** 
1f50: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 64  opportunity to d
1f60: 6f 20 74 68 69 73 20 68 65 72 65 20 73 69 6e 63  o this here sinc
1f70: 65 20 77 65 20 68 61 76 65 20 6a 75 73 74 20 64  e we have just d
1f80: 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20 74 68  eleted all of th
1f90: 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 68 61  e.  ** schema ha
1fa0: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68  sh tables and th
1fb0: 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20 68  erefore do not h
1fc0: 61 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20  ave to make any 
1fd0: 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20  changes.  ** to 
1fe0: 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 74 61 62  any of those tab
1ff0: 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  les..  */.  for(
2000: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
2010: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
2020: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
2030: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[i];.    if( 
2040: 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20  pDb->pBt==0 ){. 
2050: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 41       if( pDb->pA
2060: 75 78 20 26 26 20 70 44 62 2d 3e 78 46 72 65 65  ux && pDb->xFree
2070: 41 75 78 20 29 20 70 44 62 2d 3e 78 46 72 65 65  Aux ) pDb->xFree
2080: 41 75 78 28 70 44 62 2d 3e 70 41 75 78 29 3b 0a  Aux(pDb->pAux);.
2090: 20 20 20 20 20 20 70 44 62 2d 3e 70 41 75 78 20        pDb->pAux 
20a0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
20b0: 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62   for(i=j=2; i<db
20c0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
20d0: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
20e0: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
20f0: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
2100: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2110: 74 65 46 72 65 65 28 70 44 62 2d 3e 7a 4e 61 6d  teFree(pDb->zNam
2120: 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a  e);.      pDb->z
2130: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
2140: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
2150: 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20      if( j<i ){. 
2160: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20       db->aDb[j] 
2170: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20  = db->aDb[i];.  
2180: 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d    }.    j++;.  }
2190: 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61  .  memset(&db->a
21a0: 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e  Db[j], 0, (db->n
21b0: 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d  Db-j)*sizeof(db-
21c0: 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d  >aDb[j]));.  db-
21d0: 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20  >nDb = j;.  if( 
21e0: 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62  db->nDb<=2 && db
21f0: 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74  ->aDb!=db->aDbSt
2200: 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63  atic ){.    memc
2210: 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63  py(db->aDbStatic
2220: 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a  , db->aDb, 2*siz
2230: 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29  eof(db->aDb[0]))
2240: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
2250: 28 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64  (db->aDb);.    d
2260: 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  b->aDb = db->aDb
2270: 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Static;.  }.}../
2280: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2290: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
22a0: 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20  ever a rollback 
22b0: 6f 63 63 75 72 73 2e 20 20 49 66 20 74 68 65 72  occurs.  If ther
22c0: 65 20 77 65 72 65 0a 2a 2a 20 73 63 68 65 6d 61  e were.** schema
22d0: 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20   changes during 
22e0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
22f0: 20 74 68 65 6e 20 77 65 20 68 61 76 65 20 74 6f   then we have to
2300: 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 69 6e   reset the.** in
2310: 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c  ternal hash tabl
2320: 65 73 20 61 6e 64 20 72 65 6c 6f 61 64 20 74 68  es and reload th
2330: 65 6d 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2f  em from disk..*/
2340: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
2350: 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43 68 61  lbackInternalCha
2360: 6e 67 65 73 28 73 71 6c 69 74 65 20 2a 64 62 29  nges(sqlite *db)
2370: 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67  {.  if( db->flag
2380: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72  s & SQLITE_Inter
2390: 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20  nChanges ){.    
23a0: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
23b0: 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30  rnalSchema(db, 0
23c0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
23d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
23e0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f  called when a co
23f0: 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  mmit occurs..*/.
2400: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d  void sqlite3Comm
2410: 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  itInternalChange
2420: 73 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20  s(sqlite *db){. 
2430: 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 63 68 65   db->aDb[0].sche
2440: 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e  ma_cookie = db->
2450: 6e 65 78 74 5f 63 6f 6f 6b 69 65 3b 0a 20 20 64  next_cookie;.  d
2460: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
2470: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
2480: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  s;.}../*.** Remo
2490: 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61  ve the memory da
24a0: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61 73  ta structures as
24b0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
24c0: 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65  e given.** Table
24d0: 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72  .  No changes ar
24e0: 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62  e made to disk b
24f0: 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  y this routine..
2500: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2510: 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20  ne just deletes 
2520: 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75  the data structu
2530: 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74  re.  It does not
2540: 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74   unlink.** the t
2550: 61 62 6c 65 20 64 61 74 61 20 73 74 72 75 63 74  able data struct
2560: 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73  ure from the has
2570: 68 20 74 61 62 6c 65 2e 20 20 4e 6f 72 20 64 6f  h table.  Nor do
2580: 65 73 20 69 74 20 72 65 6d 6f 76 65 0a 2a 2a 20  es it remove.** 
2590: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 66 72 6f  foreign keys fro
25a0: 6d 20 74 68 65 20 73 71 6c 69 74 65 2e 61 46 4b  m the sqlite.aFK
25b0: 65 79 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  ey hash table.  
25c0: 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74  But it does dest
25d0: 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74  roy.** memory st
25e0: 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20  ructures of the 
25f0: 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65  indices and fore
2600: 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61  ign keys associa
2610: 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65  ted with .** the
2620: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e   table..**.** In
2630: 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
2640: 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
2650: 61 72 65 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  are unlinked fro
2660: 6d 20 74 68 65 20 22 64 62 22 0a 2a 2a 20 64 61  m the "db".** da
2670: 74 61 20 73 74 72 75 63 74 75 72 65 20 69 66 20  ta structure if 
2680: 64 62 21 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62  db!=NULL.  If db
2690: 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20  ==NULL, indices 
26a0: 61 74 74 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74  attached to.** t
26b0: 68 65 20 74 61 62 6c 65 20 61 72 65 20 64 65 6c  he table are del
26c0: 65 74 65 64 2c 20 62 75 74 20 69 74 20 69 73 20  eted, but it is 
26d0: 61 73 73 75 6d 65 64 20 74 68 65 79 20 68 61 76  assumed they hav
26e0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a  e already been.*
26f0: 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76  * unlinked..*/.v
2700: 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74  oid sqlite3Delet
2710: 65 54 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64  eTable(sqlite *d
2720: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
2730: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 49 6e  ){.  int i;.  In
2740: 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e  dex *pIndex, *pN
2750: 65 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b  ext;.  FKey *pFK
2760: 65 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a  ey, *pNextFKey;.
2770: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
2780: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
2790: 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69   Delete all indi
27a0: 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ces associated w
27b0: 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 0a 20  ith this table. 
27c0: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78   */.  for(pIndex
27d0: 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65   = pTable->pInde
27e0: 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
27f0: 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  x=pNext){.    pN
2800: 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  ext = pIndex->pN
2810: 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ext;.    assert(
2820: 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 70 54   pIndex->iDb==pT
2830: 61 62 6c 65 2d 3e 69 44 62 20 7c 7c 20 28 70 54  able->iDb || (pT
2840: 61 62 6c 65 2d 3e 69 44 62 3d 3d 30 20 26 26 20  able->iDb==0 && 
2850: 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 31 29 20  pIndex->iDb==1) 
2860: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c  );.    sqliteDel
2870: 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  eteIndex(db, pIn
2880: 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  dex);.  }..  /* 
2890: 44 65 6c 65 74 65 20 61 6c 6c 20 66 6f 72 65 69  Delete all forei
28a0: 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74  gn keys associat
28b0: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
28c0: 6c 65 2e 20 20 54 68 65 20 6b 65 79 73 0a 20 20  le.  The keys.  
28d0: 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  ** should have a
28e0: 6c 72 65 61 64 79 20 62 65 65 6e 20 75 6e 6c 69  lready been unli
28f0: 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 64 62  nked from the db
2900: 2d 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62  ->aFKey hash tab
2910: 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  le .  */.  for(p
2920: 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b  FKey=pTable->pFK
2930: 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79  ey; pFKey; pFKey
2940: 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20 20  =pNextFKey){.   
2950: 20 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46 4b   pNextFKey = pFK
2960: 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20  ey->pNextFrom;. 
2970: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c     assert( pTabl
2980: 65 2d 3e 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  e->iDb<db->nDb )
2990: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
29a0: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
29b0: 62 2d 3e 61 44 62 5b 70 54 61 62 6c 65 2d 3e 69  b->aDb[pTable->i
29c0: 44 62 5d 2e 61 46 4b 65 79 2c 0a 20 20 20 20 20  Db].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 70 46 4b 65 79 2d 3e 7a 54 6f        pFKey->zTo
29f0: 2c 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e  , strlen(pFKey->
2a00: 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79 20 29  zTo)+1)!=pFKey )
2a10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
2a20: 28 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 0a 20 20  (pFKey);.  }..  
2a30: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61  /* Delete the Ta
2a40: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74  ble structure it
2a50: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  self..  */.  for
2a60: 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  (i=0; i<pTable->
2a70: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
2a80: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
2a90: 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  e->aCol[i].zName
2aa0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
2ab0: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  e(pTable->aCol[i
2ac0: 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73 71  ].zDflt);.    sq
2ad0: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
2ae0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b  >aCol[i].zType);
2af0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
2b00: 65 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  e(pTable->zName)
2b10: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
2b20: 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20  Table->aCol);.  
2b30: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
2b40: 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c  ete(pTable->pSel
2b50: 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ect);.  sqliteFr
2b60: 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f  ee(pTable);.}../
2b70: 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20  *.** Unlink the 
2b80: 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d  given table from
2b90: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73   the hash tables
2ba0: 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20   and the delete 
2bb0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72  the.** table str
2bc0: 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20  ucture with all 
2bd0: 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20  its indices and 
2be0: 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f  foreign keys..*/
2bf0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
2c00: 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  iteUnlinkAndDele
2c10: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 20 2a  teTable(sqlite *
2c20: 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20  db, Table *p){. 
2c30: 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
2c40: 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46 32 3b  FKey *pF1, *pF2;
2c50: 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d 3e 69 44  .  int i = p->iD
2c60: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  b;.  assert( db!
2c70: 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73  =0 );.  pOld = s
2c80: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
2c90: 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 74 62 6c  (&db->aDb[i].tbl
2ca0: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  Hash, p->zName, 
2cb0: 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29  strlen(p->zName)
2cc0: 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  +1, 0);.  assert
2cd0: 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c  ( pOld==0 || pOl
2ce0: 64 3d 3d 70 20 29 3b 0a 20 20 66 6f 72 28 70 46  d==p );.  for(pF
2cf0: 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31 3b  1=p->pFKey; pF1;
2d00: 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74 46   pF1=pF1->pNextF
2d10: 72 6f 6d 29 7b 0a 20 20 20 20 69 6e 74 20 6e 54  rom){.    int nT
2d20: 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 31 2d 3e  o = strlen(pF1->
2d30: 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 70 46  zTo) + 1;.    pF
2d40: 32 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  2 = sqlite3HashF
2d50: 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e  ind(&db->aDb[i].
2d60: 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c  aFKey, pF1->zTo,
2d70: 20 6e 54 6f 29 3b 0a 20 20 20 20 69 66 28 20 70   nTo);.    if( p
2d80: 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20  F2==pF1 ){.     
2d90: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
2da0: 72 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 61  rt(&db->aDb[i].a
2db0: 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20  FKey, pF1->zTo, 
2dc0: 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78 74 54  nTo, pF1->pNextT
2dd0: 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  o);.    }else{. 
2de0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 32 20       while( pF2 
2df0: 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 21  && pF2->pNextTo!
2e00: 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32 2d  =pF1 ){ pF2=pF2-
2e10: 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20 20  >pNextTo; }.    
2e20: 20 20 69 66 28 20 70 46 32 20 29 7b 0a 20 20 20    if( pF2 ){.   
2e30: 20 20 20 20 20 70 46 32 2d 3e 70 4e 65 78 74 54       pF2->pNextT
2e40: 6f 20 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f  o = pF1->pNextTo
2e50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2e60: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 6c    }.  sqlite3Del
2e70: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b  eteTable(db, p);
2e80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
2e90: 75 63 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  uct the name of 
2ea0: 61 20 75 73 65 72 20 74 61 62 6c 65 20 6f 72 20  a user table or 
2eb0: 69 6e 64 65 78 20 66 72 6f 6d 20 61 20 74 6f 6b  index from a tok
2ec0: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  en..**.** Space 
2ed0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65  to hold the name
2ee0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
2ef0: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
2f00: 20 61 6e 64 20 6d 75 73 74 0a 2a 2a 20 62 65 20   and must.** be 
2f10: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
2f20: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
2f30: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 54  /.char *sqlite3T
2f40: 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ableNameFromToke
2f50: 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  n(Token *pName){
2f60: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
2f70: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
2f80: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
2f90: 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71  n);.  sqlite3Deq
2fa0: 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72  uote(zName);.  r
2fb0: 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a  eturn zName;.}..
2fc0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
2fd0: 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ode to open the 
2fe0: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61 73 74  appropriate mast
2ff0: 65 72 20 74 61 62 6c 65 2e 20 20 54 68 65 20 74  er table.  The t
3000: 61 62 6c 65 0a 2a 2a 20 6f 70 65 6e 65 64 20 77  able.** opened w
3010: 69 6c 6c 20 62 65 20 53 51 4c 49 54 45 5f 4d 41  ill be SQLITE_MA
3020: 53 54 45 52 20 66 6f 72 20 70 65 72 73 69 73 74  STER for persist
3030: 65 6e 74 20 74 61 62 6c 65 73 20 61 6e 64 20 0a  ent tables and .
3040: 2a 2a 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 4d  ** SQLITE_TEMP_M
3050: 41 53 54 45 52 20 66 6f 72 20 74 65 6d 70 6f 72  ASTER for tempor
3060: 61 72 79 20 74 61 62 6c 65 73 2e 20 20 54 68 65  ary tables.  The
3070: 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64   table is opened
3080: 0a 2a 2a 20 6f 6e 20 63 75 72 73 6f 72 20 30 2e  .** on cursor 0.
3090: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
30a0: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
30b0: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 73 54  Vdbe *v, int isT
30c0: 65 6d 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  emp){.  sqlite3V
30d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
30e0: 6e 74 65 67 65 72 2c 20 69 73 54 65 6d 70 2c 20  nteger, isTemp, 
30f0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
3100: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
3110: 6e 57 72 69 74 65 2c 20 30 2c 20 32 29 3b 0a 7d  nWrite, 0, 2);.}
3120: 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f  ../*.** Begin co
3130: 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77  nstructing a new
3140: 20 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74   table represent
3150: 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e  ation in memory.
3160: 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65    This is.** the
3170: 20 66 69 72 73 74 20 6f 66 20 73 65 76 65 72 61   first of severa
3180: 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65  l action routine
3190: 73 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65  s that get calle
31a0: 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a  d in response.**
31b0: 20 74 6f 20 61 20 43 52 45 41 54 45 20 54 41 42   to a CREATE TAB
31c0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49  LE statement.  I
31d0: 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68  n particular, th
31e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
31f0: 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65  lled.** after se
3200: 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45  eing tokens "CRE
3210: 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22  ATE" and "TABLE"
3220: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e   and the table n
3230: 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20 70 53 74  ame.  The.** pSt
3240: 61 72 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  art token is the
3250: 20 43 52 45 41 54 45 20 61 6e 64 20 70 4e 61 6d   CREATE and pNam
3260: 65 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  e is the table n
3270: 61 6d 65 2e 20 20 54 68 65 20 69 73 54 65 6d 70  ame.  The isTemp
3280: 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65  .** flag is true
3290: 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73 68   if the table sh
32a0: 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69  ould be stored i
32b0: 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  n the auxiliary 
32c0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
32d0: 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20 74   instead of in t
32e0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
32f0: 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20   file.  This is 
3300: 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61 73  normally the cas
3310: 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22 54  e.** when the "T
3320: 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41  EMP" or "TEMPORA
3330: 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75  RY" keyword occu
3340: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a  rs in between.**
3350: 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c   CREATE and TABL
3360: 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  E..**.** The new
3370: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73   table record is
3380: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64   initialized and
3390: 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e   put in pParse->
33a0: 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73  pNewTable..** As
33b0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45   more of the CRE
33c0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
33d0: 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20 61  ent is parsed, a
33e0: 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e  dditional action
33f0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  .** routines wil
3400: 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61  l be called to a
3410: 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74  dd more informat
3420: 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f  ion to this reco
3430: 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  rd..** At the en
3440: 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  d of the CREATE 
3450: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c  TABLE statement,
3460: 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64 54   the sqlite3EndT
3470: 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a  able() routine.*
3480: 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  * is called to c
3490: 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73  omplete the cons
34a0: 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  truction of the 
34b0: 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64  new table record
34c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
34d0: 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20 50  3StartTable(.  P
34e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
34f0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
3500: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53  t */.  Token *pS
3510: 74 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 22  tart,   /* The "
3520: 43 52 45 41 54 45 22 20 74 6f 6b 65 6e 20 2a 2f  CREATE" token */
3530: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
3540: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
3550: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 74 6f 20  able or view to 
3560: 63 72 65 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20  create */.  int 
3570: 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20  isTemp,      /* 
3580: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
3590: 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a  a TEMP table */.
35a0: 20 20 69 6e 74 20 69 73 56 69 65 77 20 20 20 20    int isView    
35b0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
35c0: 69 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a  is is a VIEW */.
35d0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
35e0: 6c 65 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  le;.  Index *pId
35f0: 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  x;.  char *zName
3600: 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
3610: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
3620: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44  dbe *v;.  int iD
3630: 62 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 46  b;..  pParse->sF
3640: 69 72 73 74 54 6f 6b 65 6e 20 3d 20 2a 70 53 74  irstToken = *pSt
3650: 61 72 74 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  art;.  zName = s
3660: 71 6c 69 74 65 33 54 61 62 6c 65 4e 61 6d 65 46  qlite3TableNameF
3670: 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b  romToken(pName);
3680: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
3690: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
36a0: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20  db->init.iDb==1 
36b0: 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69  ) isTemp = 1;.#i
36c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
36d0: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
36e0: 20 20 61 73 73 65 72 74 28 20 28 69 73 54 65 6d    assert( (isTem
36f0: 70 20 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29  p & 1)==isTemp )
3700: 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  ;.  {.    int co
3710: 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44  de;.    char *zD
3720: 62 20 3d 20 69 73 54 65 6d 70 20 3f 20 22 74 65  b = isTemp ? "te
3730: 6d 70 22 20 3a 20 22 6d 61 69 6e 22 3b 0a 20 20  mp" : "main";.  
3740: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
3750: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
3760: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
3770: 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d  HEMA_TABLE(isTem
3780: 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  p), 0, zDb) ){. 
3790: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
37a0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
37b0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
37c0: 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20  if( isView ){.  
37d0: 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29      if( isTemp )
37e0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
37f0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
3800: 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
3810: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
3820: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
3830: 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  ATE_VIEW;.      
3840: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
3850: 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b     if( isTemp ){
3860: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
3870: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
3880: 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
3890: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
38a0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
38b0: 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  ATE_TABLE;.     
38c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
38d0: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
38e0: 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
38f0: 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
3900: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
3910: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ee(zName);.     
3920: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
3930: 20 7d 0a 23 65 6e 64 69 66 0a 20 0a 0a 20 20 2f   }.#endif. ..  /
3940: 2a 20 42 65 66 6f 72 65 20 74 72 79 69 6e 67 20  * Before trying 
3950: 74 6f 20 63 72 65 61 74 65 20 61 20 74 65 6d 70  to create a temp
3960: 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6d 61 6b  orary table, mak
3970: 65 20 73 75 72 65 20 74 68 65 20 42 74 72 65 65  e sure the Btree
3980: 20 66 6f 72 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e   for.  ** holdin
3990: 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  g temporary tabl
39a0: 65 73 20 69 73 20 6f 70 65 6e 2e 0a 20 20 2a 2f  es is open..  */
39b0: 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 26 26  .  if( isTemp &&
39c0: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d   db->aDb[1].pBt=
39d0: 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65  =0 && !pParse->e
39e0: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e  xplain ){.    in
39f0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74  t rc = sqlite3Bt
3a00: 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30  reeFactory(db, 0
3a10: 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20  , 0, MAX_PAGES, 
3a20: 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29  &db->aDb[1].pBt)
3a30: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
3a40: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
3a50: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3a60: 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
3a70: 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
3a80: 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a  rary database ".
3a90: 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f          "file fo
3aa0: 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72  r storing tempor
3ab0: 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20  ary tables");.  
3ac0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
3ad0: 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
3ae0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3af0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
3b00: 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20  TE_InTrans ){.  
3b10: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
3b20: 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
3b30: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b  db->aDb[1].pBt);
3b40: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
3b50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
3b60: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3b70: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
3b80: 62 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72 69  ble to get a wri
3b90: 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20  te lock on ".   
3ba0: 20 20 20 20 20 20 20 22 74 68 65 20 74 65 6d 70         "the temp
3bb0: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 66  orary database f
3bc0: 69 6c 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ile");.        r
3bd0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
3be0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
3bf0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77  ake sure the new
3c00: 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73   table name does
3c10: 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74   not collide wit
3c20: 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20  h an existing.  
3c30: 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
3c40: 65 20 6e 61 6d 65 2e 20 20 49 73 73 75 65 20 61  e name.  Issue a
3c50: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
3c60: 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2a  if it does..  **
3c70: 0a 20 20 2a 2a 20 49 66 20 77 65 20 61 72 65 20  .  ** If we are 
3c80: 72 65 2d 72 65 61 64 69 6e 67 20 74 68 65 20 73  re-reading the s
3c90: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
3ca0: 6c 65 20 62 65 63 61 75 73 65 20 6f 66 20 61 20  le because of a 
3cb0: 73 63 68 65 6d 61 0a 20 20 2a 2a 20 63 68 61 6e  schema.  ** chan
3cc0: 67 65 20 61 6e 64 20 61 20 6e 65 77 20 70 65 72  ge and a new per
3cd0: 6d 61 6e 65 6e 74 20 74 61 62 6c 65 20 69 73 20  manent table is 
3ce0: 66 6f 75 6e 64 20 77 68 6f 73 65 20 6e 61 6d 65  found whose name
3cf0: 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 0a 20   collides with. 
3d00: 20 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20   ** an existing 
3d10: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
3d20: 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 6e 20   that is not an 
3d30: 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 70 54  error..  */.  pT
3d40: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69  able = sqlite3Fi
3d50: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
3d60: 65 2c 20 30 29 3b 0a 20 20 69 44 62 20 3d 20 69  e, 0);.  iDb = i
3d70: 73 54 65 6d 70 20 3f 20 31 20 3a 20 64 62 2d 3e  sTemp ? 1 : db->
3d80: 69 6e 69 74 2e 69 44 62 3b 0a 20 20 69 66 28 20  init.iDb;.  if( 
3d90: 70 54 61 62 6c 65 21 3d 30 20 26 26 20 28 70 54  pTable!=0 && (pT
3da0: 61 62 6c 65 2d 3e 69 44 62 3d 3d 69 44 62 20 7c  able->iDb==iDb |
3db0: 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  | !db->init.busy
3dc0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
3dd0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3de0: 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61   "table %T alrea
3df0: 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d  dy exists", pNam
3e00: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
3e10: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ee(zName);.    r
3e20: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
3e30: 20 28 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33   (pIdx = sqlite3
3e40: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
3e50: 61 6d 65 2c 20 30 29 29 21 3d 30 20 26 26 0a 20  ame, 0))!=0 &&. 
3e60: 20 20 20 20 20 20 20 20 20 28 70 49 64 78 2d 3e           (pIdx->
3e70: 69 44 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69  iDb==0 || !db->i
3e80: 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20  nit.busy) ){.   
3e90: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3ea0: 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
3eb0: 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e  is already an in
3ec0: 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  dex named %s", z
3ed0: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
3ee0: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
3ef0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
3f00: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 4d  pTable = sqliteM
3f10: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61  alloc( sizeof(Ta
3f20: 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
3f30: 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  able==0 ){.    s
3f40: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
3f50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
3f60: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  }.  pTable->zNam
3f70: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61  e = zName;.  pTa
3f80: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  ble->nCol = 0;. 
3f90: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
3fa0: 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b  0;.  pTable->iPK
3fb0: 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c  ey = -1;.  pTabl
3fc0: 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  e->pIndex = 0;. 
3fd0: 20 70 54 61 62 6c 65 2d 3e 69 44 62 20 3d 20 69   pTable->iDb = i
3fe0: 44 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  Db;.  if( pParse
3ff0: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71  ->pNewTable ) sq
4000: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
4010: 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65  (db, pParse->pNe
4020: 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72 73  wTable);.  pPars
4030: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70  e->pNewTable = p
4040: 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 42 65 67  Table;..  /* Beg
4050: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  in generating th
4060: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
4070: 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c   insert the tabl
4080: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20  e record into.  
4090: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  ** the SQLITE_MA
40a0: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74  STER table.  Not
40b0: 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20  e in particular 
40c0: 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20  that we must go 
40d0: 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61  ahead.  ** and a
40e0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f  llocate the reco
40f0: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
4100: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f  e table entry no
4110: 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20  w.  Before any. 
4120: 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
4130: 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72  or UNIQUE keywor
4140: 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20  ds are parsed.  
4150: 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77  Those keywords w
4160: 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69  ill cause.  ** i
4170: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65  ndices to be cre
4180: 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62  ated and the tab
4190: 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63  le record must c
41a0: 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a  ome before the .
41b0: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48    ** indices.  H
41c0: 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64  ence, the record
41d0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
41e0: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c  table must be al
41f0: 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77  located.  ** now
4200: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
4210: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28  ->init.busy && (
4220: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
4230: 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29  be(pParse))!=0 )
4240: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
4250: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
4260: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 73 54 65  (pParse, 0, isTe
4270: 6d 70 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73  mp);.    if( !is
4280: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Temp ){.      sq
4290: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
42a0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62  , OP_Integer, db
42b0: 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 30  ->file_format, 0
42c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
42d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
42e0: 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 31 29  SetCookie, 0, 1)
42f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
4300: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
4310: 6c 65 28 76 2c 20 69 73 54 65 6d 70 29 3b 0a 20  le(v, isTemp);. 
4320: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4330: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63  dOp(v, OP_NewRec
4340: 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  no, 0, 0);.    s
4350: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4360: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
4370: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4380: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
4390: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
43a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
43b0: 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79  (v, OP_PutIntKey
43c0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 0, 0);.  }.}..
43d0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
43e0: 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61  column to the ta
43f0: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65  ble currently be
4400: 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e  ing constructed.
4410: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  .**.** The parse
4420: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
4430: 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61  tine once for ea
4440: 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72  ch column declar
4450: 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52  ation.** in a CR
4460: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
4470: 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74  ment.  sqlite3St
4480: 61 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20  artTable() gets 
4490: 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20  called.** first 
44a0: 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f  to get things go
44b0: 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20  ing.  Then this 
44c0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
44d0: 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f  d for each.** co
44e0: 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lumn..*/.void sq
44f0: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50  lite3AddColumn(P
4500: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
4510: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54  ken *pName){.  T
4520: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
4530: 3b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  ;.  char *z = 0;
4540: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
4550: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
4560: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
4570: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
4580: 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28  lite3SetNString(
4590: 26 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  &z, pName->z, pN
45a0: 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 69 66  ame->n, 0);.  if
45b0: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
45c0: 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74  .  sqlite3Dequot
45d0: 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  e(z);.  for(i=0;
45e0: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
45f0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
4600: 33 53 74 72 49 43 6d 70 28 7a 2c 20 70 2d 3e 61  3StrICmp(z, p->a
4610: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  Col[i].zName)==0
4620: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4630: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4640: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
4650: 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  umn name: %s", z
4660: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
4670: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65  ree(z);.      re
4680: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
4690: 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26    if( (p->nCol &
46a0: 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   0x7)==0 ){.    
46b0: 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20  Column *aNew;.  
46c0: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    aNew = sqliteR
46d0: 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c  ealloc( p->aCol,
46e0: 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a   (p->nCol+8)*siz
46f0: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
4700: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d  ;.    if( aNew==
4710: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
4720: 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a  p->aCol = aNew;.
4730: 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d    }.  pCol = &p-
4740: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a  >aCol[p->nCol];.
4750: 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30    memset(pCol, 0
4760: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  , sizeof(p->aCol
4770: 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a  [0]));.  pCol->z
4780: 4e 61 6d 65 20 3d 20 7a 3b 0a 20 20 70 43 6f 6c  Name = z;.  pCol
4790: 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51  ->sortOrder = SQ
47a0: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 70  LITE_SO_NUM;.  p
47b0: 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a  ->nCol++;.}../*.
47c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
47d0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
47e0: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
47f0: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
4800: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
4810: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
4820: 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c  nt.  A "NOT NULL
4830: 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73  " constraint has
4840: 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e  .** been seen on
4850: 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73   a column.  This
4860: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
4870: 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f  e notNull flag o
4880: 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20  n.** the column 
4890: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
48a0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f  construction..*/
48b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
48c0: 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70  NotNull(Parse *p
48d0: 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72  Parse, int onErr
48e0: 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  or){.  Table *p;
48f0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
4900: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
4910: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
4920: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
4930: 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30  ol-1;.  if( i>=0
4940: 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f   ) p->aCol[i].no
4950: 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b  tNull = onError;
4960: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
4970: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
4980: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
4990: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
49a0: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
49b0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
49c0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
49d0: 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20  pFirst token is 
49e0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b  the first.** tok
49f0: 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e  en in the sequen
4a00: 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61  ce of tokens tha
4a10: 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74  t describe the t
4a20: 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ype of the.** co
4a30: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
4a40: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
4a50: 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74 68  n.   pLast is th
4a60: 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20  e last token.** 
4a70: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e  in the sequence.
4a80: 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72    Use this infor
4a90: 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72  mation to constr
4aa0: 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20  uct a string.** 
4ab0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
4ac0: 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68  e typename of th
4ad0: 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f  e column and sto
4ae0: 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a  re that string.*
4af0: 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a  * in zType..*/ .
4b00: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
4b10: 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20  olumnType(Parse 
4b20: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
4b30: 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  pFirst, Token *p
4b40: 4c 61 73 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Last){.  Table *
4b50: 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  p;.  int i, j;. 
4b60: 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20 2a   int n;.  char *
4b70: 7a 2c 20 2a 2a 70 7a 3b 0a 20 20 43 6f 6c 75 6d  z, **pz;.  Colum
4b80: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28  n *pCol;.  if( (
4b90: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
4ba0: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
4bb0: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
4bc0: 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29  l-1;.  if( i<0 )
4bd0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20   return;.  pCol 
4be0: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20  = &p->aCol[i];. 
4bf0: 20 70 7a 20 3d 20 26 70 43 6f 6c 2d 3e 7a 54 79   pz = &pCol->zTy
4c00: 70 65 3b 0a 20 20 6e 20 3d 20 70 4c 61 73 74 2d  pe;.  n = pLast-
4c10: 3e 6e 20 2b 20 41 64 64 72 28 70 4c 61 73 74 2d  >n + Addr(pLast-
4c20: 3e 7a 29 20 2d 20 41 64 64 72 28 70 46 69 72 73  >z) - Addr(pFirs
4c30: 74 2d 3e 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->z);.  sqlite3
4c40: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70  SetNString(pz, p
4c50: 46 69 72 73 74 2d 3e 7a 2c 20 6e 2c 20 30 29 3b  First->z, n, 0);
4c60: 0a 20 20 7a 20 3d 20 2a 70 7a 3b 0a 20 20 69 66  .  z = *pz;.  if
4c70: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
4c80: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 5b  .  for(i=j=0; z[
4c90: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  i]; i++){.    in
4ca0: 74 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20  t c = z[i];.    
4cb0: 69 66 28 20 69 73 73 70 61 63 65 28 63 29 20 29  if( isspace(c) )
4cc0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a   continue;.    z
4cd0: 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20  [j++] = c;.  }. 
4ce0: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 69 66 28   z[j] = 0;.  if(
4cf0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c   pParse->db->fil
4d00: 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20  e_format>=4 ){. 
4d10: 20 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64     pCol->sortOrd
4d20: 65 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 6c  er = sqlite3Coll
4d30: 61 74 65 54 79 70 65 28 7a 2c 20 6e 29 3b 0a 20  ateType(z, n);. 
4d40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c   }else{.    pCol
4d50: 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51  ->sortOrder = SQ
4d60: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 7d  LITE_SO_NUM;.  }
4d70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67 69  .}../*.** The gi
4d80: 76 65 6e 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  ven token is the
4d90: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
4da0: 6f 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  or the last colu
4db0: 6d 6e 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74  mn added to.** t
4dc0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
4dd0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
4de0: 63 74 69 6f 6e 2e 20 20 49 66 20 22 6d 69 6e 75  ction.  If "minu
4df0: 73 46 6c 61 67 22 20 69 73 20 74 72 75 65 2c 20  sFlag" is true, 
4e00: 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20  it.** means the 
4e10: 76 61 6c 75 65 20 74 6f 6b 65 6e 20 77 61 73 20  value token was 
4e20: 70 72 65 63 65 64 65 64 20 62 79 20 61 20 6d 69  preceded by a mi
4e30: 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20  nus sign..**.** 
4e40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4e50: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
4e60: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
4e70: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
4e80: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
4e90: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
4ea0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4eb0: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
4ec0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
4ed0: 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20 69 6e 74 20  oken *pVal, int 
4ee0: 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20 54 61  minusFlag){.  Ta
4ef0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
4f00: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b 0a 20 20  .  char **pz;.  
4f10: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
4f20: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
4f30: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
4f40: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20  ->nCol-1;.  if( 
4f50: 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  i<0 ) return;.  
4f60: 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d  pz = &p->aCol[i]
4f70: 2e 7a 44 66 6c 74 3b 0a 20 20 69 66 28 20 6d 69  .zDflt;.  if( mi
4f80: 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20 20 73  nusFlag ){.    s
4f90: 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67  qlite3SetNString
4fa0: 28 70 7a 2c 20 22 2d 22 2c 20 31 2c 20 70 56 61  (pz, "-", 1, pVa
4fb0: 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30  l->z, pVal->n, 0
4fc0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
4fd0: 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e  sqlite3SetNStrin
4fe0: 67 28 70 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70  g(pz, pVal->z, p
4ff0: 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 0a  Val->n, 0);.  }.
5000: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
5010: 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (*pz);.}../*.** 
5020: 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52  Designate the PR
5030: 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68  IMARY KEY for th
5040: 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20  e table.  pList 
5050: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d  is a list of nam
5060: 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e  es .** of column
5070: 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  s that form the 
5080: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
5090: 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20   pList is NULL, 
50a0: 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74  then the.** most
50b0: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
50c0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
50d0: 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61  ble is the prima
50e0: 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20  ry key..**.** A 
50f0: 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61  table can have a
5100: 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61  t most one prima
5110: 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20  ry key.  If the 
5120: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
5130: 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b  s.** a primary k
5140: 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20  ey (and this is 
5150: 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61  the second prima
5160: 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65  ry key) then cre
5170: 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e  ate an.** error.
5180: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52  .**.** If the PR
5190: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20  IMARY KEY is on 
51a0: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
51b0: 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69  whose datatype i
51c0: 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68  s INTEGER,.** th
51d0: 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74  en we will try t
51e0: 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d  o use that colum
51f0: 6e 20 61 73 20 74 68 65 20 72 6f 77 20 69 64 2e  n as the row id.
5200: 20 20 28 45 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a    (Exception:.**
5210: 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63   For backwards c
5220: 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
5230: 68 20 6f 6c 64 65 72 20 64 61 74 61 62 61 73 65  h older database
5240: 73 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  s, do not do thi
5250: 73 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65  s.** if the file
5260: 20 66 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e 20   format version 
5270: 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74  number is less t
5280: 68 61 6e 20 31 2e 29 20 20 53 65 74 20 74 68 65  han 1.)  Set the
5290: 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20   Table.iPKey.** 
52a0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62  field of the tab
52b0: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
52c0: 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20  ction to be the 
52d0: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
52e0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
52f0: 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62  KEY column.  Tab
5300: 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20  le.iPKey is set 
5310: 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69  to -1 if there i
5320: 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20  s.** no INTEGER 
5330: 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a  PRIMARY KEY..**.
5340: 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73  ** If the key is
5350: 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
5360: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
5370: 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  n create a uniqu
5380: 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74  e.** index for t
5390: 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65  he key.  No inde
53a0: 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72  x is created for
53b0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
53c0: 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   KEYs..*/.void s
53d0: 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79  qlite3AddPrimary
53e0: 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  Key(Parse *pPars
53f0: 65 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  e, IdList *pList
5400: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
5410: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
5420: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
5430: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65  e;.  char *zType
5440: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
5450: 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20   = -1, i;.  if( 
5460: 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70  pTab==0 ) goto p
5470: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
5480: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61 73  .  if( pTab->has
5490: 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73  PrimKey ){.    s
54a0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
54b0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74  Parse, .      "t
54c0: 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20  able \"%s\" has 
54d0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72  more than one pr
54e0: 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62  imary key", pTab
54f0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
5500: 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  to primary_key_e
5510: 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  xit;.  }.  pTab-
5520: 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b  >hasPrimKey = 1;
5530: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
5540: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54  ){.    iCol = pT
5550: 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  ab->nCol - 1;.  
5560: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f    pTab->aCol[iCo
5570: 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31  l].isPrimKey = 1
5580: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
5590: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
55a0: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
55b0: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
55c0: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
55d0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
55e0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
55f0: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
5600: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
5610: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  [iCol].zName)==0
5620: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
5630: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  }.      if( iCol
5640: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 20 70 54  <pTab->nCol ) pT
5650: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69  ab->aCol[iCol].i
5660: 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20  sPrimKey = 1;.  
5670: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73    }.    if( pLis
5680: 74 2d 3e 6e 49 64 3e 31 20 29 20 69 43 6f 6c 20  t->nId>1 ) iCol 
5690: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  = -1;.  }.  if( 
56a0: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
56b0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
56c0: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
56d0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
56e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
56f0: 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72  se->db->file_for
5700: 6d 61 74 3e 3d 31 20 26 26 20 0a 20 20 20 20 20  mat>=1 && .     
5710: 20 20 20 20 20 20 7a 54 79 70 65 20 26 26 20 73        zType && s
5720: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
5730: 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d  ype, "INTEGER")=
5740: 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  =0 ){.    pTab->
5750: 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20  iPKey = iCol;.  
5760: 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20    pTab->keyConf 
5770: 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 7d 65 6c  = onError;.  }el
5780: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  se{.    sqlite3C
5790: 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  reateIndex(pPars
57a0: 65 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20  e, 0, 0, pList, 
57b0: 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 29 3b 0a  onError, 0, 0);.
57c0: 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20      pList = 0;. 
57d0: 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f   }..primary_key_
57e0: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 49  exit:.  sqlite3I
57f0: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  dListDelete(pLis
5800: 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  t);.  return;.}.
5810: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5820: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
5830: 6c 6c 61 74 69 6e 67 20 74 79 70 65 20 67 69 76  llating type giv
5840: 65 6e 20 61 20 74 79 70 65 20 6e 61 6d 65 2e 0a  en a type name..
5850: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74  **.** The collat
5860: 69 6f 6e 20 74 79 70 65 20 69 73 20 74 65 78 74  ion type is text
5870: 20 28 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54   (SQLITE_SO_TEXT
5880: 29 20 69 66 20 74 68 65 20 74 79 70 65 0a 2a 2a  ) if the type.**
5890: 20 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74   name contains t
58a0: 68 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72  he character str
58b0: 65 61 6d 20 22 74 65 78 74 22 20 6f 72 20 22 62  eam "text" or "b
58c0: 6c 6f 62 22 20 6f 72 0a 2a 2a 20 22 63 6c 6f 62  lob" or.** "clob
58d0: 22 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 74 79  ".  Any other ty
58e0: 70 65 20 6e 61 6d 65 20 69 73 20 63 6f 6c 6c 61  pe name is colla
58f0: 74 65 64 20 61 73 20 6e 75 6d 65 72 69 63 0a 2a  ted as numeric.*
5900: 2a 20 28 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d  * (SQLITE_SO_NUM
5910: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
5920: 33 43 6f 6c 6c 61 74 65 54 79 70 65 28 63 6f 6e  3CollateType(con
5930: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20  st char *zType, 
5940: 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20 69 6e  int nType){.  in
5950: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
5960: 69 3c 6e 54 79 70 65 2d 33 3b 20 69 2b 2b 29 7b  i<nType-3; i++){
5970: 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2a 28 7a  .    int c = *(z
5980: 54 79 70 65 2b 2b 29 20 7c 20 30 78 36 30 3b 0a  Type++) | 0x60;.
5990: 20 20 20 20 69 66 28 20 28 63 3d 3d 27 62 27 20      if( (c=='b' 
59a0: 7c 7c 20 63 3d 3d 27 63 27 29 20 26 26 20 73 71  || c=='c') && sq
59b0: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 54  lite3StrNICmp(zT
59c0: 79 70 65 2c 20 22 6c 6f 62 22 2c 20 33 29 3d 3d  ype, "lob", 3)==
59d0: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
59e0: 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54  n SQLITE_SO_TEXT
59f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5a00: 63 3d 3d 27 63 27 20 26 26 20 73 71 6c 69 74 65  c=='c' && sqlite
5a10: 33 53 74 72 4e 49 43 6d 70 28 7a 54 79 70 65 2c  3StrNICmp(zType,
5a20: 20 22 68 61 72 22 2c 20 33 29 3d 3d 30 20 29 7b   "har", 3)==0 ){
5a30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
5a40: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20  LITE_SO_TEXT;.  
5a50: 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27    }.    if( c=='
5a60: 74 27 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  t' && sqlite3Str
5a70: 4e 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 65 78  NICmp(zType, "ex
5a80: 74 22 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20  t", 3)==0 ){.   
5a90: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5aa0: 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a  _SO_TEXT;.    }.
5ab0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
5ac0: 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 7d 0a 0a 2f  ITE_SO_NUM;.}../
5ad0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5ae0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
5af0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
5b00: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
5b10: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
5b20: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
5b30: 6d 65 6e 74 2e 20 20 41 20 22 43 4f 4c 4c 41 54  ment.  A "COLLAT
5b40: 45 22 20 63 6c 61 75 73 65 20 68 61 73 0a 2a 2a  E" clause has.**
5b50: 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20   been seen on a 
5b60: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f  column.  This ro
5b70: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 43  utine sets the C
5b80: 6f 6c 75 6d 6e 2e 73 6f 72 74 4f 72 64 65 72 20  olumn.sortOrder 
5b90: 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  on.** the column
5ba0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
5bb0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
5bc0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
5bd0: 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72  dCollateType(Par
5be0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
5bf0: 63 6f 6c 6c 54 79 70 65 29 7b 0a 20 20 54 61 62  collType){.  Tab
5c00: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
5c10: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
5c20: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
5c30: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
5c40: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66   p->nCol-1;.  if
5c50: 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c  ( i>=0 ) p->aCol
5c60: 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [i].sortOrder = 
5c70: 63 6f 6c 6c 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a  collType;.}../*.
5c80: 2a 2a 20 43 6f 6d 65 20 75 70 20 77 69 74 68 20  ** Come up with 
5c90: 61 20 6e 65 77 20 72 61 6e 64 6f 6d 20 76 61 6c  a new random val
5ca0: 75 65 20 66 6f 72 20 74 68 65 20 73 63 68 65 6d  ue for the schem
5cb0: 61 20 63 6f 6f 6b 69 65 2e 20 20 4d 61 6b 65 20  a cookie.  Make 
5cc0: 73 75 72 65 0a 2a 2a 20 74 68 65 20 6e 65 77 20  sure.** the new 
5cd0: 76 61 6c 75 65 20 69 73 20 64 69 66 66 65 72 65  value is differe
5ce0: 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 6c 64 2e  nt from the old.
5cf0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d  .**.** The schem
5d00: 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64  a cookie is used
5d10: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
5d20: 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f  en the schema fo
5d30: 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  r the.** databas
5d40: 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65  e changes.  Afte
5d50: 72 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68  r each schema ch
5d60: 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65  ange, the cookie
5d70: 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65   value.** change
5d80: 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65  s.  When a proce
5d90: 73 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74  ss first reads t
5da0: 68 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63  he schema it rec
5db0: 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b  ords the.** cook
5dc0: 69 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c  ie.  Thereafter,
5dd0: 20 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65   whenever it goe
5de0: 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  s to access the 
5df0: 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20  database,.** it 
5e00: 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69  checks the cooki
5e10: 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
5e20: 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f  he schema has no
5e30: 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e  t changed.** sin
5e40: 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72  ce it was last r
5e50: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ead..**.** This 
5e60: 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70  plan is not comp
5e70: 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72  letely bullet-pr
5e80: 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73  oof.  It is poss
5e90: 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  ible for.** the 
5ea0: 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65  schema to change
5eb0: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
5ec0: 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b  and for the cook
5ed0: 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20  ie to be.** set 
5ee0: 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61  back to prior va
5ef0: 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61  lue.  But schema
5f00: 20 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66   changes are inf
5f10: 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74  requent.** and t
5f20: 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
5f30: 66 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61  f hitting the sa
5f40: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  me cookie value 
5f50: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61  is only.** 1 cha
5f60: 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f  nce in 2^32.  So
5f70: 20 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75   we're safe enou
5f80: 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  gh..*/.void sqli
5f90: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
5fa0: 73 71 6c 69 74 65 20 2a 64 62 2c 20 56 64 62 65  sqlite *db, Vdbe
5fb0: 20 2a 76 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e   *v){.  if( db->
5fc0: 6e 65 78 74 5f 63 6f 6f 6b 69 65 3d 3d 64 62 2d  next_cookie==db-
5fd0: 3e 61 44 62 5b 30 5d 2e 73 63 68 65 6d 61 5f 63  >aDb[0].schema_c
5fe0: 6f 6f 6b 69 65 20 29 7b 0a 20 20 20 20 75 6e 73  ookie ){.    uns
5ff0: 69 67 6e 65 64 20 63 68 61 72 20 72 3b 0a 20 20  igned char r;.  
6000: 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e    sqlite3Randomn
6010: 65 73 73 28 31 2c 20 26 72 29 3b 0a 20 20 20 20  ess(1, &r);.    
6020: 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 20  db->next_cookie 
6030: 3d 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 63 68  = db->aDb[0].sch
6040: 65 6d 61 5f 63 6f 6f 6b 69 65 20 2b 20 72 20 2b  ema_cookie + r +
6050: 20 31 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67   1;.    db->flag
6060: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
6070: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 73  rnChanges;.    s
6080: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6090: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64  v, OP_Integer, d
60a0: 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 2c 20  b->next_cookie, 
60b0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
60c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
60d0: 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 30 29 3b  etCookie, 0, 0);
60e0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65  .  }.}../*.** Me
60f0: 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72  asure the number
6100: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e   of characters n
6110: 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20  eeded to output 
6120: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65  the given.** ide
6130: 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75  ntifier.  The nu
6140: 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e  mber returned in
6150: 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65  cludes any quote
6160: 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f  s used.** but do
6170: 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74  es not include t
6180: 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74  he null terminat
6190: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
61a0: 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f  t identLength(co
61b0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
61c0: 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e 65 65  int n;.  int nee
61d0: 64 51 75 6f 74 65 20 3d 20 30 3b 0a 20 20 66 6f  dQuote = 0;.  fo
61e0: 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20  r(n=0; *z; n++, 
61f0: 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a  z++){.    if( *z
6200: 3d 3d 27 5c 27 27 20 29 7b 20 6e 2b 2b 3b 20 6e  =='\'' ){ n++; n
6210: 65 65 64 51 75 6f 74 65 3d 31 3b 20 7d 0a 20 20  eedQuote=1; }.  
6220: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 6e  }.  return n + n
6230: 65 65 64 51 75 6f 74 65 2a 32 3b 0a 7d 0a 0a 2f  eedQuote*2;.}../
6240: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 69 64  *.** Write an id
6250: 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20 74 68  entifier onto th
6260: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 67 69 76  e end of the giv
6270: 65 6e 20 73 74 72 69 6e 67 2e 20 20 41 64 64 0a  en string.  Add.
6280: 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61 63 74  ** quote charact
6290: 65 72 73 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a  ers as needed..*
62a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64  /.static void id
62b0: 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20  entPut(char *z, 
62c0: 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20  int *pIdx, char 
62d0: 2a 7a 49 64 65 6e 74 29 7b 0a 20 20 69 6e 74 20  *zIdent){.  int 
62e0: 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b  i, j, needQuote;
62f0: 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20  .  i = *pIdx;.  
6300: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
6310: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66  j]; j++){.    if
6320: 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e  ( !isalnum(zIden
6330: 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b  t[j]) && zIdent[
6340: 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b  j]!='_' ) break;
6350: 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65  .  }.  needQuote
6360: 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30   =  zIdent[j]!=0
6370: 20 7c 7c 20 69 73 64 69 67 69 74 28 7a 49 64 65   || isdigit(zIde
6380: 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20  nt[0]).         
6390: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
63a0: 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a  te3KeywordCode(z
63b0: 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44  Ident, j)!=TK_ID
63c0: 3b 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  ;.  if( needQuot
63d0: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27  e ) z[i++] = '\'
63e0: 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  ';.  for(j=0; zI
63f0: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
6400: 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65     z[i++] = zIde
6410: 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a  nt[j];.    if( z
6420: 49 64 65 6e 74 5b 6a 5d 3d 3d 27 5c 27 27 20 29  Ident[j]=='\'' )
6430: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a   z[i++] = '\'';.
6440: 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75    }.  if( needQu
6450: 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  ote ) z[i++] = '
6460: 5c 27 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b  \'';.  z[i] = 0;
6470: 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a  .  *pIdx = i;.}.
6480: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
6490: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
64a0: 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72  tatement appropr
64b0: 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76  iate for the giv
64c0: 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65  en.** table.  Me
64d0: 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  mory to hold the
64e0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61   text of the sta
64f0: 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e  tement is obtain
6500: 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74  ed.** from sqlit
6510: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
6520: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
6530: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
6540: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ion..*/.static c
6550: 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65  har *createTable
6560: 53 74 6d 74 28 54 61 62 6c 65 20 2a 70 29 7b 0a  Stmt(Table *p){.
6570: 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20    int i, k, n;. 
6580: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
6590: 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65  char *zSep, *zSe
65a0: 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 6e 20 3d  p2, *zEnd;.  n =
65b0: 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
65c0: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  <p->nCol; i++){.
65d0: 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65      n += identLe
65e0: 6e 67 74 68 28 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  ngth(p->aCol[i].
65f0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 6e 20  zName);.  }.  n 
6600: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
6610: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
6620: 6e 3c 34 30 20 29 7b 0a 20 20 20 20 7a 53 65 70  n<40 ){.    zSep
6630: 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32   = "";.    zSep2
6640: 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64   = ",";.    zEnd
6650: 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b   = ")";.  }else{
6660: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20  .    zSep = "\n 
6670: 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20   ";.    zSep2 = 
6680: 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e  ",\n  ";.    zEn
6690: 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20  d = "\n)";.  }. 
66a0: 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e   n += 35 + 6*p->
66b0: 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20  nCol;.  zStmt = 
66c0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
66d0: 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d   n );.  if( zStm
66e0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
66f0: 0a 20 20 73 74 72 63 70 79 28 7a 53 74 6d 74 2c  .  strcpy(zStmt,
6700: 20 70 2d 3e 69 44 62 3d 3d 31 20 3f 20 22 43 52   p->iDb==1 ? "CR
6710: 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20  EATE TEMP TABLE 
6720: 22 20 3a 20 22 43 52 45 41 54 45 20 54 41 42 4c  " : "CREATE TABL
6730: 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c  E ");.  k = strl
6740: 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65  en(zStmt);.  ide
6750: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
6760: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53   p->zName);.  zS
6770: 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a  tmt[k++] = '(';.
6780: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
6790: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
67a0: 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  strcpy(&zStmt[k]
67b0: 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b  , zSep);.    k +
67c0: 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74 6d 74 5b  = strlen(&zStmt[
67d0: 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20  k]);.    zSep = 
67e0: 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74  zSep2;.    ident
67f0: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
6800: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
6810: 3b 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28 26  ;.  }.  strcpy(&
6820: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b  zStmt[k], zEnd);
6830: 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b  .  return zStmt;
6840: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
6850: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
6860: 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66   to report the f
6870: 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65  inal ")" that te
6880: 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52  rminates.** a CR
6890: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
68a0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
68b0: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
68c0: 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f  that other actio
68d0: 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20  n routines have 
68e0: 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a  been building.**
68f0: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
6900: 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74   internal hash t
6910: 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20  ables, assuming 
6920: 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a  no errors have.*
6930: 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a  * occurred..**.*
6940: 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  * An entry for t
6950: 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65  he table is made
6960: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74   in the master t
6970: 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e  able on disk, un
6980: 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20  less.** this is 
6990: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
69a0: 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75  e or db->init.bu
69b0: 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d  sy==1.  When db-
69c0: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a  >init.busy==1.**
69d0: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
69e0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c   reading the sql
69f0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
6a00: 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74   because we just
6a10: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f  .** connected to
6a20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72   the database or
6a30: 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c   because the sql
6a40: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
6a50: 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79   has.** recently
6a60: 20 63 68 61 6e 67 65 73 2c 20 73 6f 20 74 68 65   changes, so the
6a70: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20   entry for this 
6a80: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78  table already ex
6a90: 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73  ists in.** the s
6aa0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
6ab0: 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77  le.  We do not w
6ac0: 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74  ant to create it
6ad0: 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66   again..**.** If
6ae0: 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67   the pSelect arg
6af0: 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  ument is not NUL
6b00: 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  L, it means that
6b10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
6b20: 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63   was called to c
6b30: 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65  reate a table ge
6b40: 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a  nerated from a .
6b50: 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  ** "CREATE TABLE
6b60: 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e   ... AS SELECT .
6b70: 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  .." statement.  
6b80: 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  The column names
6b90: 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74   of.** the new t
6ba0: 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20  able will match 
6bb0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
6bc0: 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f  f the SELECT..*/
6bd0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64  .void sqlite3End
6be0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
6bf0: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  rse, Token *pEnd
6c00: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
6c10: 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  t){.  Table *p;.
6c20: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
6c30: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
6c40: 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53  ( (pEnd==0 && pS
6c50: 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61  elect==0) || pPa
6c60: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
6c70: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
6c80: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20  d ) return;.  p 
6c90: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
6ca0: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
6cb0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
6cc0: 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  If the table is 
6cd0: 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61  generated from a
6ce0: 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 63 6f   SELECT, then co
6cf0: 6e 73 74 72 75 63 74 20 74 68 65 0a 20 20 2a 2a  nstruct the.  **
6d00: 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
6d10: 20 61 6e 64 20 74 68 65 20 74 65 78 74 20 6f 66   and the text of
6d20: 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2f   the table..  */
6d30: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29  .  if( pSelect )
6d40: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65  {.    Table *pSe
6d50: 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
6d60: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
6d70: 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 65  pParse, 0, pSele
6d80: 63 74 29 3b 0a 20 20 20 20 69 66 28 20 70 53 65  ct);.    if( pSe
6d90: 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  lTab==0 ) return
6da0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
6db0: 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
6dc0: 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->nCol = pSelTa
6dd0: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e  b->nCol;.    p->
6de0: 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
6df0: 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61  aCol;.    pSelTa
6e00: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
6e10: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
6e20: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   0;.    sqlite3D
6e30: 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53  eleteTable(0, pS
6e40: 65 6c 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f  elTab);.  }..  /
6e50: 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
6e60: 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d  t.busy is 1 it m
6e70: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
6e80: 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20  ing the SQL off 
6e90: 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65  the.  ** "sqlite
6ea0: 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c  _master" or "sql
6eb0: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22  ite_temp_master"
6ec0: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
6ed0: 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e  sk..  ** So do n
6ee0: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
6ef0: 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74  disk again.  Ext
6f00: 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61  ract the root pa
6f10: 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66  ge number.  ** f
6f20: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  or the table fro
6f30: 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e  m the db->init.n
6f40: 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28  ewTnum field.  (
6f50: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  The page number.
6f60: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65    ** should have
6f70: 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20   been put there 
6f80: 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65  by the sqliteOpe
6f90: 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20  nCb routine.).  
6fa0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
6fb0: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70 2d  t.busy ){.    p-
6fc0: 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74  >tnum = db->init
6fd0: 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20  .newTnum;.  }.. 
6fe0: 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69   /* If not initi
6ff0: 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72  alizing, then cr
7000: 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f  eate a record fo
7010: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a  r the new table.
7020: 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49    ** in the SQLI
7030: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
7040: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
7050: 20 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d    The record num
7060: 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ber.  ** for the
7070: 20 6e 65 77 20 74 61 62 6c 65 20 65 6e 74 72 79   new table entry
7080: 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
7090: 62 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  be on the stack.
70a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
70b0: 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52  is is a TEMPORAR
70c0: 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74  Y table, write t
70d0: 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  he entry into th
70e0: 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
70f0: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
7100: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
7110: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
7120: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
7130: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69  it.busy ){.    i
7140: 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt n;.    Vdbe *
7150: 76 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  v;..    v = sqli
7160: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
7170: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
7180: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69   ) return;.    i
7190: 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  f( p->pSelect==0
71a0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72   ){.      /* A r
71b0: 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a  egular table */.
71c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
71d0: 65 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65 61 74  eOp3(v, OP_Creat
71e0: 65 54 61 62 6c 65 2c 20 30 2c 20 70 2d 3e 69 44  eTable, 0, p->iD
71f0: 62 2c 20 28 63 68 61 72 2a 29 26 70 2d 3e 74 6e  b, (char*)&p->tn
7200: 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b  um, P3_POINTER);
7210: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7220: 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20    /* A view */. 
7230: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7240: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
7250: 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
7260: 7d 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20  }.    p->tnum = 
7270: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  0;.    sqlite3Vd
7280: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
7290: 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73  ll, 1, 0);.    s
72a0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
72b0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
72c0: 2c 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 3f  , p->pSelect==0?
72d0: 22 74 61 62 6c 65 22 3a 22 76 69 65 77 22 2c 20  "table":"view", 
72e0: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
72f0: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
7300: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
7310: 30 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  0, p->zName, 0);
7320: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7330: 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op3(v, OP_String
7340: 2c 20 30 2c 20 30 2c 20 70 2d 3e 7a 4e 61 6d 65  , 0, 0, p->zName
7350: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
7360: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
7370: 5f 44 75 70 2c 20 34 2c 20 30 29 3b 0a 20 20 20  _Dup, 4, 0);.   
7380: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7390: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
73a0: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
73b0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
73c0: 63 68 61 72 20 2a 7a 20 3d 20 63 72 65 61 74 65  char *z = create
73d0: 54 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20 20  TableStmt(p);.  
73e0: 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73 74 72 6c      n = z ? strl
73f0: 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 20 20 20  en(z) : 0;.     
7400: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7410: 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e  geP3(v, -1, z, n
7420: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
7430: 72 65 65 28 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  ree(z);.    }els
7440: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
7450: 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20   pEnd!=0 );.    
7460: 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d    n = Addr(pEnd-
7470: 3e 7a 29 20 2d 20 41 64 64 72 28 70 50 61 72 73  >z) - Addr(pPars
7480: 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a  e->sFirstToken.z
7490: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  ) + 1;.      sql
74a0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
74b0: 28 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e  (v, -1, pParse->
74c0: 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 2c 20 6e  sFirstToken.z, n
74d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
74e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
74f0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
7500: 35 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  5, 0);.    sqlit
7510: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
7520: 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20  P_PutIntKey, 0, 
7530: 30 29 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  0);.    if( !p->
7540: 69 44 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  iDb ){.      sql
7550: 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
7560: 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a 20  (db, v);.    }. 
7570: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7580: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
7590: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
75a0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
75b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
75c0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
75d0: 20 70 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20   p->iDb, 0);.   
75e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
75f0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
7600: 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ite, 1, 0);.    
7610: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
7620: 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   2;.      sqlite
7630: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
7640: 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 61 62  pSelect, SRT_Tab
7650: 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30 29 3b  le, 1, 0, 0, 0);
7660: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
7670: 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  e3EndWriteOperat
7680: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  ion(pParse);.  }
7690: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74  ..  /* Add the t
76a0: 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d  able to the in-m
76b0: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
76c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
76d0: 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  base..  */.  if(
76e0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
76f0: 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  ==0 && pParse->n
7700: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61  Err==0 ){.    Ta
7710: 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 46  ble *pOld;.    F
7720: 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 20 20  Key *pFKey;.    
7730: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
7740: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44  shInsert(&db->aD
7750: 62 5b 70 2d 3e 69 44 62 5d 2e 74 62 6c 48 61 73  b[p->iDb].tblHas
7760: 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  h, .            
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7780: 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  p->zName, strlen
7790: 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 29  (p->zName)+1, p)
77a0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29  ;.    if( pOld )
77b0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
77c0: 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d  p==pOld );  /* M
77d0: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
77e0: 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61  failed inside Ha
77f0: 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20  shInsert() */.  
7800: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
7810: 7d 0a 20 20 20 20 66 6f 72 28 70 46 4b 65 79 3d  }.    for(pFKey=
7820: 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b  p->pFKey; pFKey;
7830: 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e   pFKey=pFKey->pN
7840: 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20  extFrom){.      
7850: 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e  int nTo = strlen
7860: 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31  (pFKey->zTo) + 1
7870: 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 70  ;.      pFKey->p
7880: 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69 74 65 33  NextTo = sqlite3
7890: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
78a0: 62 5b 70 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c  b[p->iDb].aFKey,
78b0: 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f   pFKey->zTo, nTo
78c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
78d0: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
78e0: 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61 46 4b 65  aDb[p->iDb].aFKe
78f0: 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e  y, pFKey->zTo, n
7900: 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20 20  To, pFKey);.    
7910: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e  }.    pParse->pN
7920: 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  ewTable = 0;.   
7930: 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20   db->nTable++;. 
7940: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
7950: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
7960: 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nges;.  }.}../*.
7970: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
7980: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
7990: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
79a0: 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a  ate a new VIEW.*
79b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
79c0: 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73  eateView(.  Pars
79d0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
79e0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
79f0: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
7a00: 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a   *pBegin,     /*
7a10: 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
7a20: 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
7a30: 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
7a40: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20   Token *pName,  
7a50: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
7a60: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
7a70: 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
7a80: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
7a90: 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45  elect,   /* A SE
7aa0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
7ab0: 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
7ac0: 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a  the new view */.
7ad0: 20 20 69 6e 74 20 69 73 54 65 6d 70 20 20 20 20    int isTemp    
7ae0: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72       /* TRUE for
7af0: 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65   a TEMPORARY vie
7b00: 77 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  w */.){.  Table 
7b10: 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63  *p;.  int n;.  c
7b20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
7b30: 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62  Token sEnd;.  Db
7b40: 46 69 78 65 72 20 73 46 69 78 3b 0a 0a 20 20 73  Fixer sFix;..  s
7b50: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
7b60: 28 70 50 61 72 73 65 2c 20 70 42 65 67 69 6e 2c  (pParse, pBegin,
7b70: 20 70 4e 61 6d 65 2c 20 69 73 54 65 6d 70 2c 20   pName, isTemp, 
7b80: 31 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  1);.  p = pParse
7b90: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
7ba0: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73  f( p==0 || pPars
7bb0: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73  e->nErr ){.    s
7bc0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
7bd0: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  te(pSelect);.   
7be0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
7bf0: 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
7c00: 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
7c10: 20 70 2d 3e 69 44 62 2c 20 22 76 69 65 77 22 2c   p->iDb, "view",
7c20: 20 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20 73   pName).    && s
7c30: 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28  qlite3FixSelect(
7c40: 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 0a  &sFix, pSelect).
7c50: 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
7c60: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
7c70: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
7c80: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  n;.  }..  /* Mak
7c90: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
7ca0: 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74  entire SELECT st
7cb0: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
7cc0: 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
7cd0: 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f   ** This will fo
7ce0: 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72  rce all the Expr
7cf0: 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20  .token.z values 
7d00: 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
7d10: 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
7d20: 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69   rather than poi
7d30: 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20  nt to the input 
7d40: 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d  string - which m
7d50: 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  eans that.  ** t
7d60: 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74  hey will persist
7d70: 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65   after the curre
7d80: 6e 74 20 73 71 6c 69 74 65 5f 65 78 65 63 28 29  nt sqlite_exec()
7d90: 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20   call returns.. 
7da0: 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74   */.  p->pSelect
7db0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
7dc0: 44 75 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  Dup(pSelect);.  
7dd0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
7de0: 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  ete(pSelect);.  
7df0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d  if( !pParse->db-
7e00: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
7e10: 20 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74    sqlite3ViewGet
7e20: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
7e30: 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  se, p);.  }..  /
7e40: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64  * Locate the end
7e50: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56   of the CREATE V
7e60: 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  IEW statement.  
7e70: 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20  Make sEnd point 
7e80: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e  to.  ** the end.
7e90: 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70  .  */.  sEnd = p
7ea0: 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
7eb0: 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b  n;.  if( sEnd.z[
7ec0: 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b  0]!=0 && sEnd.z[
7ed0: 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73  0]!=';' ){.    s
7ee0: 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b  End.z += sEnd.n;
7ef0: 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  .  }.  sEnd.n = 
7f00: 30 3b 0a 20 20 6e 20 3d 20 28 28 69 6e 74 29 73  0;.  n = ((int)s
7f10: 45 6e 64 2e 7a 29 20 2d 20 28 69 6e 74 29 70 42  End.z) - (int)pB
7f20: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 70  egin->z;.  z = p
7f30: 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c  Begin->z;.  whil
7f40: 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31  e( n>0 && (z[n-1
7f50: 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63  ]==';' || isspac
7f60: 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d  e(z[n-1])) ){ n-
7f70: 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20  -; }.  sEnd.z = 
7f80: 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e  &z[n-1];.  sEnd.
7f90: 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65  n = 1;..  /* Use
7fa0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
7fb0: 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76 69  () to add the vi
7fc0: 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45  ew to the SQLITE
7fd0: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f  _MASTER table */
7fe0: 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  .  sqlite3EndTab
7ff0: 6c 65 28 70 50 61 72 73 65 2c 20 26 73 45 6e 64  le(pParse, &sEnd
8000: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  , 0);.  return;.
8010: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62  }../*.** The Tab
8020: 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61  le structure pTa
8030: 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ble is really a 
8040: 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74  VIEW.  Fill in t
8050: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  he names of.** t
8060: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
8070: 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54  e view in the pT
8080: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20  able structure. 
8090: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
80a0: 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e  er.** of errors.
80b0: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73    If an error is
80c0: 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65   seen leave an e
80d0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
80e0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
80f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
8100: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
8110: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
8120: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
8130: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
8140: 69 73 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ist;.  Select *p
8150: 53 65 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70 53  Sel;.  Table *pS
8160: 65 6c 54 61 62 3b 0a 20 20 69 6e 74 20 6e 45 72  elTab;.  int nEr
8170: 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  r = 0;..  assert
8180: 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 20 20 2f  ( pTable );..  /
8190: 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f  * A positive nCo
81a0: 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75  l means the colu
81b0: 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68  mns names for th
81c0: 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a  is view are.  **
81d0: 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a   already known..
81e0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
81f0: 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75  e->nCol>0 ) retu
8200: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65  rn 0;..  /* A ne
8210: 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61  gative nCol is a
8220: 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20   special marker 
8230: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20  meaning that we 
8240: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  are currently.  
8250: 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d  ** trying to com
8260: 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pute the column 
8270: 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e  names.  If we en
8280: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
8290: 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67   with.  ** a neg
82a0: 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d  ative nCol, it m
82b0: 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65  eans two or more
82c0: 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f   views form a lo
82d0: 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  op, like this:. 
82e0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45   **.  **     CRE
82f0: 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20  ATE VIEW one AS 
8300: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77  SELECT * FROM tw
8310: 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  o;.  **     CREA
8320: 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53  TE VIEW two AS S
8330: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65  ELECT * FROM one
8340: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75  ;.  **.  ** Actu
8350: 61 6c 6c 79 2c 20 74 68 69 73 20 65 72 72 6f 72  ally, this error
8360: 20 69 73 20 63 61 75 67 68 74 20 70 72 65 76 69   is caught previ
8370: 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20 74 68 65  ously and so the
8380: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a   following test.
8390: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61    ** should alwa
83a0: 79 73 20 66 61 69 6c 2e 20 20 42 75 74 20 77 65  ys fail.  But we
83b0: 20 77 69 6c 6c 20 6c 65 61 76 65 20 69 74 20 69   will leave it i
83c0: 6e 20 70 6c 61 63 65 20 6a 75 73 74 20 74 6f 20  n place just to 
83d0: 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20  be safe..  */.  
83e0: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
83f0: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
8400: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8410: 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69  , "view %s is ci
8420: 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64  rcularly defined
8430: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
8440: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
8450: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
8460: 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
8470: 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20  t means we need 
8480: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74  to compute the t
8490: 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f  able names..  */
84a0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
84b0: 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 20 2f 2a  e->pSelect ); /*
84c0: 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c 20 74 68 65   If nCol==0, the
84d0: 6e 20 70 54 61 62 6c 65 20 6d 75 73 74 20 62 65  n pTable must be
84e0: 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 70 53 65   a VIEW */.  pSe
84f0: 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  l = pTable->pSel
8500: 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20  ect;..  /* Note 
8510: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f  that the call to
8520: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
8530: 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c  tOfSelect() will
8540: 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a   expand any.  **
8550: 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e   "*" elements in
8560: 20 74 68 69 73 20 6c 69 73 74 2e 20 20 42 75 74   this list.  But
8570: 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   we will need to
8580: 20 72 65 73 74 6f 72 65 20 74 68 65 20 6c 69 73   restore the lis
8590: 74 0a 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69  t.  ** back to i
85a0: 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66  ts original conf
85b0: 69 67 75 72 61 74 69 6f 6e 20 61 66 74 65 72 77  iguration afterw
85c0: 61 72 64 73 2c 20 73 6f 20 77 65 20 73 61 76 65  ards, so we save
85d0: 20 61 20 63 6f 70 79 20 6f 66 0a 20 20 2a 2a 20   a copy of.  ** 
85e0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 20  the original in 
85f0: 70 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 70  pEList..  */.  p
8600: 45 4c 69 73 74 20 3d 20 70 53 65 6c 2d 3e 70 45  EList = pSel->pE
8610: 4c 69 73 74 3b 0a 20 20 70 53 65 6c 2d 3e 70 45  List;.  pSel->pE
8620: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
8630: 70 72 4c 69 73 74 44 75 70 28 70 45 4c 69 73 74  prListDup(pEList
8640: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 2d 3e 70  );.  if( pSel->p
8650: 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  EList==0 ){.    
8660: 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70  pSel->pEList = p
8670: 45 4c 69 73 74 3b 0a 20 20 20 20 72 65 74 75 72  EList;.    retur
8680: 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  n 1;  /* Malloc 
8690: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  failed */.  }.  
86a0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d  pTable->nCol = -
86b0: 31 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d 20 73  1;.  pSelTab = s
86c0: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
86d0: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
86e0: 30 2c 20 70 53 65 6c 29 3b 0a 20 20 69 66 28 20  0, pSel);.  if( 
86f0: 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 61  pSelTab ){.    a
8700: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61  ssert( pTable->a
8710: 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  Col==0 );.    pT
8720: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65  able->nCol = pSe
8730: 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
8740: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70  pTable->aCol = p
8750: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
8760: 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
8770: 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  = 0;.    pSelTab
8780: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
8790: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
87a0: 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a  le(0, pSelTab);.
87b0: 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74      DbSetPropert
87c0: 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  y(pParse->db, pT
87d0: 61 62 6c 65 2d 3e 69 44 62 2c 20 44 42 5f 55 6e  able->iDb, DB_Un
87e0: 72 65 73 65 74 56 69 65 77 73 29 3b 0a 20 20 7d  resetViews);.  }
87f0: 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 6c 65  else{.    pTable
8800: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
8810: 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71  nErr++;.  }.  sq
8820: 6c 69 74 65 33 53 65 6c 65 63 74 55 6e 62 69 6e  lite3SelectUnbin
8830: 64 28 70 53 65 6c 29 3b 0a 20 20 73 71 6c 69 74  d(pSel);.  sqlit
8840: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
8850: 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a  (pSel->pEList);.
8860: 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d    pSel->pEList =
8870: 20 70 45 4c 69 73 74 3b 0a 20 20 72 65 74 75 72   pEList;.  retur
8880: 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a  n nErr;  .}../*.
8890: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c  ** Clear the col
88a0: 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74  umn names from t
88b0: 68 65 20 56 49 45 57 20 70 54 61 62 6c 65 2e 0a  he VIEW pTable..
88c0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
88d0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
88e0: 6e 65 76 65 72 20 61 6e 79 20 6f 74 68 65 72 20  never any other 
88f0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73  table or view is
8900: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 54 68   modified..** Th
8910: 65 20 76 69 65 77 20 70 61 73 73 65 64 20 69 6e  e view passed in
8920: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
8930: 6d 69 67 68 74 20 64 65 70 65 6e 64 20 64 69 72  might depend dir
8940: 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63  ectly or indirec
8950: 74 6c 79 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f  tly.** on the mo
8960: 64 69 66 69 65 64 20 6f 72 20 64 65 6c 65 74 65  dified or delete
8970: 64 20 74 61 62 6c 65 20 73 6f 20 77 65 20 6e 65  d table so we ne
8980: 65 64 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20  ed to clear the 
8990: 6f 6c 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61  old column.** na
89a0: 6d 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  mes so that they
89b0: 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 6d 70 75   will be recompu
89c0: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
89d0: 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
89e0: 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54  setColumnNames(T
89f0: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
8a00: 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e   int i;.  Column
8a10: 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74   *pCol;.  assert
8a20: 28 20 70 54 61 62 6c 65 21 3d 30 20 26 26 20 70  ( pTable!=0 && p
8a30: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 21 3d  Table->pSelect!=
8a40: 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  0 );.  for(i=0, 
8a50: 70 43 6f 6c 3d 70 54 61 62 6c 65 2d 3e 61 43 6f  pCol=pTable->aCo
8a60: 6c 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f  l; i<pTable->nCo
8a70: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
8a80: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
8a90: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
8aa0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f    sqliteFree(pCo
8ab0: 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73  l->zDflt);.    s
8ac0: 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e  qliteFree(pCol->
8ad0: 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zType);.  }.  sq
8ae0: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
8af0: 3e 61 43 6f 6c 29 3b 0a 20 20 70 54 61 62 6c 65  >aCol);.  pTable
8b00: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54  ->aCol = 0;.  pT
8b10: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
8b20: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
8b30: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
8b40: 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20  from every VIEW 
8b50: 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e  in database idx.
8b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8b70: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
8b80: 6c 6c 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 69  ll(sqlite *db, i
8b90: 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45  nt idx){.  HashE
8ba0: 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21 44  lem *i;.  if( !D
8bb0: 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
8bc0: 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
8bd0: 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b  Views) ) return;
8be0: 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48  .  for(i=sqliteH
8bf0: 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44  ashFirst(&db->aD
8c00: 62 5b 69 64 78 5d 2e 74 62 6c 48 61 73 68 29 3b  b[idx].tblHash);
8c10: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
8c20: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61  Next(i)){.    Ta
8c30: 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
8c40: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
8c50: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
8c60: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71  lect ){.      sq
8c70: 6c 69 74 65 56 69 65 77 52 65 73 65 74 43 6f 6c  liteViewResetCol
8c80: 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a  umnNames(pTab);.
8c90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c      }.  }.  DbCl
8ca0: 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20  earProperty(db, 
8cb0: 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  idx, DB_UnresetV
8cc0: 69 65 77 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iews);.}../*.** 
8cd0: 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 6c  Given a token, l
8ce0: 6f 6f 6b 20 75 70 20 61 20 74 61 62 6c 65 20 77  ook up a table w
8cf0: 69 74 68 20 74 68 61 74 20 6e 61 6d 65 2e 20 20  ith that name.  
8d00: 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 65  If not found, le
8d10: 61 76 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  ave.** an error 
8d20: 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 74  for the parser t
8d30: 6f 20 66 69 6e 64 20 61 6e 64 20 72 65 74 75 72  o find and retur
8d40: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c 65  n NULL..*/.Table
8d50: 20 2a 73 71 6c 69 74 65 33 54 61 62 6c 65 46 72   *sqlite3TableFr
8d60: 6f 6d 54 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70  omToken(Parse *p
8d70: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54  Parse, Token *pT
8d80: 6f 6b 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  ok){.  char *zNa
8d90: 6d 65 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  me;.  Table *pTa
8da0: 62 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  b;.  zName = sql
8db0: 69 74 65 33 54 61 62 6c 65 4e 61 6d 65 46 72 6f  ite3TableNameFro
8dc0: 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29 3b 0a 20 20  mToken(pTok);.  
8dd0: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72  if( zName==0 ) r
8de0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 54 61 62 20  eturn 0;.  pTab 
8df0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
8e00: 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  le(pParse->db, z
8e10: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Name, 0);.  sqli
8e20: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
8e30: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
8e40: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8e50: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
8e60: 73 75 63 68 20 74 61 62 6c 65 3a 20 25 54 22 2c  such table: %T",
8e70: 20 70 54 6f 6b 29 3b 0a 20 20 7d 0a 20 20 72 65   pTok);.  }.  re
8e80: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
8e90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8ea0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f   is called to do
8eb0: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44   the work of a D
8ec0: 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ROP TABLE statem
8ed0: 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73  ent..** pName is
8ee0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
8ef0: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f   table to be dro
8f00: 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  pped..*/.void sq
8f10: 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50  lite3DropTable(P
8f20: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
8f30: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20  ken *pName, int 
8f40: 69 73 56 69 65 77 29 7b 0a 20 20 54 61 62 6c 65  isView){.  Table
8f50: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 56 64 62 65   *pTable;.  Vdbe
8f60: 20 2a 76 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b   *v;.  int base;
8f70: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
8f80: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
8f90: 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50  t iDb;..  if( pP
8fa0: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
8fb0: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
8fc0: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  ed ) return;.  p
8fd0: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 54  Table = sqlite3T
8fe0: 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  ableFromToken(pP
8ff0: 61 72 73 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  arse, pName);.  
9000: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20  if( pTable==0 ) 
9010: 72 65 74 75 72 6e 3b 0a 20 20 69 44 62 20 3d 20  return;.  iDb = 
9020: 70 54 61 62 6c 65 2d 3e 69 44 62 3b 0a 20 20 61  pTable->iDb;.  a
9030: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
9040: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
9050: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9060: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
9070: 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
9080: 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  de;.    const ch
9090: 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
90a0: 41 5f 54 41 42 4c 45 28 70 54 61 62 6c 65 2d 3e  A_TABLE(pTable->
90b0: 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  iDb);.    const 
90c0: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
90d0: 61 44 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62 5d  aDb[pTable->iDb]
90e0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
90f0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
9100: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
9110: 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c  DELETE, zTab, 0,
9120: 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 72 65   zDb)){.      re
9130: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
9140: 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20  if( isView ){.  
9150: 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29      if( iDb==1 )
9160: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
9170: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
9180: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65  P_VIEW;.      }e
9190: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
91a0: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
91b0: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20  VIEW;.      }.  
91c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
91d0: 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  f( iDb==1 ){.   
91e0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
91f0: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42  TE_DROP_TEMP_TAB
9200: 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LE;.      }else{
9210: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
9220: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c  SQLITE_DROP_TABL
9230: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
9240: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
9250: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
9260: 2c 20 63 6f 64 65 2c 20 70 54 61 62 6c 65 2d 3e  , code, pTable->
9270: 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
9280: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  {.      return;.
9290: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
92a0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
92b0: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
92c0: 4c 45 54 45 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  LETE, pTable->zN
92d0: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
92e0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
92f0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
9300: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 72 65 61   if( pTable->rea
9310: 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c  dOnly ){.    sql
9320: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
9330: 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
9340: 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  ay not be droppe
9350: 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  d", pTable->zNam
9360: 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  e);.    pParse->
9370: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
9380: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  rn;.  }.  if( is
9390: 56 69 65 77 20 26 26 20 70 54 61 62 6c 65 2d 3e  View && pTable->
93a0: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
93b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
93c0: 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
93d0: 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c  ROP TABLE to del
93e0: 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70  ete table %s", p
93f0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Table->zName);. 
9400: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
9410: 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
9420: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20  pTable->pSelect 
9430: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
9440: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
9450: 75 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f  use DROP VIEW to
9460: 20 64 65 6c 65 74 65 20 76 69 65 77 20 25 73 22   delete view %s"
9470: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
9480: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
9490: 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
94a0: 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
94b0: 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
94c0: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a  he master table.
94d0: 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20    ** on disk..  
94e0: 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
94f0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
9500: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
9510: 73 74 61 74 69 63 20 56 64 62 65 4f 70 4c 69 73  static VdbeOpLis
9520: 74 20 64 72 6f 70 54 61 62 6c 65 5b 5d 20 3d 20  t dropTable[] = 
9530: 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77  {.      { OP_Rew
9540: 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52  ind,     0, ADDR
9550: 28 38 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20  (8),  0},.      
9560: 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20  { OP_String,    
9570: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
9580: 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20  , /* 1 */.      
9590: 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20  { OP_MemStore,  
95a0: 20 31 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d   1, 1,        0}
95b0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d  ,.      { OP_Mem
95c0: 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c 20 20  Load,    1, 0,  
95d0: 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a        0}, /* 3 *
95e0: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c  /.      { OP_Col
95f0: 75 6d 6e 2c 20 20 20 20 20 30 2c 20 32 2c 20 20  umn,     0, 2,  
9600: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
9610: 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20  { OP_Ne,        
9620: 20 30 2c 20 41 44 44 52 28 37 29 2c 20 20 30 7d   0, ADDR(7),  0}
9630: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c  ,.      { OP_Del
9640: 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ete,     0, 0,  
9650: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
9660: 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20  { OP_Next,      
9670: 20 30 2c 20 41 44 44 52 28 33 29 2c 20 20 30 7d   0, ADDR(3),  0}
9680: 2c 20 2f 2a 20 37 20 2a 2f 0a 20 20 20 20 7d 3b  , /* 7 */.    };
9690: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
96a0: 3b 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a 70  ;.    Trigger *p
96b0: 54 72 69 67 67 65 72 3b 0a 20 20 20 20 73 71 6c  Trigger;.    sql
96c0: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
96d0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
96e0: 30 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b  0, pTable->iDb);
96f0: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c  ..    /* Drop al
9700: 6c 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63  l triggers assoc
9710: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
9720: 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
9730: 65 64 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67  ed */.    pTrigg
9740: 65 72 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54 72  er = pTable->pTr
9750: 69 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65  igger;.    while
9760: 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20  ( pTrigger ){.  
9770: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69      assert( pTri
9780: 67 67 65 72 2d 3e 69 44 62 3d 3d 70 54 61 62 6c  gger->iDb==pTabl
9790: 65 2d 3e 69 44 62 20 7c 7c 20 70 54 72 69 67 67  e->iDb || pTrigg
97a0: 65 72 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20  er->iDb==1 );.  
97b0: 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54      sqlite3DropT
97c0: 72 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65  riggerPtr(pParse
97d0: 2c 20 70 54 72 69 67 67 65 72 2c 20 31 29 3b 0a  , pTrigger, 1);.
97e0: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
97f0: 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
9800: 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20       pTrigger = 
9810: 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b  pTrigger->pNext;
9820: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9830: 20 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d        pTrigger =
9840: 20 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65   pTable->pTrigge
9850: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
9860: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c  ..    /* Drop al
9870: 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  l SQLITE_MASTER 
9880: 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66  entries that ref
9890: 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  er to the table 
98a0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70  */.    sqlite3Op
98b0: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c  enMasterTable(v,
98c0: 20 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 20   pTable->iDb);. 
98d0: 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65     base = sqlite
98e0: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  3VdbeAddOpList(v
98f0: 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70  , ArraySize(drop
9900: 54 61 62 6c 65 29 2c 20 64 72 6f 70 54 61 62 6c  Table), dropTabl
9910: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
9920: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62  dbeChangeP3(v, b
9930: 61 73 65 2b 31 2c 20 70 54 61 62 6c 65 2d 3e 7a  ase+1, pTable->z
9940: 4e 61 6d 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  Name, 0);..    /
9950: 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54  * Drop all SQLIT
9960: 45 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20 65 6e  E_TEMP_MASTER en
9970: 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72  tries that refer
9980: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   to the table */
9990: 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d  .    if( pTable-
99a0: 3e 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20  >iDb!=1 ){.     
99b0: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
99c0: 65 72 54 61 62 6c 65 28 76 2c 20 31 29 3b 0a 20  erTable(v, 1);. 
99d0: 20 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69       base = sqli
99e0: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
99f0: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72  (v, ArraySize(dr
9a00: 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54 61  opTable), dropTa
9a10: 62 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ble);.      sqli
9a20: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
9a30: 76 2c 20 62 61 73 65 2b 31 2c 20 70 54 61 62 6c  v, base+1, pTabl
9a40: 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  e->zName, 0);.  
9a50: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 54 61    }..    if( pTa
9a60: 62 6c 65 2d 3e 69 44 62 3d 3d 30 20 29 7b 0a 20  ble->iDb==0 ){. 
9a70: 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e       sqlite3Chan
9a80: 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b  geCookie(db, v);
9a90: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9aa0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9ab0: 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
9ac0: 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20      if( !isView 
9ad0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9ae0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9af0: 44 65 73 74 72 6f 79 2c 20 70 54 61 62 6c 65 2d  Destroy, pTable-
9b00: 3e 74 6e 75 6d 2c 20 70 54 61 62 6c 65 2d 3e 69  >tnum, pTable->i
9b10: 44 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  Db);.      for(p
9b20: 49 64 78 3d 70 54 61 62 6c 65 2d 3e 70 49 6e 64  Idx=pTable->pInd
9b30: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
9b40: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
9b50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9b60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74  AddOp(v, OP_Dest
9b70: 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  roy, pIdx->tnum,
9b80: 20 70 49 64 78 2d 3e 69 44 62 29 3b 0a 20 20 20   pIdx->iDb);.   
9b90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
9ba0: 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70  qlite3EndWriteOp
9bb0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
9bc0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
9bd0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
9be0: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
9bf0: 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  he table..  **. 
9c00: 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 69   ** Exception: i
9c10: 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  f the SQL statem
9c20: 65 6e 74 20 62 65 67 61 6e 20 77 69 74 68 20 74  ent began with t
9c30: 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f  he EXPLAIN keywo
9c40: 72 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6e 6f  rd,.  ** then no
9c50: 20 63 68 61 6e 67 65 73 20 73 68 6f 75 6c 64 20   changes should 
9c60: 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20  be made..  */.  
9c70: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70  if( !pParse->exp
9c80: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  lain ){.    sqli
9c90: 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  teUnlinkAndDelet
9ca0: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 6c  eTable(db, pTabl
9cb0: 65 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  e);.    db->flag
9cc0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
9cd0: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 20  rnChanges;.  }. 
9ce0: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
9cf0: 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 7d 0a  All(db, iDb);.}.
9d00: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
9d10: 69 6e 65 20 63 6f 6e 73 74 72 75 63 74 73 20 61  ine constructs a
9d20: 20 50 33 20 73 74 72 69 6e 67 20 73 75 69 74 61   P3 string suita
9d30: 62 6c 65 20 66 6f 72 20 61 6e 20 4f 50 5f 4d 61  ble for an OP_Ma
9d40: 6b 65 49 64 78 4b 65 79 0a 2a 2a 20 6f 70 63 6f  keIdxKey.** opco
9d50: 64 65 20 61 6e 64 20 61 64 64 73 20 74 68 61 74  de and adds that
9d60: 20 50 33 20 73 74 72 69 6e 67 20 74 6f 20 74 68   P3 string to th
9d70: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
9d80: 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75 63  inserted instruc
9d90: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 76  tion.** in the v
9da0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
9db0: 20 54 68 65 20 50 33 20 73 74 72 69 6e 67 20 63   The P3 string c
9dc0: 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e  onsists of a sin
9dd0: 67 6c 65 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  gle character.**
9de0: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
9df0: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 70 49   in the index pI
9e00: 64 78 20 6f 66 20 74 61 62 6c 65 20 70 54 61 62  dx of table pTab
9e10: 2e 20 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  .  If the column
9e20: 20 75 73 65 73 0a 2a 2a 20 61 20 6e 75 6d 65 72   uses.** a numer
9e30: 69 63 20 73 6f 72 74 20 6f 72 64 65 72 2c 20 74  ic sort order, t
9e40: 68 65 6e 20 74 68 65 20 50 33 20 73 74 72 69 6e  hen the P3 strin
9e50: 67 20 63 68 61 72 61 63 74 65 72 20 63 6f 72 72  g character corr
9e60: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0a 2a 2a 20  esponding to.** 
9e70: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 73 20 27  that column is '
9e80: 6e 27 2e 20 20 49 66 20 74 68 65 20 63 6f 6c 75  n'.  If the colu
9e90: 6d 6e 20 75 73 65 73 20 61 20 74 65 78 74 20 73  mn uses a text s
9ea0: 6f 72 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20  ort order, then 
9eb0: 74 68 65 0a 2a 2a 20 50 33 20 73 74 72 69 6e 67  the.** P3 string
9ec0: 20 69 73 20 27 74 27 2e 20 20 53 65 65 20 74 68   is 't'.  See th
9ed0: 65 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 20  e OP_MakeIdxKey 
9ee0: 6f 70 63 6f 64 65 20 64 6f 63 75 6d 65 6e 74 61  opcode documenta
9ef0: 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 64 64 69  tion for.** addi
9f00: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
9f10: 6f 6e 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68  on.  See also th
9f20: 65 20 73 71 6c 69 74 65 33 41 64 64 4b 65 79 54  e sqlite3AddKeyT
9f30: 79 70 65 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a  ype() routine..*
9f40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
9f50: 64 49 64 78 4b 65 79 54 79 70 65 28 56 64 62 65  dIdxKeyType(Vdbe
9f60: 20 2a 76 2c 20 49 6e 64 65 78 20 2a 70 49 64 78   *v, Index *pIdx
9f70: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65  ){.  char *zType
9f80: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
9f90: 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61  .  int i, n;.  a
9fa0: 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 26  ssert( pIdx!=0 &
9fb0: 26 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 21 3d  & pIdx->pTable!=
9fc0: 30 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 70 49  0 );.  pTab = pI
9fd0: 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 6e 20  dx->pTable;.  n 
9fe0: 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  = pIdx->nColumn;
9ff0: 0a 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74  .  zType = sqlit
a000: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 2b 31 20  eMallocRaw( n+1 
a010: 29 3b 0a 20 20 69 66 28 20 7a 54 79 70 65 3d 3d  );.  if( zType==
a020: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
a030: 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
a040: 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  {.    int iCol =
a050: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
a060: 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
a070: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
a080: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
a090: 20 20 69 66 28 20 28 70 54 61 62 2d 3e 61 43 6f    if( (pTab->aCo
a0a0: 6c 5b 69 43 6f 6c 5d 2e 73 6f 72 74 4f 72 64 65  l[iCol].sortOrde
a0b0: 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f 54 59  r & SQLITE_SO_TY
a0c0: 50 45 4d 41 53 4b 29 3d 3d 53 51 4c 49 54 45 5f  PEMASK)==SQLITE_
a0d0: 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  SO_TEXT ){.     
a0e0: 20 7a 54 79 70 65 5b 69 5d 20 3d 20 27 74 27 3b   zType[i] = 't';
a0f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a100: 20 20 7a 54 79 70 65 5b 69 5d 20 3d 20 27 6e 27    zType[i] = 'n'
a110: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 54  ;.    }.  }.  zT
a120: 79 70 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 73 71  ype[n] = 0;.  sq
a130: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
a140: 33 28 76 2c 20 2d 31 2c 20 7a 54 79 70 65 2c 20  3(v, -1, zType, 
a150: 6e 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  n);.  sqliteFree
a160: 28 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (zType);.}../*.*
a170: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
a180: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
a190: 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e  te a new foreign
a1a0: 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c   key on the tabl
a1b0: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  e.** currently u
a1c0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
a1d0: 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74  n.  pFromCol det
a1e0: 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f  ermines which co
a1f0: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
a200: 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f  current table po
a210: 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69  int to the forei
a220: 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f  gn key.  If pFro
a230: 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  mCol==0 then.** 
a240: 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20  connect the key 
a250: 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  to the last colu
a260: 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54  mn inserted.  pT
a270: 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
a280: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65  .** the table re
a290: 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43  ferred to.  pToC
a2a0: 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ol is a list of 
a2b0: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74  tables in the ot
a2c0: 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65  her.** pTo table
a2d0: 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67   that the foreig
a2e0: 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e  n key points to.
a2f0: 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
a300: 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
a310: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
a320: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
a330: 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
a340: 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
a350: 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
a360: 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
a370: 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
a380: 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
a390: 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
a3a0: 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
a3b0: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
a3c0: 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
a3d0: 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
a3e0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
a3f0: 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20  field.  The new 
a400: 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c  FKey.** is not l
a410: 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61  inked into db->a
a420: 46 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f 69  FKey at this poi
a430: 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e  nt - that does n
a440: 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74  ot happen.** unt
a450: 69 6c 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  il sqlite3EndTab
a460: 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  le()..**.** The 
a470: 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73  foreign key is s
a480: 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45  et for IMMEDIATE
a490: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20   processing.  A 
a4a0: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a  subsequent call.
a4b0: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66  ** to sqlite3Def
a4c0: 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d  erForeignKey() m
a4d0: 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73  ight change this
a4e0: 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f   to DEFERRED..*/
a4f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
a500: 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20  ateForeignKey(. 
a510: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
a520: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
a530: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 64   context */.  Id
a540: 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20  List *pFromCol, 
a550: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e     /* Columns in
a560: 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74   this table that
a570: 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20   point to other 
a580: 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  table */.  Token
a590: 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20   *pTo,          
a5a0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
a5b0: 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
a5c0: 49 64 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20  IdList *pToCol, 
a5d0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20       /* Columns 
a5e0: 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  in the other tab
a5f0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
a600: 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
a610: 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  Conflict resolut
a620: 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20  ion algorithms. 
a630: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
a640: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
a650: 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74  able;.  int nByt
a660: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
a670: 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a  t nCol;.  char *
a680: 7a 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  z;.  FKey *pFKey
a690: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
a6a0: 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28   pTo!=0 );.  if(
a6b0: 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
a6c0: 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f  >nErr ) goto fk_
a6d0: 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  end;.  if( pFrom
a6e0: 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Col==0 ){.    in
a6f0: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c  t iCol = p->nCol
a700: 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  -1;.    if( iCol
a710: 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  <0 ) goto fk_end
a720: 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c  ;.    if( pToCol
a730: 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21   && pToCol->nId!
a740: 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
a750: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
a760: 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79  se, "foreign key
a770: 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20   on %s".        
a780: 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65   " should refere
a790: 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c  nce only one col
a7a0: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22  umn of table %T"
a7b0: 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43  ,.         p->aC
a7c0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20  ol[iCol].zName, 
a7d0: 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  pTo);.      goto
a7e0: 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20   fk_end;.    }. 
a7f0: 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d     nCol = 1;.  }
a800: 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20  else if( pToCol 
a810: 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d  && pToCol->nId!=
a820: 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 49 64 20 29 7b  pFromCol->nId ){
a830: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
a840: 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
a850: 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20       "number of 
a860: 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69  columns in forei
a870: 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20  gn key does not 
a880: 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72  match the number
a890: 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63   of ".        "c
a8a0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
a8b0: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29  ferenced table")
a8c0: 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  ;.    goto fk_en
a8d0: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
a8e0: 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d  nCol = pFromCol-
a8f0: 3e 6e 49 64 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  >nId;.  }.  nByt
a900: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65  e = sizeof(*pFKe
a910: 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66  y) + nCol*sizeof
a920: 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29  (pFKey->aCol[0])
a930: 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20   + pTo->n + 1;. 
a940: 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
a950: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
a960: 6f 43 6f 6c 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  oCol->nId; i++){
a970: 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
a980: 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61  strlen(pToCol->a
a990: 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a  [i].zName) + 1;.
a9a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65      }.  }.  pFKe
a9b0: 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  y = sqliteMalloc
a9c0: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
a9d0: 20 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f   pFKey==0 ) goto
a9e0: 20 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79   fk_end;.  pFKey
a9f0: 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70  ->pFrom = p;.  p
aa00: 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20  FKey->pNextFrom 
aa10: 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20  = p->pFKey;.  z 
aa20: 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b  = (char*)&pFKey[
aa30: 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f  1];.  pFKey->aCo
aa40: 6c 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c  l = (struct sCol
aa50: 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73  Map*)z;.  z += s
aa60: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f  izeof(struct sCo
aa70: 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46  lMap)*nCol;.  pF
aa80: 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20  Key->zTo = z;.  
aa90: 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a  memcpy(z, pTo->z
aaa0: 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70  , pTo->n);.  z[p
aab0: 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20  To->n] = 0;.  z 
aac0: 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70  += pTo->n+1;.  p
aad0: 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20  FKey->pNextTo = 
aae0: 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c  0;.  pFKey->nCol
aaf0: 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70   = nCol;.  if( p
ab00: 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
ab10: 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d    pFKey->aCol[0]
ab20: 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c  .iFrom = p->nCol
ab30: 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
ab40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
ab50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
ab60: 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
ab70: 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a  =0; j<p->nCol; j
ab80: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
ab90: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
aba0: 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  p->aCol[j].zName
abb0: 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d  , pFromCol->a[i]
abc0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
abd0: 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61          pFKey->a
abe0: 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a  Col[i].iFrom = j
abf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
ac00: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
ac10: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
ac20: 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  >=p->nCol ){.   
ac30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
ac40: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
ac50: 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e          "unknown
ac60: 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69   column \"%s\" i
ac70: 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  n foreign key de
ac80: 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20  finition", .    
ac90: 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e        pFromCol->
aca0: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
acb0: 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64       goto fk_end
acc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
acd0: 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c    }.  if( pToCol
ace0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
acf0: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
ad00: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72       int n = str
ad10: 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  len(pToCol->a[i]
ad20: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  .zName);.      p
ad30: 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43  FKey->aCol[i].zC
ad40: 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65  ol = z;.      me
ad50: 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e  mcpy(z, pToCol->
ad60: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a  a[i].zName, n);.
ad70: 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a        z[n] = 0;.
ad80: 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a        z += n+1;.
ad90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65      }.  }.  pFKe
ada0: 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
adb0: 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65  0;.  pFKey->dele
adc0: 74 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26  teConf = flags &
add0: 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e   0xff;.  pFKey->
ade0: 75 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c  updateConf = (fl
adf0: 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66  ags >> 8 ) & 0xf
ae00: 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65  f;.  pFKey->inse
ae10: 72 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20  rtConf = (flags 
ae20: 3e 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a  >> 16 ) & 0xff;.
ae30: 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66  .  /* Link the f
ae40: 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68  oreign key to th
ae50: 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c  e table as the l
ae60: 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20  ast step..  */. 
ae70: 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65   p->pFKey = pFKe
ae80: 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a  y;.  pFKey = 0;.
ae90: 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74  .fk_end:.  sqlit
aea0: 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20  eFree(pFKey);.  
aeb0: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
aec0: 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20  ete(pFromCol);. 
aed0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
aee0: 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a  lete(pToCol);.}.
aef0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
af00: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
af10: 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20  en an INITIALLY 
af20: 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49  IMMEDIATE or INI
af30: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
af40: 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65  ** clause is see
af50: 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66  n as part of a f
af60: 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
af70: 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65  ition.  The isDe
af80: 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65  ferred.** parame
af90: 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49  ter is 1 for INI
afa0: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20  TIALLY DEFERRED 
afb0: 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41  and 0 for INITIA
afc0: 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a  LLY IMMEDIATE..*
afd0: 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f  * The behavior o
afe0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
aff0: 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65  tly created fore
b000: 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73  ign key is adjus
b010: 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  ted.** according
b020: 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
b030: 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
b040: 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ey(Parse *pParse
b050: 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64  , int isDeferred
b060: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
b070: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b  ;.  FKey *pFKey;
b080: 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70  .  if( (pTab = p
b090: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
b0a0: 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d  )==0 || (pFKey =
b0b0: 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30   pTab->pFKey)==0
b0c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b   ) return;.  pFK
b0d0: 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
b0e0: 20 69 73 44 65 66 65 72 72 65 64 3b 0a 7d 0a 0a   isDeferred;.}..
b0f0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
b100: 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20  ew index for an 
b110: 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 49 6e 64  SQL table.  pInd
b120: 65 78 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  ex is the name o
b130: 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20  f the index .** 
b140: 61 6e 64 20 70 54 61 62 6c 65 20 69 73 20 74 68  and pTable is th
b150: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
b160: 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
b170: 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68  e indexed.  Both
b180: 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c   will .** be NUL
b190: 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20  L for a primary 
b1a0: 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20  key or an index 
b1b0: 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20  that is created 
b1c0: 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20  to satisfy a.** 
b1d0: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
b1e0: 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e  t.  If pTable an
b1f0: 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c  d pIndex are NUL
b200: 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70  L, use pParse->p
b210: 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74  NewTable.** as t
b220: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
b230: 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d  ndexed.  pParse-
b240: 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20  >pNewTable is a 
b250: 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a  table that is.**
b260: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
b270: 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
b280: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
b290: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
b2a0: 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
b2b0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
b2c0: 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74   indexed.  pList
b2d0: 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66   will be NULL if
b2e0: 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72   this.** is a pr
b2f0: 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69  imary key or uni
b300: 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f  que-constraint o
b310: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
b320: 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a  t column added.*
b330: 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  * to the table c
b340: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
b350: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a  onstruction.  .*
b360: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
b370: 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72  eateIndex(.  Par
b380: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
b390: 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   All information
b3a0: 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73   about this pars
b3b0: 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  e */.  Token *pN
b3c0: 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ame,    /* Name 
b3d0: 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d  of the index.  M
b3e0: 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
b3f0: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 6c 65 2c  SrcList *pTable,
b400: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
b410: 74 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20  table to index. 
b420: 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   Use pParse->pNe
b430: 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20  wTable if 0 */. 
b440: 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20   IdList *pList, 
b450: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63    /* A list of c
b460: 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
b470: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
b480: 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f 45  Error,     /* OE
b490: 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72  _Abort, OE_Ignor
b4a0: 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f  e, OE_Replace, o
b4b0: 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54  r OE_None */.  T
b4c0: 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20  oken *pStart,   
b4d0: 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
b4e0: 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
b4f0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
b500: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
b510: 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20 20 2f  ken *pEnd      /
b520: 2a 20 54 68 65 20 22 29 22 20 74 68 61 74 20 63  * The ")" that c
b530: 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41 54 45  loses the CREATE
b540: 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
b550: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
b560: 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62  pTab;     /* Tab
b570: 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
b580: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
b590: 64 65 78 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e  dex;   /* The in
b5a0: 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65  dex to be create
b5b0: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  d */.  char *zNa
b5c0: 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c  me = 0;.  int i,
b5d0: 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c   j;.  Token null
b5e0: 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b 65 20 74  Id;    /* Fake t
b5f0: 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74  oken for an empt
b600: 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44  y ID list */.  D
b610: 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20  bFixer sFix;    
b620: 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67  /* For assigning
b630: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20   database names 
b640: 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69  to pTable */.  i
b650: 6e 74 20 69 73 54 65 6d 70 3b 20 20 20 20 20 20  nt isTemp;      
b660: 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 74 65  /* True for a te
b670: 6d 70 6f 72 61 72 79 20 69 6e 64 65 78 20 2a 2f  mporary index */
b680: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
b690: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
b6a0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
b6b0: 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  || sqlite_malloc
b6c0: 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65  _failed ) goto e
b6d0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
b6e0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  ;.  if( db->init
b6f0: 2e 62 75 73 79 20 0a 20 20 20 20 20 26 26 20 73  .busy .     && s
b700: 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
b710: 46 69 78 2c 20 70 50 61 72 73 65 2c 20 64 62 2d  Fix, pParse, db-
b720: 3e 69 6e 69 74 2e 69 44 62 2c 20 22 69 6e 64 65  >init.iDb, "inde
b730: 78 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20 20  x", pName).     
b740: 26 26 20 73 71 6c 69 74 65 33 46 69 78 53 72 63  && sqlite3FixSrc
b750: 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54 61 62  List(&sFix, pTab
b760: 6c 65 29 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74  le).  ){.    got
b770: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
b780: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  dex;.  }..  /*. 
b790: 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62   ** Find the tab
b7a0: 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
b7b0: 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72   indexed.  Retur
b7c0: 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66  n early if not f
b7d0: 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ound..  */.  if(
b7e0: 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20   pTable!=0 ){.  
b7f0: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 21    assert( pName!
b800: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
b810: 28 20 70 54 61 62 6c 65 2d 3e 6e 53 72 63 3d 3d  ( pTable->nSrc==
b820: 31 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  1 );.    pTab = 
b830: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c   sqlite3SrcListL
b840: 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54  ookup(pParse, pT
b850: 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  able);.  }else{.
b860: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
b870: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62  e==0 );.    pTab
b880: 20 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   =  pParse->pNew
b890: 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  Table;.  }.  if(
b8a0: 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72   pTab==0 || pPar
b8b0: 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
b8c0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
b8d0: 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72  x;.  if( pTab->r
b8e0: 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73  eadOnly ){.    s
b8f0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
b900: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
b910: 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
b920: 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  xed", pTab->zNam
b930: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
b940: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
b950: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e    }.  if( pTab->
b960: 69 44 62 3e 3d 32 20 26 26 20 64 62 2d 3e 69 6e  iDb>=2 && db->in
b970: 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20  it.busy==0 ){.  
b980: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
b990: 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
b9a0: 20 25 73 20 6d 61 79 20 6e 6f 74 20 68 61 76 65   %s may not have
b9b0: 20 69 6e 64 69 63 65 73 20 61 64 64 65 64 22 2c   indices added",
b9c0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
b9d0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
b9e0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
b9f0: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
ba00: 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
ba10: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
ba20: 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74  , "views may not
ba30: 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
ba40: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
ba50: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
ba60: 20 69 73 54 65 6d 70 20 3d 20 70 54 61 62 2d 3e   isTemp = pTab->
ba70: 69 44 62 3d 3d 31 3b 0a 0a 20 20 2f 2a 0a 20 20  iDb==1;..  /*.  
ba80: 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65  ** Find the name
ba90: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
baa0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
bab0: 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
bac0: 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65  nother.  ** inde
bad0: 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20  x or table with 
bae0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
baf0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
bb00: 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65  tion:  If we are
bb10: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d   reading the nam
bb20: 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20  es of permanent 
bb30: 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65  indices from the
bb40: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73  .  ** sqlite_mas
bb50: 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75  ter table (becau
bb60: 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
bb70: 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68  ocess changed th
bb80: 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20  e schema) and.  
bb90: 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  ** one of the in
bba0: 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64  dex names collid
bbb0: 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  es with the name
bbc0: 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   of a temporary 
bbd0: 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e  table or.  ** in
bbe0: 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c  dex, then we wil
bbf0: 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72  l continue to pr
bc00: 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78  ocess this index
bc10: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
bc20: 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
bc30: 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a   that we are.  *
bc40: 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  * dealing with a
bc50: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
bc60: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
bc70: 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  t.  We have to i
bc80: 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f  nvent our.  ** o
bc90: 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  wn name..  */.  
bca0: 69 66 28 20 70 4e 61 6d 65 20 26 26 20 21 64 62  if( pName && !db
bcb0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
bcc0: 20 20 20 49 6e 64 65 78 20 2a 70 49 53 61 6d 65     Index *pISame
bcd0: 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 6e 6f 74  Name;    /* Anot
bce0: 68 65 72 20 69 6e 64 65 78 20 77 69 74 68 20 74  her index with t
bcf0: 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a  he same name */.
bd00: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 53 61 6d      Table *pTSam
bd10: 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74  eName;    /* A t
bd20: 61 62 6c 65 20 77 69 74 68 20 73 61 6d 65 20 6e  able with same n
bd30: 61 6d 65 20 61 73 20 74 68 65 20 69 6e 64 65 78  ame as the index
bd40: 20 2a 2f 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   */.    zName = 
bd50: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e  sqliteStrNDup(pN
bd60: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
bd70: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
bd80: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
bd90: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
bda0: 20 20 69 66 28 20 28 70 49 53 61 6d 65 4e 61 6d    if( (pISameNam
bdb0: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
bdc0: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
bdd0: 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  0))!=0 ){.      
bde0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
bdf0: 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25  pParse, "index %
be00: 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  s already exists
be10: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
be20: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
be30: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
be40: 20 20 20 69 66 28 20 28 70 54 53 61 6d 65 4e 61     if( (pTSameNa
be50: 6d 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  me = sqlite3Find
be60: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
be70: 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   0))!=0 ){.     
be80: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
be90: 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
bea0: 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62  is already a tab
beb0: 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  le named %s", zN
bec0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
bed0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
bee0: 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ex;.    }.  }els
bef0: 65 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30 20 29  e if( pName==0 )
bf00: 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
bf10: 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  30];.    int n;.
bf20: 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70      Index *pLoop
bf30: 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ;.    for(pLoop=
bf40: 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d  pTab->pIndex, n=
bf50: 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  1; pLoop; pLoop=
bf60: 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b  pLoop->pNext, n+
bf70: 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e 74 66  +){}.    sprintf
bf80: 28 7a 42 75 66 2c 22 25 64 29 22 2c 6e 29 3b 0a  (zBuf,"%d)",n);.
bf90: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
bfa0: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
bfb0: 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 28 22 2c  ing(&zName, "(",
bfc0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 20   pTab->zName, " 
bfd0: 61 75 74 6f 69 6e 64 65 78 20 22 2c 20 7a 42 75  autoindex ", zBu
bfe0: 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  f, (char*)0);.  
bff0: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
c000: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
c010: 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65  e_index;.  }else
c020: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  {.    zName = sq
c030: 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e 61 6d  liteStrNDup(pNam
c040: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
c050: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
c060: 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69   for authorizati
c070: 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  on to create an 
c080: 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e  index..  */.#ifn
c090: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c0a0: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
c0b0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
c0c0: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
c0d0: 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65  pTab->iDb].zName
c0e0: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
c0f0: 54 61 62 2d 3e 69 44 62 3d 3d 64 62 2d 3e 69 6e  Tab->iDb==db->in
c100: 69 74 2e 69 44 62 20 7c 7c 20 69 73 54 65 6d 70  it.iDb || isTemp
c110: 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   );.    if( sqli
c120: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
c130: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
c140: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
c150: 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62  (isTemp), 0, zDb
c160: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
c170: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
c180: 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  x;.    }.    i =
c190: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49   SQLITE_CREATE_I
c1a0: 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 69 73  NDEX;.    if( is
c1b0: 54 65 6d 70 20 29 20 69 20 3d 20 53 51 4c 49 54  Temp ) i = SQLIT
c1c0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
c1d0: 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
c1e0: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
c1f0: 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  arse, i, zName, 
c200: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
c210: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
c220: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
c230: 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
c240: 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69  dif..  /* If pLi
c250: 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20  st==0, it means 
c260: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
c270: 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20   called to make 
c280: 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b  a primary.  ** k
c290: 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61  ey out of the la
c2a0: 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20  st column added 
c2b0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  to the table und
c2c0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
c2d0: 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20  .  ** So create 
c2e0: 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73  a fake list to s
c2f0: 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20  imulate this..  
c300: 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  */.  if( pList==
c310: 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  0 ){.    nullId.
c320: 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  z = pTab->aCol[p
c330: 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61  Tab->nCol-1].zNa
c340: 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e  me;.    nullId.n
c350: 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c 6c 49 64   = strlen(nullId
c360: 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  .z);.    pList =
c370: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70   sqlite3IdListAp
c380: 70 65 6e 64 28 30 2c 20 26 6e 75 6c 6c 49 64 29  pend(0, &nullId)
c390: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
c3a0: 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
c3b0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
c3c0: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c  ..  /* .  ** All
c3d0: 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
c3e0: 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f  structure. .  */
c3f0: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
c400: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
c410: 28 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e  (Index) + strlen
c420: 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20 20  (zName) + 1 +.  
c430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c440: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74        sizeof(int
c450: 29 2a 70 4c 69 73 74 2d 3e 6e 49 64 20 29 3b 0a  )*pList->nId );.
c460: 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20    if( pIndex==0 
c470: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
c480: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49 6e 64  te_index;.  pInd
c490: 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28  ex->aiColumn = (
c4a0: 69 6e 74 2a 29 26 70 49 6e 64 65 78 5b 31 5d 3b  int*)&pIndex[1];
c4b0: 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
c4c0: 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65   = (char*)&pInde
c4d0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73  x->aiColumn[pLis
c4e0: 74 2d 3e 6e 49 64 5d 3b 0a 20 20 73 74 72 63 70  t->nId];.  strcp
c4f0: 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  y(pIndex->zName,
c500: 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65   zName);.  pInde
c510: 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
c520: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ;.  pIndex->nCol
c530: 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 49 64  umn = pList->nId
c540: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ;.  pIndex->onEr
c550: 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20  ror = onError;. 
c560: 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
c570: 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20  ex = pName==0;. 
c580: 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 3d 20 69   pIndex->iDb = i
c590: 73 54 65 6d 70 20 3f 20 31 20 3a 20 64 62 2d 3e  sTemp ? 1 : db->
c5a0: 69 6e 69 74 2e 69 44 62 3b 0a 0a 20 20 2f 2a 20  init.iDb;..  /* 
c5b0: 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  Scan the names o
c5c0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  f the columns of
c5d0: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
c5e0: 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a   indexed and.  *
c5f0: 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d  * load the colum
c600: 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74  n indices into t
c610: 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  he Index structu
c620: 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65  re.  Report an e
c630: 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79  rror.  ** if any
c640: 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66   column is not f
c650: 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ound..  */.  for
c660: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
c670: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f  Id; i++){.    fo
c680: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
c690: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
c6a0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
c6b0: 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
c6c0: 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  zName, pTab->aCo
c6d0: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[j].zName)==0 )
c6e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c6f0: 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e    if( j>=pTab->n
c700: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Col ){.      sql
c710: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
c720: 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68  rse, "table %s h
c730: 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d  as no column nam
c740: 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  ed %s",.        
c750: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69  pTab->zName, pLi
c760: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
c770: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
c780: 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  e(pIndex);.     
c790: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
c7a0: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
c7b0: 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
c7c0: 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 7d 0a  umn[i] = j;.  }.
c7d0: 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e  .  /* Link the n
c7e0: 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  ew Index structu
c7f0: 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20  re to its table 
c800: 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72  and to the other
c810: 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  .  ** in-memory 
c820: 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
c830: 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  res. .  */.  if(
c840: 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
c850: 6e 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  n ){.    Index *
c860: 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  p;.    p = sqlit
c870: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  e3HashInsert(&db
c880: 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44  ->aDb[pIndex->iD
c890: 62 5d 2e 69 64 78 48 61 73 68 2c 20 0a 20 20 20  b].idxHash, .   
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8b0: 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
c8c0: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64  ame, strlen(pInd
c8d0: 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49  ex->zName)+1, pI
c8e0: 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70  ndex);.    if( p
c8f0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
c900: 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20  ( p==pIndex );  
c910: 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
c920: 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ave failed */.  
c930: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
c940: 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 67 6f  Index);.      go
c950: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
c960: 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
c970: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
c980: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
c990: 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65  s;.  }..  /* Whe
c9a0: 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65  n adding an inde
c9b0: 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  x to the list of
c9c0: 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74   indices for a t
c9d0: 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20  able, make.  ** 
c9e0: 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  sure all indices
c9f0: 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c   labeled OE_Repl
ca00: 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61  ace come after a
ca10: 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64  ll those labeled
ca20: 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e  .  ** OE_Ignore.
ca30: 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
ca40: 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72  ary for the corr
ca50: 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  ect operation of
ca60: 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64   UPDATE.  ** and
ca70: 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20   INSERT..  */.  
ca80: 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  if( onError!=OE_
ca90: 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d  Replace || pTab-
caa0: 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20  >pIndex==0.     
cab0: 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65    || pTab->pInde
cac0: 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52  x->onError==OE_R
cad0: 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 70 49 6e  eplace){.    pIn
cae0: 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61  dex->pNext = pTa
caf0: 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70  b->pIndex;.    p
cb00: 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  Tab->pIndex = pI
cb10: 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ndex;.  }else{. 
cb20: 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72     Index *pOther
cb30: 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
cb40: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68  .    while( pOth
cb50: 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74  er->pNext && pOt
cb60: 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72  her->pNext->onEr
cb70: 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
cb80: 29 7b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 20  ){.      pOther 
cb90: 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
cba0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
cbb0: 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65  x->pNext = pOthe
cbc0: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 70 4f  r->pNext;.    pO
cbd0: 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49  ther->pNext = pI
cbe0: 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ndex;.  }..  /* 
cbf0: 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  If the db->init.
cc00: 62 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61  busy is 1 it mea
cc10: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
cc20: 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68  g the SQL off th
cc30: 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d  e.  ** "sqlite_m
cc40: 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20  aster" table on 
cc50: 74 68 65 20 64 69 73 6b 2e 20 20 53 6f 20 64 6f  the disk.  So do
cc60: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
cc70: 65 20 64 69 73 6b 0a 20 20 2a 2a 20 61 67 61 69  e disk.  ** agai
cc80: 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20  n.  Extract the 
cc90: 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 66 72 6f  table number fro
cca0: 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e  m the db->init.n
ccb0: 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 0a 20 20  ewTnum field..  
ccc0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
ccd0: 74 2e 62 75 73 79 20 26 26 20 70 54 61 62 6c 65  t.busy && pTable
cce0: 21 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 64 65  !=0 ){.    pInde
ccf0: 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  x->tnum = db->in
cd00: 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a  it.newTnum;.  }.
cd10: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d  .  /* If the db-
cd20: 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20  >init.busy is 0 
cd30: 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65 20  then create the 
cd40: 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20  index on disk.  
cd50: 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76  This.  ** involv
cd60: 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 69  es writing the i
cd70: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61  ndex into the ma
cd80: 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66  ster table and f
cd90: 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20  illing in the.  
cda0: 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74 68  ** index with th
cdb0: 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e current table 
cdc0: 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20  contents..  **. 
cdd0: 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69 74   ** The db->init
cde0: 2e 62 75 73 79 20 69 73 20 30 20 77 68 65 6e 20  .busy is 0 when 
cdf0: 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20 65  the user first e
ce00: 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20 49  nters a CREATE I
ce10: 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61  NDEX .  ** comma
ce20: 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75  nd.  db->init.bu
ce30: 73 79 20 69 73 20 31 20 77 68 65 6e 20 61 20 64  sy is 1 when a d
ce40: 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65  atabase is opene
ce50: 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41  d and .  ** CREA
ce60: 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
ce70: 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f 75 74  nts are read out
ce80: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 74   of the master t
ce90: 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74  able.  In.  ** t
cea0: 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20 74  he latter case t
ceb0: 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  he index already
cec0: 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c   exists on disk,
ced0: 20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20 20   which is why.  
cee0: 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74  ** we don't want
cef0: 20 74 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e   to recreate it.
cf00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54  .  **.  ** If pT
cf10: 61 62 6c 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  able==0 it means
cf20: 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67   this index is g
cf30: 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72  enerated as a pr
cf40: 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f  imary key.  ** o
cf50: 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
cf60: 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20  int of a CREATE 
cf70: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
cf80: 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c    Since the tabl
cf90: 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20  e.  ** has just 
cfa0: 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74  been created, it
cfb0: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
cfc0: 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  a and the index 
cfd0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
cfe0: 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20   ** step can be 
cff0: 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
d000: 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69  else if( db->ini
d010: 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20  t.busy==0 ){.   
d020: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65   int n;.    Vdbe
d030: 20 2a 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c   *v;.    int lbl
d040: 31 2c 20 6c 62 6c 32 3b 0a 20 20 20 20 69 6e 74  1, lbl2;.    int
d050: 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   i;.    int addr
d060: 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  ;..    v = sqlit
d070: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
d080: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
d090: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
d0a0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
d0b0: 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20  ( pTable!=0 ){. 
d0c0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
d0d0: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
d0e0: 70 50 61 72 73 65 2c 20 30 2c 20 69 73 54 65 6d  pParse, 0, isTem
d0f0: 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
d100: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
d110: 28 76 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20  (v, isTemp);.   
d120: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
d130: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
d140: 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20  wRecno, 0, 0);. 
d150: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
d160: 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  3(v, OP_String, 
d170: 30 2c 20 30 2c 20 22 69 6e 64 65 78 22 2c 20 50  0, 0, "index", P
d180: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  3_STATIC);.    s
d190: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
d1a0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
d1b0: 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
d1c0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
d1d0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74  VdbeOp3(v, OP_St
d1e0: 72 69 6e 67 2c 20 30 2c 20 30 2c 20 70 54 61 62  ring, 0, 0, pTab
d1f0: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
d200: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
d210: 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65  v, OP_CreateInde
d220: 78 2c 20 30 2c 20 69 73 54 65 6d 70 2c 28 63 68  x, 0, isTemp,(ch
d230: 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 74 6e 75  ar*)&pIndex->tnu
d240: 6d 2c 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20  m,P3_POINTER);. 
d250: 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
d260: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 54 61  = 0;.    if( pTa
d270: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ble ){.      sql
d280: 69 74 65 33 56 64 62 65 43 6f 64 65 28 76 2c 0a  ite3VdbeCode(v,.
d290: 20 20 20 20 20 20 20 20 20 20 4f 50 5f 44 75 70            OP_Dup
d2a0: 2c 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20  ,       0,      
d2b0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 4f 50 5f  0,.          OP_
d2c0: 49 6e 74 65 67 65 72 2c 20 20 20 69 73 54 65 6d  Integer,   isTem
d2d0: 70 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  p, 0,.          
d2e0: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
d2f0: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30        0,.      0
d300: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64  );.    }.    add
d310: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
d320: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
d330: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  g, 0, 0);.    if
d340: 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e 64  ( pStart && pEnd
d350: 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 41 64   ){.      n = Ad
d360: 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64  dr(pEnd->z) - Ad
d370: 64 72 28 70 53 74 61 72 74 2d 3e 7a 29 20 2b 20  dr(pStart->z) + 
d380: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
d390: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
d3a0: 61 64 64 72 2c 20 70 53 74 61 72 74 2d 3e 7a 2c  addr, pStart->z,
d3b0: 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   n);.    }.    s
d3c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d3d0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
d3e0: 2c 20 35 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 5, 0);.    sql
d3f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d400: 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30   OP_PutIntKey, 0
d410: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54  , 0);.    if( pT
d420: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71  able ){.      sq
d430: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d440: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54  , OP_Integer, pT
d450: 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20  ab->iDb, 0);.   
d460: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
d470: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  3(v, OP_OpenRead
d480: 2c 20 32 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  , 2, pTab->tnum,
d490: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
d4a0: 3b 0a 20 20 20 20 20 20 6c 62 6c 32 20 3d 20 73  ;.      lbl2 = s
d4b0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
d4c0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
d4d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d4e0: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 32 2c 20  , OP_Rewind, 2, 
d4f0: 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 6c 62 6c  lbl2);.      lbl
d500: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
d510: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63 6e 6f  ddOp(v, OP_Recno
d520: 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  , 2, 0);.      f
d530: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78  or(i=0; i<pIndex
d540: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
d550: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
d560: 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  l = pIndex->aiCo
d570: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20  lumn[i];.       
d580: 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79   if( pTab->iPKey
d590: 3d 3d 69 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ==iCol ){.      
d5a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d5b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
d5c0: 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  i, 0);.        }
d5d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d5e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d5f0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 32  (v, OP_Column, 2
d600: 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , iCol);.       
d610: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
d620: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d630: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 49 64 78 4b  p(v, OP_MakeIdxK
d640: 65 79 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ey, pIndex->nCol
d650: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  umn, 0);.      i
d660: 66 28 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d  f( db->file_form
d670: 61 74 3e 3d 34 20 29 20 73 71 6c 69 74 65 33 41  at>=4 ) sqlite3A
d680: 64 64 49 64 78 4b 65 79 54 79 70 65 28 76 2c 20  ddIdxKeyType(v, 
d690: 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 73  pIndex);.      s
d6a0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
d6b0: 20 4f 50 5f 49 64 78 50 75 74 2c 20 31 2c 20 70   OP_IdxPut, 1, p
d6c0: 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
d6d0: 4f 45 5f 4e 6f 6e 65 2c 0a 20 20 20 20 20 20 20  OE_None,.       
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
d6f0: 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20  indexed columns 
d700: 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c  are not unique",
d710: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
d720: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d730: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  dOp(v, OP_Next, 
d740: 32 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20  2, lbl1);.      
d750: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
d760: 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 32 29  veLabel(v, lbl2)
d770: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d780: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
d790: 6c 6f 73 65 2c 20 32 2c 20 30 29 3b 0a 20 20 20  lose, 2, 0);.   
d7a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d7b0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
d7c0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 0);.    }.  
d7d0: 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20    if( pTable!=0 
d7e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  ){.      if( !is
d7f0: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
d800: 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
d810: 6b 69 65 28 64 62 2c 20 76 29 3b 0a 20 20 20 20  kie(db, v);.    
d820: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
d830: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d840: 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20  _Close, 0, 0);. 
d850: 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 57       sqlite3EndW
d860: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
d870: 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  arse);.    }.  }
d880: 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20  ..  /* Clean up 
d890: 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a  before exiting *
d8a0: 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  /.exit_create_in
d8b0: 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 49 64  dex:.  sqlite3Id
d8c0: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
d8d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  );.  sqlite3SrcL
d8e0: 69 73 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65  istDelete(pTable
d8f0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
d900: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
d910: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
d920: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f  routine will dro
d930: 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61  p an existing na
d940: 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73  med index.  This
d950: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c   routine.** impl
d960: 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20  ements the DROP 
d970: 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e  INDEX statement.
d980: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d990: 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20  DropIndex(Parse 
d9a0: 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
d9b0: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65   *pName){.  Inde
d9c0: 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62  x *pIndex;.  Vdb
d9d0: 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a  e *v;.  sqlite *
d9e0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
d9f0: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
da00: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  nErr || sqlite_m
da10: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
da20: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
da30: 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
da40: 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  );.  pIndex = sq
da50: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
da60: 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  b, pName->a[0].z
da70: 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
da80: 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
da90: 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b  if( pIndex==0 ){
daa0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
dab0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
dac0: 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22   such index: %S"
dad0: 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , pName, 0);.   
dae0: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
daf0: 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
db00: 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
db10: 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
db20: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
db30: 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61  , "index associa
db40: 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20  ted with UNIQUE 
db50: 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d  ".      "or PRIM
db60: 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
db70: 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f  nt cannot be dro
db80: 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67  pped", 0);.    g
db90: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
dba0: 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dex;.  }.  if( p
dbb0: 49 6e 64 65 78 2d 3e 69 44 62 3e 31 20 29 7b 0a  Index->iDb>1 ){.
dbc0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
dbd0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
dbe0: 6e 6f 74 20 61 6c 74 65 72 20 73 63 68 65 6d 61  not alter schema
dbf0: 20 6f 66 20 61 74 74 61 63 68 65 64 20 22 0a 20   of attached ". 
dc00: 20 20 20 20 20 20 22 64 61 74 61 62 61 73 65 73        "databases
dc10: 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ", 0);.    goto 
dc20: 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
dc30: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
dc40: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
dc50: 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
dc60: 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45  nt code = SQLITE
dc70: 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _DROP_INDEX;.   
dc80: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
dc90: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20  Index->pTable;. 
dca0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
dcb0: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e  Db = db->aDb[pIn
dcc0: 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b  dex->iDb].zName;
dcd0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
dce0: 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
dcf0: 41 42 4c 45 28 70 49 6e 64 65 78 2d 3e 69 44 62  ABLE(pIndex->iDb
dd00: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
dd10: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
dd20: 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
dd30: 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
dd40: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
dd50: 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
dd60: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
dd70: 6e 64 65 78 2d 3e 69 44 62 20 29 20 63 6f 64 65  ndex->iDb ) code
dd80: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
dd90: 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
dda0: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
ddb0: 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
ddc0: 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
ddd0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
dde0: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
ddf0: 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
de00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
de10: 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
de20: 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
de30: 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66   the index and f
de40: 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
de50: 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71  able */.  v = sq
de60: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
de70: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
de80: 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
de90: 4f 70 4c 69 73 74 20 64 72 6f 70 49 6e 64 65 78  OpList dropIndex
dea0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f  [] = {.      { O
deb0: 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c  P_Rewind,     0,
dec0: 20 41 44 44 52 28 39 29 2c 20 30 7d 2c 20 0a 20   ADDR(9), 0}, . 
ded0: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
dee0: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
def0: 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20    0}, /* 1 */.  
df00: 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72      { OP_MemStor
df10: 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20  e,   1, 1,      
df20: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
df30: 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30  MemLoad,    1, 0
df40: 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33  ,       0}, /* 3
df50: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43   */.      { OP_C
df60: 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c  olumn,     0, 1,
df70: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
df80: 20 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20 20 20   { OP_Eq,       
df90: 20 20 30 2c 20 41 44 44 52 28 38 29 2c 20 30 7d    0, ADDR(8), 0}
dfa0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78  ,.      { OP_Nex
dfb0: 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52  t,       0, ADDR
dfc0: 28 33 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b  (3), 0},.      {
dfd0: 20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20   OP_Goto,       
dfe0: 30 2c 20 41 44 44 52 28 39 29 2c 20 30 7d 2c 0a  0, ADDR(9), 0},.
dff0: 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74        { OP_Delet
e000: 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  e,     0, 0,    
e010: 20 20 20 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20     0}, /* 8 */. 
e020: 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 62 61     };.    int ba
e030: 73 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  se;..    sqlite3
e040: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
e050: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ion(pParse, 0, p
e060: 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20  Index->iDb);.   
e070: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
e080: 65 72 54 61 62 6c 65 28 76 2c 20 70 49 6e 64 65  erTable(v, pInde
e090: 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 62 61 73  x->iDb);.    bas
e0a0: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  e = sqlite3VdbeA
e0b0: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
e0c0: 79 53 69 7a 65 28 64 72 6f 70 49 6e 64 65 78 29  ySize(dropIndex)
e0d0: 2c 20 64 72 6f 70 49 6e 64 65 78 29 3b 0a 20 20  , dropIndex);.  
e0e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
e0f0: 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31 2c  ngeP3(v, base+1,
e100: 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
e110: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64  0);.    if( pInd
e120: 65 78 2d 3e 69 44 62 3d 3d 30 20 29 7b 0a 20 20  ex->iDb==0 ){.  
e130: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
e140: 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a  eCookie(db, v);.
e150: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e160: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
e170: 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20  _Close, 0, 0);. 
e180: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e190: 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  dOp(v, OP_Destro
e1a0: 79 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  y, pIndex->tnum,
e1b0: 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20   pIndex->iDb);. 
e1c0: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 57 72 69     sqlite3EndWri
e1d0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
e1e0: 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  se);.  }..  /* D
e1f0: 65 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  elete the in-mem
e200: 6f 72 79 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ory description 
e210: 6f 66 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  of this index.. 
e220: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
e230: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
e240: 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41    sqlite3UnlinkA
e250: 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62  ndDeleteIndex(db
e260: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 64  , pIndex);.    d
e270: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
e280: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
e290: 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70  ;.  }..exit_drop
e2a0: 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65  _index:.  sqlite
e2b0: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
e2c0: 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
e2d0: 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65  Append a new ele
e2e0: 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65  ment to the give
e2f0: 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74  n IdList.  Creat
e300: 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69  e a new IdList i
e310: 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a  f.** need be..**
e320: 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74  .** A new IdList
e330: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
e340: 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
e350: 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69  ) fails..*/.IdLi
e360: 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
e370: 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a  tAppend(IdList *
e380: 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
e390: 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69  oken){.  if( pLi
e3a0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
e3b0: 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  st = sqliteMallo
e3c0: 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74  c( sizeof(IdList
e3d0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
e3e0: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
e3f0: 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
e400: 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  loc = 0;.  }.  i
e410: 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3e 3d 70  f( pList->nId>=p
e420: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  List->nAlloc ){.
e430: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
e440: 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 70  t_item *a;.    p
e450: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  List->nAlloc = p
e460: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b  List->nAlloc*2 +
e470: 20 35 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69   5;.    a = sqli
e480: 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d  teRealloc(pList-
e490: 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  >a, pList->nAllo
e4a0: 63 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  c*sizeof(pList->
e4b0: 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
e4c0: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   a==0 ){.      s
e4d0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
e4e0: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  te(pList);.     
e4f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
e500: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
e510: 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  a;.  }.  memset(
e520: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
e530: 3e 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >nId], 0, sizeof
e540: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
e550: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
e560: 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20      char **pz = 
e570: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
e580: 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >nId].zName;.   
e590: 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69   sqlite3SetNStri
e5a0: 6e 67 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a  ng(pz, pToken->z
e5b0: 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b  , pToken->n, 0);
e5c0: 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20  .    if( *pz==0 
e5d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e5e0: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  IdListDelete(pLi
e5f0: 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
e600: 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n 0;.    }else{.
e610: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
e620: 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d  uote(*pz);.    }
e630: 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e 49  .  }.  pList->nI
e640: 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  d++;.  return pL
e650: 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  ist;.}../*.** Ap
e660: 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65  pend a new table
e670: 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76   name to the giv
e680: 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65  en SrcList.  Cre
e690: 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73  ate a new SrcLis
e6a0: 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
e6b0: 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
e6c0: 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
e6d0: 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20  SrcList even if 
e6e0: 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a  pToken is NULL..
e6f0: 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c  **.** A new SrcL
e700: 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
e710: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c   or NULL if mall
e720: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a  oc() fails..**.*
e730: 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69  * If pDatabase i
e740: 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d  s not null, it m
e750: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61  eans that the ta
e760: 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f  ble has an optio
e770: 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  nal.** database 
e780: 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69  name prefix.  Li
e790: 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62  ke this:  "datab
e7a0: 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65  ase.table".  The
e7b0: 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f   pDatabase.** po
e7c0: 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c  ints to the tabl
e7d0: 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70  e name and the p
e7e0: 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  Table points to 
e7f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
e800: 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73  e..** The SrcLis
e810: 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c  t.a[].zName fiel
e820: 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  d is filled with
e830: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
e840: 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63  which might.** c
e850: 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20  ome from pTable 
e860: 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73  (if pDatabase is
e870: 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70   NULL) or from p
e880: 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53  Database.  .** S
e890: 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61  rcList.a[].zData
e8a0: 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77  base is filled w
e8b0: 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
e8c0: 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   name from pTabl
e8d0: 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55  e,.** or with NU
e8e0: 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73  LL if no databas
e8f0: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a  e is specified..
e900: 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
e910: 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69  ords, if call li
e920: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
e930: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
e940: 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c  cListAppend(A,B,
e950: 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42  0);.**.** Then B
e960: 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   is a table name
e970: 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
e980: 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63  e name is unspec
e990: 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65  ified.  If calle
e9a0: 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a  d.** like this:.
e9b0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
e9c0: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
e9d0: 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a  nd(A,B,C);.**.**
e9e0: 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74   Then C is the t
e9f0: 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20  able name and B 
ea00: 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
ea10: 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  name..*/.SrcList
ea20: 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
ea30: 41 70 70 65 6e 64 28 53 72 63 4c 69 73 74 20 2a  Append(SrcList *
ea40: 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
ea50: 61 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70 44 61  able, Token *pDa
ea60: 74 61 62 61 73 65 29 7b 0a 20 20 69 66 28 20 70  tabase){.  if( p
ea70: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
ea80: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  List = sqliteMal
ea90: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53 72 63 4c  loc( sizeof(SrcL
eaa0: 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
eab0: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
eac0: 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  n 0;.    pList->
ead0: 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a  nAlloc = 1;.  }.
eae0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 53 72    if( pList->nSr
eaf0: 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  c>=pList->nAlloc
eb00: 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
eb10: 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73 74  *pNew;.    pList
eb20: 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20  ->nAlloc *= 2;. 
eb30: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
eb40: 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a 20  Realloc(pList,. 
eb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
eb60: 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20 28  zeof(*pList) + (
eb70: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29  pList->nAlloc-1)
eb80: 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61  *sizeof(pList->a
eb90: 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
eba0: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
ebb0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
ebc0: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
ebd0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ebe0: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20    }.    pList = 
ebf0: 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  pNew;.  }.  mems
ec00: 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69  et(&pList->a[pLi
ec10: 73 74 2d 3e 6e 53 72 63 5d 2c 20 30 2c 20 73 69  st->nSrc], 0, si
ec20: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
ec30: 29 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62  ));.  if( pDatab
ec40: 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65  ase && pDatabase
ec50: 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  ->z==0 ){.    pD
ec60: 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
ec70: 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
ec80: 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a 20 20   && pTable ){.  
ec90: 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d    Token *pTemp =
eca0: 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20   pDatabase;.    
ecb0: 70 44 61 74 61 62 61 73 65 20 3d 20 70 54 61 62  pDatabase = pTab
ecc0: 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d  le;.    pTable =
ecd0: 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 69 66   pTemp;.  }.  if
ece0: 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
ecf0: 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69  char **pz = &pLi
ed00: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
ed10: 63 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71  c].zName;.    sq
ed20: 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28  lite3SetNString(
ed30: 70 7a 2c 20 70 54 61 62 6c 65 2d 3e 7a 2c 20 70  pz, pTable->z, p
ed40: 54 61 62 6c 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20  Table->n, 0);.  
ed50: 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a    if( *pz==0 ){.
ed60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
ed70: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
ed80: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
ed90: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
eda0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
edb0: 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20  te(*pz);.    }. 
edc0: 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61   }.  if( pDataba
edd0: 73 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  se ){.    char *
ede0: 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  *pz = &pList->a[
edf0: 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a 44 61  pList->nSrc].zDa
ee00: 74 61 62 61 73 65 3b 0a 20 20 20 20 73 71 6c 69  tabase;.    sqli
ee10: 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a  te3SetNString(pz
ee20: 2c 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 2c 20  , pDatabase->z, 
ee30: 70 44 61 74 61 62 61 73 65 2d 3e 6e 2c 20 30 29  pDatabase->n, 0)
ee40: 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30  ;.    if( *pz==0
ee50: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ee60: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
ee70: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
ee80: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
ee90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
eea0: 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20  equote(*pz);.   
eeb0: 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e   }.  }.  pList->
eec0: 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 69  a[pList->nSrc].i
eed0: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70  Cursor = -1;.  p
eee0: 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20  List->nSrc++;.  
eef0: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
ef00: 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75  ./*.** Assign cu
ef10: 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61 62  rsors to all tab
ef20: 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74  les in a SrcList
ef30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
ef40: 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
ef50: 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  sors(Parse *pPar
ef60: 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  se, SrcList *pLi
ef70: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
ef80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
ef90: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
efa0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
efb0: 5d 2e 69 43 75 72 73 6f 72 3c 30 20 29 7b 0a 20  ].iCursor<0 ){. 
efc0: 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d       pList->a[i]
efd0: 2e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  .iCursor = pPars
efe0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d  e->nTab++;.    }
eff0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
f000: 64 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68  d an alias to th
f010: 65 20 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65  e last identifie
f020: 72 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69  r on the given i
f030: 64 65 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a  dentifier list..
f040: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
f050: 72 63 4c 69 73 74 41 64 64 41 6c 69 61 73 28 53  rcListAddAlias(S
f060: 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  rcList *pList, T
f070: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
f080: 20 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c   if( pList && pL
f090: 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20  ist->nSrc>0 ){. 
f0a0: 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74     int i = pList
f0b0: 2d 3e 6e 53 72 63 20 2d 20 31 3b 0a 20 20 20 20  ->nSrc - 1;.    
f0c0: 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e  sqlite3SetNStrin
f0d0: 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  g(&pList->a[i].z
f0e0: 41 6c 69 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a  Alias, pToken->z
f0f0: 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b  , pToken->n, 0);
f100: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
f110: 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ote(pList->a[i].
f120: 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a  zAlias);.  }.}..
f130: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
f140: 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  IdList..*/.void 
f150: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
f160: 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  ete(IdList *pLis
f170: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
f180: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
f190: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
f1a0: 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
f1b0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ++){.    sqliteF
f1c0: 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
f1d0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zName);.  }.  sq
f1e0: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
f1f0: 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  a);.  sqliteFree
f200: 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pList);.}../*.*
f210: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
f220: 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74  ex in pList of t
f230: 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61  he identifier na
f240: 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e  med zId.  Return
f250: 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f   -1.** if not fo
f260: 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
f270: 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49  te3IdListIndex(I
f280: 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f  dList *pList, co
f290: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
f2a0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
f2b0: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
f2c0: 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30  rn -1;.  for(i=0
f2d0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
f2e0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
f2f0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
f300: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
f310: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
f320: 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
f330: 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
f340: 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
f350: 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69   SrcList includi
f360: 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74  ng all its subst
f370: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64  ructure..*/.void
f380: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
f390: 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20 2a 70  elete(SrcList *p
f3a0: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
f3b0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
f3c0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
f3d0: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  =0; i<pList->nSr
f3e0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  c; i++){.    sql
f3f0: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
f400: 5b 69 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [i].zDatabase);.
f410: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
f420: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
f430: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
f440: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  e(pList->a[i].zA
f450: 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lias);.    if( p
f460: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20  List->a[i].pTab 
f470: 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  && pList->a[i].p
f480: 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74  Tab->isTransient
f490: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f4a0: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  3DeleteTable(0, 
f4b0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  pList->a[i].pTab
f4c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
f4d0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
f4e0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  (pList->a[i].pSe
f4f0: 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  lect);.    sqlit
f500: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 4c 69  e3ExprDelete(pLi
f510: 73 74 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20  st->a[i].pOn);. 
f520: 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
f530: 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b  Delete(pList->a[
f540: 69 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a  i].pUsing);.  }.
f550: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
f560: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  st);.}../*.** Be
f570: 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  gin a transactio
f580: 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
f590: 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  3BeginTransactio
f5a0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
f5b0: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20   int onError){. 
f5c0: 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20   sqlite *db;..  
f5d0: 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
f5e0: 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
f5f0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
f600: 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
f610: 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
f620: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f  >nErr || sqlite_
f630: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
f640: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71  return;.  if( sq
f650: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
f660: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
f670: 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49  ANSACTION, "BEGI
f680: 4e 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75  N", 0, 0) ) retu
f690: 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c  rn;.  if( db->fl
f6a0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
f6b0: 72 61 6e 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  rans ){.    sqli
f6c0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
f6d0: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 73 74 61 72  se, "cannot star
f6e0: 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
f6f0: 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
f700: 74 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74 75  tion");.    retu
f710: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
f720: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
f730: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
f740: 30 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73  0);.  if( !pPars
f750: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
f760: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
f770: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20  QLITE_InTrans;. 
f780: 20 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d     db->onError =
f790: 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 7d 0a   onError;.  }.}.
f7a0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20  ./*.** Commit a 
f7b0: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
f7c0: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
f7d0: 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  tTransaction(Par
f7e0: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
f7f0: 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69 66  qlite *db;..  if
f800: 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
f810: 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
f820: 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  0 || db->aDb[0].
f830: 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBt==0 ) return;
f840: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
f850: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
f860: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
f870: 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
f880: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
f890: 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
f8a0: 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54  SACTION, "COMMIT
f8b0: 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  ", 0, 0) ) retur
f8c0: 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  n;.  if( (db->fl
f8d0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
f8e0: 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  rans)==0 ){.    
f8f0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f900: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
f910: 63 6f 6d 6d 69 74 20 2d 20 6e 6f 20 74 72 61 6e  commit - no tran
f920: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
f930: 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  e");.    return;
f940: 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 72  .  }.  if( !pPar
f950: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
f960: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
f970: 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b  ~SQLITE_InTrans;
f980: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e  .  }.  sqlite3En
f990: 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
f9a0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21  pParse);.  if( !
f9b0: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
f9c0: 29 7b 0a 20 20 20 20 64 62 2d 3e 6f 6e 45 72 72  ){.    db->onErr
f9d0: 6f 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b  or = OE_Default;
f9e0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  .  }.}../*.** Ro
f9f0: 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
fa00: 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
fa10: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e  ite3RollbackTran
fa20: 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
fa30: 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
fa40: 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
fa50: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
fa60: 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
fa70: 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  >db)==0 || db->a
fa80: 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
fa90: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
faa0: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
fab0: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
fac0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
fad0: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
fae0: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
faf0: 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
fb00: 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29  ROLLBACK", 0, 0)
fb10: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
fb20: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
fb30: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30  LITE_InTrans)==0
fb40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
fb50: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
fb60: 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b  "cannot rollback
fb70: 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f   - no transactio
fb80: 6e 20 69 73 20 61 63 74 69 76 65 22 29 3b 0a 20  n is active");. 
fb90: 20 20 20 72 65 74 75 72 6e 3b 20 0a 20 20 7d 0a     return; .  }.
fba0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
fbb0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
fbc0: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
fbd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
fbe0: 20 4f 50 5f 52 6f 6c 6c 62 61 63 6b 2c 20 30 2c   OP_Rollback, 0,
fbf0: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21   0);.  }.  if( !
fc00: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
fc10: 29 7b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  ){.    db->flags
fc20: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72   &= ~SQLITE_InTr
fc30: 61 6e 73 3b 0a 20 20 20 20 64 62 2d 3e 6f 6e 45  ans;.    db->onE
fc40: 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c  rror = OE_Defaul
fc50: 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t;.  }.}../*.** 
fc60: 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
fc70: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72  de that will ver
fc80: 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63  ify the schema c
fc90: 6f 6f 6b 69 65 20 66 6f 72 20 61 6c 6c 0a 2a 2a  ookie for all.**
fca0: 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
fcb0: 66 69 6c 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  files..*/.void s
fcc0: 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
fcd0: 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50  Schema(Parse *pP
fce0: 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
fcf0: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
fd00: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
fd10: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
fd20: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
fd30: 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
fd40: 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
fd50: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
fd60: 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20  aDb[iDb].pBt!=0 
fd70: 29 3b 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20  );.  if( iDb!=1 
fd80: 26 26 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  && !DbHasPropert
fd90: 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 43 6f  y(db, iDb, DB_Co
fda0: 6f 6b 69 65 29 20 29 7b 0a 20 20 20 20 73 71 6c  okie) ){.    sql
fdb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
fdc0: 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65   OP_VerifyCookie
fdd0: 2c 20 69 44 62 2c 20 64 62 2d 3e 61 44 62 5b 69  , iDb, db->aDb[i
fde0: 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  Db].schema_cooki
fdf0: 65 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f  e);.    DbSetPro
fe00: 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20 44  perty(db, iDb, D
fe10: 42 5f 43 6f 6f 6b 69 65 29 3b 0a 20 20 7d 0a 7d  B_Cookie);.  }.}
fe20: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
fe30: 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
fe40: 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69  prepares for doi
fe50: 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  ng an operation 
fe60: 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68  that.** might ch
fe70: 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73  ange the databas
fe80: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
fe90: 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e  utine starts a n
fea0: 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ew transaction i
feb0: 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72  f we are not alr
fec0: 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61  eady within.** a
fed0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
fee0: 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
fef0: 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
ff00: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68  ction, then a ch
ff10: 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73  eckpoint.** is s
ff20: 65 74 20 69 66 20 74 68 65 20 73 65 74 43 68 65  et if the setChe
ff30: 63 6b 70 6f 69 6e 74 20 70 61 72 61 6d 65 74 65  ckpoint paramete
ff40: 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68  r is true.  A ch
ff50: 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a  eckpoint should.
ff60: 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70  ** be set for op
ff70: 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69  erations that mi
ff80: 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f  ght fail (due to
ff90: 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70   a constraint) p
ffa0: 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61  art of.** the wa
ffb0: 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68  y through and wh
ffc0: 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  ich will need to
ffd0: 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65   undo some write
ffe0: 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  s without having
fff0: 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20   to.** rollback 
10000 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61  the whole transa
10010 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72  ction.  For oper
10020 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c  ations where all
10030 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
10040 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62  can be checked b
10050 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
10060 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  s are made to th
10070 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69  e database, it i
10080 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73  s never.** neces
10090 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77  sary to undo a w
100a0 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65  rite and the che
100b0 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e  ckpoint should n
100c0 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  ot be set..**.**
100d0 20 4f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 69   Only database i
100e0 44 62 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20  Db and the temp 
100f0 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 64  database are mad
10100 65 20 77 72 69 74 61 62 6c 65 20 62 79 20 74 68  e writable by th
10110 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69  is call..** If i
10120 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  Db==0, then the 
10130 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70 20 64 61  main and temp da
10140 74 61 62 61 73 65 73 20 61 72 65 20 6d 61 64 65  tabases are made
10150 20 77 72 69 74 61 62 6c 65 2e 20 20 20 49 66 0a   writable.   If.
10160 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e 20 6f  ** iDb==1 then o
10170 6e 6c 79 20 74 68 65 20 74 65 6d 70 20 64 61 74  nly the temp dat
10180 61 62 61 73 65 20 69 73 20 6d 61 64 65 20 77 72  abase is made wr
10190 69 74 61 62 6c 65 2e 20 20 49 66 20 69 44 62 3e  itable.  If iDb>
101a0 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73 70  1 then the.** sp
101b0 65 63 69 66 69 65 64 20 61 75 78 69 6c 69 61 72  ecified auxiliar
101c0 79 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  y database and t
101d0 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
101e0 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62   are made writab
101f0 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
10200 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
10210 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  ration(Parse *pP
10220 61 72 73 65 2c 20 69 6e 74 20 73 65 74 43 68 65  arse, int setChe
10230 63 6b 70 6f 69 6e 74 2c 20 69 6e 74 20 69 44 62  ckpoint, int iDb
10240 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
10250 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
10260 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 44  rse->db;.  if( D
10270 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
10280 20 69 44 62 2c 20 44 42 5f 4c 6f 63 6b 65 64 29   iDb, DB_Locked)
10290 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 20 3d   ) return;.  v =
102a0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
102b0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
102c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
102d0 69 66 28 20 21 64 62 2d 3e 61 44 62 5b 69 44 62  if( !db->aDb[iDb
102e0 5d 2e 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20  ].inTrans ){.   
102f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10300 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74  p(v, OP_Transact
10310 69 6f 6e 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20  ion, iDb, 0);.  
10320 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28    DbSetProperty(
10330 64 62 2c 20 69 44 62 2c 20 44 42 5f 4c 6f 63 6b  db, iDb, DB_Lock
10340 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ed);.    sqlite3
10350 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
10360 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
10370 20 20 20 69 66 28 20 69 44 62 21 3d 31 20 29 7b     if( iDb!=1 ){
10380 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
10390 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
103a0 6e 28 70 50 61 72 73 65 2c 20 73 65 74 43 68 65  n(pParse, setChe
103b0 63 6b 70 6f 69 6e 74 2c 20 31 29 3b 0a 20 20 20  ckpoint, 1);.   
103c0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73   }.  }else if( s
103d0 65 74 43 68 65 63 6b 70 6f 69 6e 74 20 29 7b 0a  etCheckpoint ){.
103e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
103f0 64 64 4f 70 28 76 2c 20 4f 50 5f 43 68 65 63 6b  ddOp(v, OP_Check
10400 70 6f 69 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a  point, iDb, 0);.
10410 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74      DbSetPropert
10420 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 4c 6f  y(db, iDb, DB_Lo
10430 63 6b 65 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  cked);.  }.}../*
10440 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
10450 65 20 74 68 61 74 20 63 6f 6e 63 6c 75 64 65 73  e that concludes
10460 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68   an operation th
10470 61 74 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e  at may have chan
10480 67 65 64 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ged.** the datab
10490 61 73 65 2e 20 20 49 66 20 61 20 73 74 61 74 65  ase.  If a state
104a0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
104b0 20 77 61 73 20 73 74 61 72 74 65 64 2c 20 74 68   was started, th
104c0 65 6e 20 65 6d 69 74 0a 2a 2a 20 61 6e 20 4f 50  en emit.** an OP
104d0 5f 43 6f 6d 6d 69 74 20 74 68 61 74 20 77 69 6c  _Commit that wil
104e0 6c 20 63 61 75 73 65 20 74 68 65 20 63 68 61 6e  l cause the chan
104f0 67 65 73 20 74 6f 20 62 65 20 63 6f 6d 6d 69 74  ges to be commit
10500 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ted to disk..**.
10510 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 63 68 65  ** Note that che
10520 63 6b 70 6f 69 6e 74 73 20 61 72 65 20 61 75 74  ckpoints are aut
10530 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6d 6d 69  omatically commi
10540 74 74 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  tted at the end 
10550 6f 66 0a 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e  of.** a statemen
10560 74 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  t.  Note also th
10570 61 74 20 74 68 65 72 65 20 63 61 6e 20 62 65 20  at there can be 
10580 6d 75 6c 74 69 70 6c 65 20 63 61 6c 6c 73 20 74  multiple calls t
10590 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 42 65 67  o .** sqlite3Beg
105a0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
105b0 28 29 20 62 75 74 20 74 68 65 72 65 20 73 68 6f  () but there sho
105c0 75 6c 64 20 6f 6e 6c 79 20 62 65 20 61 20 73 69  uld only be a si
105d0 6e 67 6c 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  ngle.** call to 
105e0 73 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f  sqlite3EndWriteO
105f0 70 65 72 61 74 69 6f 6e 28 29 20 61 74 20 74 68  peration() at th
10600 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
10610 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  the statement..*
10620 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e  /.void sqlite3En
10630 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
10640 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
10650 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
10660 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
10670 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72  ->db;.  if( pPar
10680 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 20  se->trigStack ) 
10690 72 65 74 75 72 6e 3b 20 2f 2a 20 69 66 20 74 68  return; /* if th
106a0 69 73 20 69 73 20 69 6e 20 61 20 74 72 69 67 67  is is in a trigg
106b0 65 72 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  er */.  v = sqli
106c0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
106d0 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
106e0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 64   return;.  if( d
106f0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
10700 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20  E_InTrans ){.   
10710 20 2f 2a 20 41 20 42 45 47 49 4e 20 68 61 73 20   /* A BEGIN has 
10720 65 78 65 63 75 74 65 64 2e 20 20 44 6f 20 6e 6f  executed.  Do no
10730 74 20 63 6f 6d 6d 69 74 20 75 6e 74 69 6c 20 77  t commit until w
10740 65 20 73 65 65 20 61 6e 20 65 78 70 6c 69 63 69  e see an explici
10750 74 0a 20 20 20 20 2a 2a 20 43 4f 4d 4d 49 54 20  t.    ** COMMIT 
10760 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20  statement. */.  
10770 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
10780 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10790 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b  P_Commit, 0, 0);
107a0 0a 20 20 7d 0a 7d 0a 0a 0a 0a                    .  }.}....