/ Hex Artifact Content
Login

Artifact f25e4ac9f102efd70188bc09a459c2b461fe2135:


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 38 32 20 32 30 30 34 2f 30 35 2f 31 32 20 31  182 2004/05/12 1
0300: 31 3a 32 34 3a 30 33 20 64 61 6e 69 65 6c 6b 31  1:24:03 danielk1
0310: 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e  977 Exp $.*/.#in
0320: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74  clude "sqliteInt
0330: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74  .h".#include <ct
0340: 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68  ype.h>../*.** Th
0350: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
0360: 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20  lled when a new 
0370: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73  SQL statement is
0380: 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a   beginning to.**
0390: 20 62 65 20 70 61 72 73 65 64 2e 20 20 43 68 65   be parsed.  Che
03a0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
03b0: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20   schema for the 
03c0: 64 61 74 61 62 61 73 65 20 6e 65 65 64 73 0a 2a  database needs.*
03d0: 2a 20 74 6f 20 62 65 20 72 65 61 64 20 66 72 6f  * to be read fro
03e0: 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  m the SQLITE_MAS
03f0: 54 45 52 20 61 6e 64 20 53 51 4c 49 54 45 5f 54  TER and SQLITE_T
0400: 45 4d 50 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  EMP_MASTER table
0410: 73 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73  s..** If it does
0420: 2c 20 74 68 65 6e 20 72 65 61 64 20 69 74 2e 0a  , then read it..
0430: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
0440: 65 67 69 6e 50 61 72 73 65 28 50 61 72 73 65 20  eginParse(Parse 
0450: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 78 70  *pParse, int exp
0460: 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 73 71 6c  lainFlag){.  sql
0470: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
0480: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
0490: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
04a0: 20 3d 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a   = explainFlag;.
04b0: 20 20 69 66 28 28 64 62 2d 3e 66 6c 61 67 73 20    if((db->flags 
04c0: 26 20 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c  & SQLITE_Initial
04d0: 69 7a 65 64 29 3d 3d 30 20 26 26 20 64 62 2d 3e  ized)==0 && db->
04e0: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
04f0: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
0500: 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26 70 50  ite3Init(db, &pP
0510: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  arse->zErrMsg);.
0520: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
0530: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
0540: 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a  Parse->rc = rc;.
0550: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
0560: 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rr++;.    }.  }.
0570: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
0580: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
0590: 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
05a0: 64 62 2c 20 69 2c 20 44 42 5f 4c 6f 63 6b 65 64  db, i, DB_Locked
05b0: 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  );.    if( !db->
05c0: 61 44 62 5b 69 5d 2e 69 6e 54 72 61 6e 73 20 29  aDb[i].inTrans )
05d0: 7b 0a 20 20 20 20 20 20 44 62 43 6c 65 61 72 50  {.      DbClearP
05e0: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44  roperty(db, i, D
05f0: 42 5f 43 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 7d  B_Cookie);.    }
0600: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
0610: 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Var = 0;.}../*.*
0620: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
0630: 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61  s called after a
0640: 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61 74   single SQL stat
0650: 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a  ement has been.*
0660: 2a 20 70 61 72 73 65 64 20 61 6e 64 20 77 65 20  * parsed and we 
0670: 77 61 6e 74 20 74 6f 20 65 78 65 63 75 74 65 20  want to execute 
0680: 74 68 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f  the VDBE code to
0690: 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 74   implement .** t
06a0: 68 61 74 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  hat statement.  
06b0: 50 72 69 6f 72 20 61 63 74 69 6f 6e 20 72 6f 75  Prior action rou
06c0: 74 69 6e 65 73 20 73 68 6f 75 6c 64 20 68 61 76  tines should hav
06d0: 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 63 6f 6e  e already.** con
06e0: 73 74 72 75 63 74 65 64 20 56 44 42 45 20 63 6f  structed VDBE co
06f0: 64 65 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  de to do the wor
0700: 6b 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61  k of the SQL sta
0710: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20  tement..** This 
0720: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61 73  routine just has
0730: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
0740: 56 44 42 45 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  VDBE code..**.**
0750: 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61 6e   Note that if an
0760: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
0770: 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68 65   it might be the
0780: 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f   case that.** no
0790: 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20 67   VDBE code was g
07a0: 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  enerated..*/.voi
07b0: 64 20 73 71 6c 69 74 65 33 45 78 65 63 28 50 61  d sqlite3Exec(Pa
07c0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
07d0: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
07e0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
07f0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
0800: 62 65 3b 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20  be;..  if( v==0 
0810: 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47  && (v = sqlite3G
0820: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21  etVdbe(pParse))!
0830: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
0840: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
0850: 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20  _Halt, 0, 0);.  
0860: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  }.  if( sqlite3_
0870: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
0880: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 76 20  return;.  if( v 
0890: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
08a0: 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a  =0 ){.    FILE *
08b0: 74 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61  trace = (db->fla
08c0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
08d0: 54 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f  Trace)!=0 ? stdo
08e0: 75 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69  ut : 0;.    sqli
08f0: 74 65 33 56 64 62 65 54 72 61 63 65 28 76 2c 20  te3VdbeTrace(v, 
0900: 74 72 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69  trace);.    sqli
0910: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
0920: 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  (v, pParse->nVar
0930: 2c 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  , pParse->explai
0940: 6e 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  n);.    pParse->
0950: 72 63 20 3d 20 70 50 61 72 73 65 2d 3e 6e 45 72  rc = pParse->nEr
0960: 72 20 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  r ? SQLITE_ERROR
0970: 20 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   : SQLITE_DONE;.
0980: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e      pParse->colN
0990: 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d  amesSet = 0;.  }
09a0: 65 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d  else if( pParse-
09b0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
09c0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  {.    pParse->rc
09d0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
09e0: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
09f0: 54 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Tab = 0;.  pPars
0a00: 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70  e->nMem = 0;.  p
0a10: 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b  Parse->nSet = 0;
0a20: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20  .  pParse->nAgg 
0a30: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
0a40: 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Var = 0;.}../*.*
0a50: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
0a60: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
0a70: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
0a80: 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72  .** a particular
0a90: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
0aa0: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 0a 2a  given the name.*
0ab0: 2a 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20  * of that table 
0ac0: 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
0ad0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
0ae0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
0af0: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
0b00: 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
0b10: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
0b20: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
0b30: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
0b40: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
0b50: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
0b60: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
0b70: 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20   matching table 
0b80: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
0b90: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
0ba0: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
0bb0: 65 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  e names is done.
0bc0: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
0bd0: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
0be0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
0bf0: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
0c00: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
0c10: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
0c20: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
0c30: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
0c40: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
0c50: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
0c60: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
0c70: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e  (sqlite *db, con
0c80: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
0c90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
0ca0: 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20  abase){.  Table 
0cb0: 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  *p = 0;.  int i;
0cc0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
0cd0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
0ce0: 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f   int j = (i<2) ?
0cf0: 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53   i^1 : i;   /* S
0d00: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
0d10: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66  e MAIN */.    if
0d20: 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26  ( zDatabase!=0 &
0d30: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
0d40: 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e  (zDatabase, db->
0d50: 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20  aDb[j].zName) ) 
0d60: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20  continue;.    p 
0d70: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
0d80: 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62  d(&db->aDb[j].tb
0d90: 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74  lHash, zName, st
0da0: 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a  rlen(zName)+1);.
0db0: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
0dc0: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
0dd0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
0de0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
0df0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
0e00: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
0e10: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
0e20: 61 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ase table given 
0e30: 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74  the name.** of t
0e40: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f  hat table and (o
0e50: 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e  ptionally) the n
0e60: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
0e70: 61 73 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e  ase.** containin
0e80: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  g the table.  Re
0e90: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
0ea0: 20 66 6f 75 6e 64 2e 0a 2a 2a 20 41 6c 73 6f 20   found..** Also 
0eb0: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
0ec0: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
0ed0: 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
0ee0: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
0ef0: 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
0f00: 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33  tine and sqlite3
0f10: 46 69 6e 64 54 61 62 6c 65 28 29 0a 2a 2a 20 69  FindTable().** i
0f20: 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  s that this rout
0f30: 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72  ine leaves an er
0f40: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
0f50: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 0a 2a  Parse->zErrMsg.*
0f60: 2a 20 77 68 65 72 65 20 73 71 6c 69 74 65 33 46  * where sqlite3F
0f70: 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20  indTable() does 
0f80: 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  not..*/.Table *s
0f90: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
0fa0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
0fb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
0fc0: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
0fd0: 7a 44 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  zDbase){.  Table
0fe0: 20 2a 70 3b 0a 0a 20 20 70 20 3d 20 73 71 6c 69   *p;..  p = sqli
0ff0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61  te3FindTable(pPa
1000: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  rse->db, zName, 
1010: 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  zDbase);.  if( p
1020: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  ==0 ){.    if( z
1030: 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73  Dbase ){.      s
1040: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1050: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
1060: 74 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20 7a  table: %s.%s", z
1070: 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  Dbase, zName);. 
1080: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
1090: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50  ite3FindTable(pP
10a0: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  arse->db, zName,
10b0: 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)!=0 ){.      
10c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
10d0: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 5c  pParse, "table \
10e0: 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 69 6e 20  "%s\" is not in 
10f0: 64 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22 22  database \"%s\""
1100: 2c 0a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  ,.         zName
1110: 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 20 20 7d  , zDbase);.    }
1120: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
1130: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1140: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  se, "no such tab
1150: 6c 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  le: %s", zName);
1160: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1170: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
1180: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
1190: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
11a0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a  hat describes .*
11b0: 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  * a particular i
11c0: 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e  ndex given the n
11d0: 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65  ame of that inde
11e0: 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d  x.** and the nam
11f0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1200: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
1210: 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65  the index..** Re
1220: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
1230: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
1240: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
1250: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
1260: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
1270: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64  the.** table and
1280: 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
1290: 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65 74  ing index is ret
12a0: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
12b0: 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c  king.** for dupl
12c0: 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65  icate index name
12d0: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
12e0: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
12f0: 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20  .** TEMP first, 
1300: 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20  then MAIN, then 
1310: 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61  any auxiliary da
1320: 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a  tabases added.**
1330: 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43   using the ATTAC
1340: 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e  H command..*/.In
1350: 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  dex *sqlite3Find
1360: 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62  Index(sqlite *db
1370: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
1380: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
1390: 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a  *zDb){.  Index *
13a0: 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  p = 0;.  int i;.
13b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
13c0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
13d0: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
13e0: 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61  i^1 : i;  /* Sea
13f0: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
1400: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  MAIN */.    if( 
1410: 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33 53 74  zDb && sqlite3St
1420: 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61  rICmp(zDb, db->a
1430: 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63  Db[j].zName) ) c
1440: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d  ontinue;.    p =
1450: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
1460: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 69 64 78  (&db->aDb[j].idx
1470: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  Hash, zName, str
1480: 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20  len(zName)+1);. 
1490: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
14a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
14b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
14c0: 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65  e the given inde
14d0: 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  x from the index
14e0: 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64   hash table, and
14f0: 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d   free.** its mem
1500: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a  ory structures..
1510: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  **.** The index 
1520: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
1530: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
1540: 68 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20  h tables but.** 
1550: 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b  it is not unlink
1560: 65 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c  ed from the Tabl
1570: 65 20 74 68 61 74 20 69 74 20 69 6e 64 65 78 65  e that it indexe
1580: 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20  s..** Unlinking 
1590: 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d  from the Table m
15a0: 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74  ust be done by t
15b0: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
15c0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
15d0: 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65  oid sqliteDelete
15e0: 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62  Index(sqlite *db
15f0: 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49  , Index *p){.  I
1600: 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 0a 20 20 61  ndex *pOld;..  a
1610: 73 73 65 72 74 28 20 64 62 21 3d 30 20 26 26 20  ssert( db!=0 && 
1620: 70 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20  p->zName!=0 );. 
1630: 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48   pOld = sqlite3H
1640: 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61  ashInsert(&db->a
1650: 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61  Db[p->iDb].idxHa
1660: 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  sh, p->zName,.  
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e 28 70          strlen(p
1690: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a  ->zName)+1, 0);.
16a0: 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 26 26    if( pOld!=0 &&
16b0: 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20   pOld!=p ){.    
16c0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
16d0: 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44  t(&db->aDb[p->iD
16e0: 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 4f 6c 64  b].idxHash, pOld
16f0: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
1710: 72 6c 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65  rlen(pOld->zName
1720: 29 2b 31 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d 0a  )+1, pOld);.  }.
1730: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
1740: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
1750: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
1760: 20 66 72 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c   from its table,
1770: 20 74 68 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20   then remove.** 
1780: 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  the index from t
1790: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
17a0: 62 6c 65 20 61 6e 64 20 66 72 65 65 20 69 74 73  ble and free its
17b0: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63   memory.** struc
17c0: 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tures..*/.void s
17d0: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
17e0: 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74  eleteIndex(sqlit
17f0: 65 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49  e *db, Index *pI
1800: 6e 64 65 78 29 7b 0a 20 20 69 66 28 20 70 49 6e  ndex){.  if( pIn
1810: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
1820: 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20  dex==pIndex ){. 
1830: 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c     pIndex->pTabl
1840: 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  e->pIndex = pInd
1850: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c  ex->pNext;.  }el
1860: 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  se{.    Index *p
1870: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 49 6e 64  ;.    for(p=pInd
1880: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
1890: 65 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65 78  ex; p && p->pNex
18a0: 74 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e  t!=pIndex; p=p->
18b0: 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 69 66 28  pNext){}.    if(
18c0: 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d   p && p->pNext==
18d0: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
18e0: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  p->pNext = pInde
18f0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  x->pNext;.    }.
1900: 20 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 6c 65    }.  sqliteDele
1910: 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  teIndex(db, pInd
1920: 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  ex);.}../*.** Er
1930: 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69  ase all schema i
1940: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
1950: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
1960: 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20  sh tables of.** 
1970: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1980: 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ion.  This routi
1990: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
19a0: 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a  reclaim memory.*
19b0: 2a 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f 6e  * before the con
19c0: 6e 65 63 74 69 6f 6e 20 63 6c 6f 73 65 73 2e 20  nection closes. 
19d0: 20 49 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c   It is also call
19e0: 65 64 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ed during a roll
19f0: 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65  back.** if there
1a00: 20 77 65 72 65 20 73 63 68 65 6d 61 20 63 68 61   were schema cha
1a10: 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65 20  nges during the 
1a20: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1a30: 2a 2a 20 49 66 20 69 44 62 3c 3d 30 20 74 68 65  ** If iDb<=0 the
1a40: 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65  n reset the inte
1a50: 72 6e 61 6c 20 73 63 68 65 6d 61 20 74 61 62 6c  rnal schema tabl
1a60: 65 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  es for all datab
1a70: 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20 49  ase.** files.  I
1a80: 66 20 69 44 62 3e 3d 32 20 74 68 65 6e 20 72 65  f iDb>=2 then re
1a90: 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  set the internal
1aa0: 20 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c 79   schema for only
1ab0: 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 66   the.** single f
1ac0: 69 6c 65 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a  ile indicated..*
1ad0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
1ae0: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
1af0: 61 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 69 6e  a(sqlite *db, in
1b00: 74 20 69 44 62 29 7b 0a 20 20 48 61 73 68 45 6c  t iDb){.  HashEl
1b10: 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73  em *pElem;.  Has
1b20: 68 20 74 65 6d 70 31 3b 0a 20 20 48 61 73 68 20  h temp1;.  Hash 
1b30: 74 65 6d 70 32 3b 0a 20 20 69 6e 74 20 69 2c 20  temp2;.  int i, 
1b40: 6a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44  j;..  assert( iD
1b50: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
1b60: 6e 44 62 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  nDb );.  db->fla
1b70: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
1b80: 69 74 69 61 6c 69 7a 65 64 3b 0a 20 20 66 6f 72  itialized;.  for
1b90: 28 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44  (i=iDb; i<db->nD
1ba0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20  b; i++){.    Db 
1bb0: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
1bc0: 69 5d 3b 0a 20 20 20 20 74 65 6d 70 31 20 3d 20  i];.    temp1 = 
1bd0: 70 44 62 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20  pDb->tblHash;.  
1be0: 20 20 74 65 6d 70 32 20 3d 20 70 44 62 2d 3e 74    temp2 = pDb->t
1bf0: 72 69 67 48 61 73 68 3b 0a 20 20 20 20 73 71 6c  rigHash;.    sql
1c00: 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 70 44  ite3HashInit(&pD
1c10: 62 2d 3e 74 72 69 67 48 61 73 68 2c 20 53 51 4c  b->trigHash, SQL
1c20: 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c  ITE_HASH_STRING,
1c30: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1c40: 48 61 73 68 43 6c 65 61 72 28 26 70 44 62 2d 3e  HashClear(&pDb->
1c50: 61 46 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69  aFKey);.    sqli
1c60: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 70 44  te3HashClear(&pD
1c70: 62 2d 3e 69 64 78 48 61 73 68 29 3b 0a 20 20 20  b->idxHash);.   
1c80: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
1c90: 65 48 61 73 68 46 69 72 73 74 28 26 74 65 6d 70  eHashFirst(&temp
1ca0: 32 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  2); pElem; pElem
1cb0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
1cc0: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 54  pElem)){.      T
1cd0: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
1ce0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
1cf0: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20  a(pElem);.      
1d00: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69  sqlite3DeleteTri
1d10: 67 67 65 72 28 70 54 72 69 67 67 65 72 29 3b 0a  gger(pTrigger);.
1d20: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1d30: 33 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70  3HashClear(&temp
1d40: 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48  2);.    sqlite3H
1d50: 61 73 68 49 6e 69 74 28 26 70 44 62 2d 3e 74 62  ashInit(&pDb->tb
1d60: 6c 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41  lHash, SQLITE_HA
1d70: 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20  SH_STRING, 0);. 
1d80: 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c     for(pElem=sql
1d90: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74 65  iteHashFirst(&te
1da0: 6d 70 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  mp1); pElem; pEl
1db0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
1dc0: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20  t(pElem)){.     
1dd0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
1de0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
1df0: 6c 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lem);.      sqli
1e00: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
1e10: 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  b, pTab);.    }.
1e20: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43      sqlite3HashC
1e30: 6c 65 61 72 28 26 74 65 6d 70 31 29 3b 0a 20 20  lear(&temp1);.  
1e40: 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74    DbClearPropert
1e50: 79 28 64 62 2c 20 69 2c 20 44 42 5f 53 63 68 65  y(db, i, DB_Sche
1e60: 6d 61 4c 6f 61 64 65 64 29 3b 0a 20 20 20 20 69  maLoaded);.    i
1e70: 66 28 20 69 44 62 3e 30 20 29 20 72 65 74 75 72  f( iDb>0 ) retur
1e80: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
1e90: 20 69 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d   iDb==0 );.  db-
1ea0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
1eb0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
1ec0: 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72  ..  /* If one or
1ed0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 61 75 78   more of the aux
1ee0: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
1ef0: 66 69 6c 65 73 20 68 61 73 20 62 65 65 6e 20 63  files has been c
1f00: 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e  losed,.  ** then
1f10: 20 72 65 6d 6f 76 65 20 74 68 65 6e 20 66 72 6f   remove then fro
1f20: 6d 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  m the auxiliary 
1f30: 64 61 74 61 62 61 73 65 20 6c 69 73 74 2e 20 20  database list.  
1f40: 57 65 20 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a  We take the.  **
1f50: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
1f60: 64 6f 20 74 68 69 73 20 68 65 72 65 20 73 69 6e  do this here sin
1f70: 63 65 20 77 65 20 68 61 76 65 20 6a 75 73 74 20  ce we have just 
1f80: 64 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20 74  deleted all of t
1f90: 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 68  he.  ** schema h
1fa0: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74  ash tables and t
1fb0: 68 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20  herefore do not 
1fc0: 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79  have to make any
1fd0: 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f   changes.  ** to
1fe0: 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 74 61   any of those ta
1ff0: 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  bles..  */.  for
2000: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
2010: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
2020: 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d  t Db *pDb = &db-
2030: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
2040: 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a   pDb->pBt==0 ){.
2050: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70        if( pDb->p
2060: 41 75 78 20 26 26 20 70 44 62 2d 3e 78 46 72 65  Aux && pDb->xFre
2070: 65 41 75 78 20 29 20 70 44 62 2d 3e 78 46 72 65  eAux ) pDb->xFre
2080: 65 41 75 78 28 70 44 62 2d 3e 70 41 75 78 29 3b  eAux(pDb->pAux);
2090: 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 41 75 78  .      pDb->pAux
20a0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
20b0: 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64    for(i=j=2; i<d
20c0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
20d0: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
20e0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
20f0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
2100: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2110: 69 74 65 46 72 65 65 28 70 44 62 2d 3e 7a 4e 61  iteFree(pDb->zNa
2120: 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  me);.      pDb->
2130: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
2140: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
2150: 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a  .    if( j<i ){.
2160: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d        db->aDb[j]
2170: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20   = db->aDb[i];. 
2180: 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20     }.    j++;.  
2190: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e  }.  memset(&db->
21a0: 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e  aDb[j], 0, (db->
21b0: 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62  nDb-j)*sizeof(db
21c0: 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62  ->aDb[j]));.  db
21d0: 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28  ->nDb = j;.  if(
21e0: 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64   db->nDb<=2 && d
21f0: 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53  b->aDb!=db->aDbS
2200: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d  tatic ){.    mem
2210: 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69  cpy(db->aDbStati
2220: 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69  c, db->aDb, 2*si
2230: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29  zeof(db->aDb[0])
2240: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
2250: 65 28 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20  e(db->aDb);.    
2260: 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
2270: 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a  bStatic;.  }.}..
2280: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2290: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
22a0: 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  never a rollback
22b0: 20 6f 63 63 75 72 73 2e 20 20 49 66 20 74 68 65   occurs.  If the
22c0: 72 65 20 77 65 72 65 0a 2a 2a 20 73 63 68 65 6d  re were.** schem
22d0: 61 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67  a changes during
22e0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
22f0: 2c 20 74 68 65 6e 20 77 65 20 68 61 76 65 20 74  , then we have t
2300: 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 69  o reset the.** i
2310: 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62  nternal hash tab
2320: 6c 65 73 20 61 6e 64 20 72 65 6c 6f 61 64 20 74  les and reload t
2330: 68 65 6d 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a  hem from disk..*
2340: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
2350: 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43 68  llbackInternalCh
2360: 61 6e 67 65 73 28 73 71 6c 69 74 65 20 2a 64 62  anges(sqlite *db
2370: 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  ){.  if( db->fla
2380: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs & SQLITE_Inte
2390: 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20  rnChanges ){.   
23a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
23b0: 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
23c0: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
23d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
23e0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63   called when a c
23f0: 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f  ommit occurs..*/
2400: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
2410: 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
2420: 65 73 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a  es(sqlite *db){.
2430: 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 63 68    db->aDb[0].sch
2440: 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d  ema_cookie = db-
2450: 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 3b 0a 20 20  >next_cookie;.  
2460: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
2470: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
2480: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  es;.}../*.** Rem
2490: 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 64  ove the memory d
24a0: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61  ata structures a
24b0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
24c0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c  he given.** Tabl
24d0: 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  e.  No changes a
24e0: 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b 20  re made to disk 
24f0: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
2500: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2510: 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65 73  ine just deletes
2520: 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74   the data struct
2530: 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ure.  It does no
2540: 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20  t unlink.** the 
2550: 74 61 62 6c 65 20 64 61 74 61 20 73 74 72 75 63  table data struc
2560: 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68 61  ture from the ha
2570: 73 68 20 74 61 62 6c 65 2e 20 20 4e 6f 72 20 64  sh table.  Nor d
2580: 6f 65 73 20 69 74 20 72 65 6d 6f 76 65 0a 2a 2a  oes it remove.**
2590: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 66 72   foreign keys fr
25a0: 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 2e 61 46  om the sqlite.aF
25b0: 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65 2e 20  Key hash table. 
25c0: 20 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73   But it does des
25d0: 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73  troy.** memory s
25e0: 74 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65  tructures of the
25f0: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
2600: 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69  eign keys associ
2610: 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68  ated with .** th
2620: 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  e table..**.** I
2630: 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
2640: 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
2650: 20 61 72 65 20 75 6e 6c 69 6e 6b 65 64 20 66 72   are unlinked fr
2660: 6f 6d 20 74 68 65 20 22 64 62 22 0a 2a 2a 20 64  om the "db".** d
2670: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69 66  ata structure if
2680: 20 64 62 21 3d 4e 55 4c 4c 2e 20 20 49 66 20 64   db!=NULL.  If d
2690: 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63 65 73  b==NULL, indices
26a0: 20 61 74 74 61 63 68 65 64 20 74 6f 0a 2a 2a 20   attached to.** 
26b0: 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 64 65  the table are de
26c0: 6c 65 74 65 64 2c 20 62 75 74 20 69 74 20 69 73  leted, but it is
26d0: 20 61 73 73 75 6d 65 64 20 74 68 65 79 20 68 61   assumed they ha
26e0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a  ve already been.
26f0: 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a  ** unlinked..*/.
2700: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
2710: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 20 2a  teTable(sqlite *
2720: 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  db, Table *pTabl
2730: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 49  e){.  int i;.  I
2740: 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70  ndex *pIndex, *p
2750: 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46  Next;.  FKey *pF
2760: 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b  Key, *pNextFKey;
2770: 0a 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ..  if( pTable==
2780: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  0 ) return;..  /
2790: 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64  * Delete all ind
27a0: 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
27b0: 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 0a  with this table.
27c0: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65    */.  for(pInde
27d0: 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64  x = pTable->pInd
27e0: 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
27f0: 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ex=pNext){.    p
2800: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
2810: 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74  Next;.    assert
2820: 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 70  ( pIndex->iDb==p
2830: 54 61 62 6c 65 2d 3e 69 44 62 20 7c 7c 20 28 70  Table->iDb || (p
2840: 54 61 62 6c 65 2d 3e 69 44 62 3d 3d 30 20 26 26  Table->iDb==0 &&
2850: 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 31 29   pIndex->iDb==1)
2860: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65   );.    sqliteDe
2870: 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49  leteIndex(db, pI
2880: 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ndex);.  }..  /*
2890: 20 44 65 6c 65 74 65 20 61 6c 6c 20 66 6f 72 65   Delete all fore
28a0: 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61  ign keys associa
28b0: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61  ted with this ta
28c0: 62 6c 65 2e 20 20 54 68 65 20 6b 65 79 73 0a 20  ble.  The keys. 
28d0: 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20   ** should have 
28e0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 75 6e 6c  already been unl
28f0: 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 64  inked from the d
2900: 62 2d 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61  b->aFKey hash ta
2910: 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ble .  */.  for(
2920: 70 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46  pFKey=pTable->pF
2930: 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65  Key; pFKey; pFKe
2940: 79 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20  y=pNextFKey){.  
2950: 20 20 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46    pNextFKey = pF
2960: 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a  Key->pNextFrom;.
2970: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
2980: 6c 65 2d 3e 69 44 62 3c 64 62 2d 3e 6e 44 62 20  le->iDb<db->nDb 
2990: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
29a0: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
29b0: 64 62 2d 3e 61 44 62 5b 70 54 61 62 6c 65 2d 3e  db->aDb[pTable->
29c0: 69 44 62 5d 2e 61 46 4b 65 79 2c 0a 20 20 20 20  iDb].aFKey,.    
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e0: 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54         pFKey->zT
29f0: 6f 2c 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d  o, strlen(pFKey-
2a00: 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79 20  >zTo)+1)!=pFKey 
2a10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
2a20: 65 28 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 0a 20  e(pFKey);.  }.. 
2a30: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54   /* Delete the T
2a40: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  able structure i
2a50: 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 66 6f  tself..  */.  fo
2a60: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d  r(i=0; i<pTable-
2a70: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
2a80: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
2a90: 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  le->aCol[i].zNam
2aa0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
2ab0: 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  ee(pTable->aCol[
2ac0: 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73  i].zDflt);.    s
2ad0: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
2ae0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29  ->aCol[i].zType)
2af0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
2b00: 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ee(pTable->zName
2b10: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
2b20: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20  pTable->aCol);. 
2b30: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
2b40: 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53 65  lete(pTable->pSe
2b50: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46  lect);.  sqliteF
2b60: 72 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a  ree(pTable);.}..
2b70: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  /*.** Unlink the
2b80: 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f   given table fro
2b90: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
2ba0: 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65  s and the delete
2bb0: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74   the.** table st
2bc0: 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c  ructure with all
2bd0: 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64   its indices and
2be0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a   foreign keys..*
2bf0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
2c00: 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  liteUnlinkAndDel
2c10: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 20  eteTable(sqlite 
2c20: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a  *db, Table *p){.
2c30: 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20    Table *pOld;. 
2c40: 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46 32   FKey *pF1, *pF2
2c50: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d 3e 69  ;.  int i = p->i
2c60: 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  Db;.  assert( db
2c70: 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20  !=0 );.  pOld = 
2c80: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
2c90: 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 74 62  t(&db->aDb[i].tb
2ca0: 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  lHash, p->zName,
2cb0: 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65   strlen(p->zName
2cc0: 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  )+1, 0);.  asser
2cd0: 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f  t( pOld==0 || pO
2ce0: 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 6f 72 28 70  ld==p );.  for(p
2cf0: 46 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31  F1=p->pFKey; pF1
2d00: 3b 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74  ; pF1=pF1->pNext
2d10: 46 72 6f 6d 29 7b 0a 20 20 20 20 69 6e 74 20 6e  From){.    int n
2d20: 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 31 2d  To = strlen(pF1-
2d30: 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 70  >zTo) + 1;.    p
2d40: 46 32 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  F2 = sqlite3Hash
2d50: 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 69 5d  Find(&db->aDb[i]
2d60: 2e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f  .aFKey, pF1->zTo
2d70: 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 69 66 28 20  , nTo);.    if( 
2d80: 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20  pF2==pF1 ){.    
2d90: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73    sqlite3HashIns
2da0: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e  ert(&db->aDb[i].
2db0: 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c  aFKey, pF1->zTo,
2dc0: 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78 74   nTo, pF1->pNext
2dd0: 54 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  To);.    }else{.
2de0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 32        while( pF2
2df0: 20 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f   && pF2->pNextTo
2e00: 21 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32  !=pF1 ){ pF2=pF2
2e10: 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20  ->pNextTo; }.   
2e20: 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a 20 20     if( pF2 ){.  
2e30: 20 20 20 20 20 20 70 46 32 2d 3e 70 4e 65 78 74        pF2->pNext
2e40: 54 6f 20 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54  To = pF1->pNextT
2e50: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
2e60: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
2e70: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29  leteTable(db, p)
2e80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  ;.}../*.** Const
2e90: 72 75 63 74 20 74 68 65 20 6e 61 6d 65 20 6f 66  ruct the name of
2ea0: 20 61 20 75 73 65 72 20 74 61 62 6c 65 20 6f 72   a user table or
2eb0: 20 69 6e 64 65 78 20 66 72 6f 6d 20 61 20 74 6f   index from a to
2ec0: 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  ken..**.** Space
2ed0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d   to hold the nam
2ee0: 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  e is obtained fr
2ef0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
2f00: 29 20 61 6e 64 20 6d 75 73 74 0a 2a 2a 20 62 65  ) and must.** be
2f10: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
2f20: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
2f30: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
2f40: 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b  TableNameFromTok
2f50: 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  en(Token *pName)
2f60: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  {.  char *zName 
2f70: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
2f80: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
2f90: 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  >n);.  sqlite3De
2fa0: 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
2fb0: 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
2fc0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
2fd0: 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  code to open the
2fe0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61 73   appropriate mas
2ff0: 74 65 72 20 74 61 62 6c 65 2e 20 20 54 68 65 20  ter table.  The 
3000: 74 61 62 6c 65 0a 2a 2a 20 6f 70 65 6e 65 64 20  table.** opened 
3010: 77 69 6c 6c 20 62 65 20 53 51 4c 49 54 45 5f 4d  will be SQLITE_M
3020: 41 53 54 45 52 20 66 6f 72 20 70 65 72 73 69 73  ASTER for persis
3030: 74 65 6e 74 20 74 61 62 6c 65 73 20 61 6e 64 20  tent tables and 
3040: 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  .** SQLITE_TEMP_
3050: 4d 41 53 54 45 52 20 66 6f 72 20 74 65 6d 70 6f  MASTER for tempo
3060: 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 54 68  rary tables.  Th
3070: 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65  e table is opene
3080: 64 0a 2a 2a 20 6f 6e 20 63 75 72 73 6f 72 20 30  d.** on cursor 0
3090: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
30a0: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
30b0: 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 73  (Vdbe *v, int is
30c0: 54 65 6d 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  Temp){.  sqlite3
30d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
30e0: 49 6e 74 65 67 65 72 2c 20 69 73 54 65 6d 70 2c  Integer, isTemp,
30f0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
3100: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
3110: 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54  enWrite, 0, MAST
3120: 45 52 5f 52 4f 4f 54 29 3b 0a 7d 0a 0a 2f 2a 0a  ER_ROOT);.}../*.
3130: 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75  ** Begin constru
3140: 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  cting a new tabl
3150: 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
3160: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
3170: 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  s is.** the firs
3180: 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74  t of several act
3190: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ion routines tha
31a0: 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20  t get called in 
31b0: 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61  response.** to a
31c0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
31d0: 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72  atement.  In par
31e0: 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f  ticular, this ro
31f0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a  utine is called.
3200: 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20  ** after seeing 
3210: 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20  tokens "CREATE" 
3220: 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20  and "TABLE" and 
3230: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  the table name. 
3240: 20 54 68 65 0a 2a 2a 20 70 53 74 61 72 74 20 74   The.** pStart t
3250: 6f 6b 65 6e 20 69 73 20 74 68 65 20 43 52 45 41  oken is the CREA
3260: 54 45 20 61 6e 64 20 70 4e 61 6d 65 20 69 73 20  TE and pName is 
3270: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  the table name. 
3280: 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66   The isTemp.** f
3290: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
32a0: 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  he table should 
32b0: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
32c0: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
32d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74  ase.** file inst
32e0: 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61  ead of in the ma
32f0: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
3300: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
3310: 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20  lly the case.** 
3320: 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20  when the "TEMP" 
3330: 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b  or "TEMPORARY" k
3340: 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e  eyword occurs in
3350: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41   between.** CREA
3360: 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a  TE and TABLE..**
3370: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c  .** The new tabl
3380: 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74  e record is init
3390: 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20  ialized and put 
33a0: 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  in pParse->pNewT
33b0: 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65  able..** As more
33c0: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
33d0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
33e0: 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69  s parsed, additi
33f0: 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72  onal action.** r
3400: 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20  outines will be 
3410: 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f  called to add mo
3420: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  re information t
3430: 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a  o this record..*
3440: 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
3450: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
3460: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
3470: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
3480: 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  ) routine.** is 
3490: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65  called to comple
34a0: 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  te the construct
34b0: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ion of the new t
34c0: 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a  able record..*/.
34d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61 72  void sqlite3Star
34e0: 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  tTable(.  Parse 
34f0: 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
3500: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
3510: 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c    Token *pStart,
3520: 20 20 20 2f 2a 20 54 68 65 20 22 43 52 45 41 54     /* The "CREAT
3530: 45 22 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f  E" token */.  To
3540: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f  ken *pName,    /
3550: 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20  * Name of table 
3560: 6f 72 20 76 69 65 77 20 74 6f 20 63 72 65 61 74  or view to creat
3570: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  e */.  int isTem
3580: 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  p,      /* True 
3590: 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  if this is a TEM
35a0: 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  P table */.  int
35b0: 20 69 73 56 69 65 77 20 20 20 20 20 20 20 2f 2a   isView       /*
35c0: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
35d0: 20 61 20 56 49 45 57 20 2a 2f 0a 29 7b 0a 20 20   a VIEW */.){.  
35e0: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
35f0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
3600: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73  char *zName;.  s
3610: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
3620: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
3630: 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  v;.  int iDb;.. 
3640: 20 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54   pParse->sFirstT
3650: 6f 6b 65 6e 20 3d 20 2a 70 53 74 61 72 74 3b 0a  oken = *pStart;.
3660: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
3670: 33 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f  3TableNameFromTo
3680: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66  ken(pName);.  if
3690: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
36a0: 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 69  urn;.  if( db->i
36b0: 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54  nit.iDb==1 ) isT
36c0: 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  emp = 1;.#ifndef
36d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
36e0: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73  HORIZATION.  ass
36f0: 65 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31  ert( (isTemp & 1
3700: 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b  )==isTemp );.  {
3710: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
3720: 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 69     char *zDb = i
3730: 73 54 65 6d 70 20 3f 20 22 74 65 6d 70 22 20 3a  sTemp ? "temp" :
3740: 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 69 66 28   "main";.    if(
3750: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
3760: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
3770: 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f  _INSERT, SCHEMA_
3780: 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30  TABLE(isTemp), 0
3790: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
37a0: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
37b0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
37c0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
37d0: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
37e0: 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  f( isTemp ){.   
37f0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
3800: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
3810: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
3820: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
3830: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
3840: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
3850: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
3860: 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  ( isTemp ){.    
3870: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
3880: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
3890: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
38a0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
38b0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
38c0: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
38d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
38e0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
38f0: 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65  rse, code, zName
3900: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
3910: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
3920: 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
3930: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  rn;.    }.  }.#e
3940: 6e 64 69 66 0a 20 0a 0a 20 20 2f 2a 20 42 65 66  ndif. ..  /* Bef
3950: 6f 72 65 20 74 72 79 69 6e 67 20 74 6f 20 63 72  ore trying to cr
3960: 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  eate a temporary
3970: 20 74 61 62 6c 65 2c 20 6d 61 6b 65 20 73 75 72   table, make sur
3980: 65 20 74 68 65 20 42 74 72 65 65 20 66 6f 72 0a  e the Btree for.
3990: 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 74 65 6d    ** holding tem
39a0: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 69 73  porary tables is
39b0: 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66   open..  */.  if
39c0: 28 20 69 73 54 65 6d 70 20 26 26 20 64 62 2d 3e  ( isTemp && db->
39d0: 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26  aDb[1].pBt==0 &&
39e0: 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
39f0: 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  n ){.    int rc 
3a00: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 61  = sqlite3BtreeFa
3a10: 63 74 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c 20  ctory(db, 0, 0, 
3a20: 4d 41 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e  MAX_PAGES, &db->
3a30: 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[1].pBt);.   
3a40: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
3a50: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
3a60: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3a70: 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f  se, "unable to o
3a80: 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
3a90: 64 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20  database ".     
3aa0: 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f     "file for sto
3ab0: 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74  ring temporary t
3ac0: 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70  ables");.      p
3ad0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
3ae0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
3af0: 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66   }.    if( db->f
3b00: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
3b10: 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 72  Trans ){.      r
3b20: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
3b30: 42 65 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e 61  BeginTrans(db->a
3b40: 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[1].pBt);.    
3b50: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
3b60: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
3b70: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3b80: 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
3b90: 6f 20 67 65 74 20 61 20 77 72 69 74 65 20 6c 6f  o get a write lo
3ba0: 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20 20 20  ck on ".        
3bb0: 20 20 22 74 68 65 20 74 65 6d 70 6f 72 61 72 79    "the temporary
3bc0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 29   database file")
3bd0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
3be0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3bf0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
3c00: 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c  ure the new tabl
3c10: 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20  e name does not 
3c20: 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20  collide with an 
3c30: 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e  existing.  ** in
3c40: 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d  dex or table nam
3c50: 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72  e.  Issue an err
3c60: 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20 69 74  or message if it
3c70: 20 64 6f 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   does..  **.  **
3c80: 20 49 66 20 77 65 20 61 72 65 20 72 65 2d 72 65   If we are re-re
3c90: 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
3ca0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65  _master table be
3cb0: 63 61 75 73 65 20 6f 66 20 61 20 73 63 68 65 6d  cause of a schem
3cc0: 61 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20 61 6e  a.  ** change an
3cd0: 64 20 61 20 6e 65 77 20 70 65 72 6d 61 6e 65 6e  d a new permanen
3ce0: 74 20 74 61 62 6c 65 20 69 73 20 66 6f 75 6e 64  t table is found
3cf0: 20 77 68 6f 73 65 20 6e 61 6d 65 20 63 6f 6c 6c   whose name coll
3d00: 69 64 65 73 20 77 69 74 68 0a 20 20 2a 2a 20 61  ides with.  ** a
3d10: 6e 20 65 78 69 73 74 69 6e 67 20 74 65 6d 70 6f  n existing tempo
3d20: 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 61 74  rary table, that
3d30: 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   is not an error
3d40: 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 6c 65 20  ..  */.  pTable 
3d50: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
3d60: 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  le(db, zName, 0)
3d70: 3b 0a 20 20 69 44 62 20 3d 20 69 73 54 65 6d 70  ;.  iDb = isTemp
3d80: 20 3f 20 31 20 3a 20 64 62 2d 3e 69 6e 69 74 2e   ? 1 : db->init.
3d90: 69 44 62 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  iDb;.  if( pTabl
3da0: 65 21 3d 30 20 26 26 20 28 70 54 61 62 6c 65 2d  e!=0 && (pTable-
3db0: 3e 69 44 62 3d 3d 69 44 62 20 7c 7c 20 21 64 62  >iDb==iDb || !db
3dc0: 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a  ->init.busy) ){.
3dd0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3de0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
3df0: 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65 78  le %T already ex
3e00: 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ists", pName);. 
3e10: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
3e20: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
3e30: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 49 64  ;.  }.  if( (pId
3e40: 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
3e50: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
3e60: 30 29 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20  0))!=0 &&.      
3e70: 20 20 20 20 28 70 49 64 78 2d 3e 69 44 62 3d 3d      (pIdx->iDb==
3e80: 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62  0 || !db->init.b
3e90: 75 73 79 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  usy) ){.    sqli
3ea0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3eb0: 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  se, "there is al
3ec0: 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e  ready an index n
3ed0: 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29  amed %s", zName)
3ee0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
3ef0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  (zName);.    ret
3f00: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  urn;.  }.  pTabl
3f10: 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  e = sqliteMalloc
3f20: 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  ( sizeof(Table) 
3f30: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
3f40: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
3f50: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
3f60: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
3f70: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
3f80: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
3f90: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  nCol = 0;.  pTab
3fa0: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->aCol = 0;.  
3fb0: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20  pTable->iPKey = 
3fc0: 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49  -1;.  pTable->pI
3fd0: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54 61 62  ndex = 0;.  pTab
3fe0: 6c 65 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20  le->iDb = iDb;. 
3ff0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65   if( pParse->pNe
4000: 77 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65 33  wTable ) sqlite3
4010: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
4020: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4030: 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e  e);.  pParse->pN
4040: 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65  ewTable = pTable
4050: 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  ;..  /* Begin ge
4060: 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64  nerating the cod
4070: 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65  e that will inse
4080: 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  rt the table rec
4090: 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ord into.  ** th
40a0: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
40b0: 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20  table.  Note in 
40c0: 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20  particular that 
40d0: 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64  we must go ahead
40e0: 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61  .  ** and alloca
40f0: 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  te the record nu
4100: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
4110: 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42  le entry now.  B
4120: 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50  efore any.  ** P
4130: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
4140: 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72  IQUE keywords ar
4150: 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65  e parsed.  Those
4160: 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63   keywords will c
4170: 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65  ause.  ** indice
4180: 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  s to be created 
4190: 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65  and the table re
41a0: 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62  cord must come b
41b0: 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20  efore the .  ** 
41c0: 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c  indices.  Hence,
41d0: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
41e0: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
41f0: 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
4200: 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a  ed.  ** now..  *
4210: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
4220: 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73  t.busy && (v = s
4230: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
4240: 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20  arse))!=0 ){.   
4250: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
4260: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
4270: 73 65 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a  se, 0, isTemp);.
4280: 20 20 20 20 69 66 28 20 21 69 73 54 65 6d 70 20      if( !isTemp 
4290: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
42a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
42b0: 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 66 69 6c  Integer, db->fil
42c0: 65 5f 66 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20  e_format, 0);.  
42d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
42e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
42f0: 6f 6b 69 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  okie, 0, 1);.   
4300: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70   }.    sqlite3Op
4310: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c  enMasterTable(v,
4320: 20 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 73 71   isTemp);.    sq
4330: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4340: 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30  , OP_NewRecno, 0
4350: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4360: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4370: 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
4380: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4390: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
43a0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
43b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
43c0: 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20  P_PutIntKey, 0, 
43d0: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
43e0: 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d   Add a new colum
43f0: 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  n to the table c
4400: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
4410: 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a  onstructed..**.*
4420: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
4430: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
4440: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f  once for each co
4450: 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  lumn declaration
4460: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
4470: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
4480: 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
4490: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
44a0: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
44b0: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
44c0: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
44d0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
44e0: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
44f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4500: 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20  AddColumn(Parse 
4510: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
4520: 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  pName){.  Table 
4530: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
4540: 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 43 6f  har *z = 0;.  Co
4550: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66  lumn *pCol;.  if
4560: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
4570: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
4580: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
4590: 53 65 74 4e 53 74 72 69 6e 67 28 26 7a 2c 20 70  SetNString(&z, p
45a0: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
45b0: 6e 2c 20 30 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  n, 0);.  if( z==
45c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
45d0: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b  lite3Dequote(z);
45e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
45f0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
4600: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
4610: 43 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69  Cmp(z, p->aCol[i
4620: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
4630: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
4640: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75  rMsg(pParse, "du
4650: 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e  plicate column n
4660: 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ame: %s", z);.  
4670: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
4680: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
4690: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
46a0: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
46b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
46c0: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
46d0: 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
46e0: 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e  c( p->aCol, (p->
46f0: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
4700: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  ->aCol[0]));.   
4710: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72   if( aNew==0 ) r
4720: 65 74 75 72 6e 3b 0a 20 20 20 20 70 2d 3e 61 43  eturn;.    p->aC
4730: 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20  ol = aNew;.  }. 
4740: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
4750: 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d  [p->nCol];.  mem
4760: 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a  set(pCol, 0, siz
4770: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
4780: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20  ;.  pCol->zName 
4790: 3d 20 7a 3b 0a 20 20 70 43 6f 6c 2d 3e 73 6f 72  = z;.  pCol->sor
47a0: 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45 5f  tOrder = SQLITE_
47b0: 53 4f 5f 4e 55 4d 3b 0a 20 20 70 2d 3e 6e 43 6f  SO_NUM;.  p->nCo
47c0: 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  l++;.}../*.** Th
47d0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
47e0: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
47f0: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
4800: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
4810: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
4820: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
4830: 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e  A "NOT NULL" con
4840: 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62  straint has.** b
4850: 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f  een seen on a co
4860: 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  lumn.  This rout
4870: 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74  ine sets the not
4880: 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20  Null flag on.** 
4890: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  the column curre
48a0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
48b0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
48c0: 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75   sqlite3AddNotNu
48d0: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
48e0: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
48f0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
4900: 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  t i;.  if( (p = 
4910: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4920: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
4930: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
4940: 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d  .  if( i>=0 ) p-
4950: 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c  >aCol[i].notNull
4960: 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f   = onError;.}../
4970: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4980: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
4990: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
49a0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
49b0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
49c0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
49d0: 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73  ment.  The pFirs
49e0: 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66  t token is the f
49f0: 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e  irst.** token in
4a00: 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66   the sequence of
4a10: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73   tokens that des
4a20: 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f  cribe the type o
4a30: 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  f the.** column 
4a40: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
4a50: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20  construction.   
4a60: 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73  pLast is the las
4a70: 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68  t token.** in th
4a80: 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65  e sequence.  Use
4a90: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
4aa0: 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61  n to construct a
4ab0: 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20   string.** that 
4ac0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70  contains the typ
4ad0: 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c  ename of the col
4ae0: 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  umn and store th
4af0: 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20  at string.** in 
4b00: 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20  zType..*/ .void 
4b10: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
4b20: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
4b30: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 46 69 72 73  se, Token *pFirs
4b40: 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74 29  t, Token *pLast)
4b50: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
4b60: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
4b70: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a 2a  n;.  char *z, **
4b80: 70 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  pz;.  Column *pC
4b90: 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  ol;.  if( (p = p
4ba0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
4bb0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
4bc0: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
4bd0: 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75    if( i<0 ) retu
4be0: 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d  rn;.  pCol = &p-
4bf0: 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 70 7a 20 3d  >aCol[i];.  pz =
4c00: 20 26 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20   &pCol->zType;. 
4c10: 20 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b 20   n = pLast->n + 
4c20: 41 64 64 72 28 70 4c 61 73 74 2d 3e 7a 29 20 2d  Addr(pLast->z) -
4c30: 20 41 64 64 72 28 70 46 69 72 73 74 2d 3e 7a 29   Addr(pFirst->z)
4c40: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53  ;.  sqlite3SetNS
4c50: 74 72 69 6e 67 28 70 7a 2c 20 70 46 69 72 73 74  tring(pz, pFirst
4c60: 2d 3e 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 7a 20  ->z, n, 0);.  z 
4c70: 3d 20 2a 70 7a 3b 0a 20 20 69 66 28 20 7a 3d 3d  = *pz;.  if( z==
4c80: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
4c90: 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69  r(i=j=0; z[i]; i
4ca0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d  ++){.    int c =
4cb0: 20 7a 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 69   z[i];.    if( i
4cc0: 73 73 70 61 63 65 28 63 29 20 29 20 63 6f 6e 74  sspace(c) ) cont
4cd0: 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d  inue;.    z[j++]
4ce0: 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d   = c;.  }.  z[j]
4cf0: 20 3d 20 30 3b 0a 20 20 70 43 6f 6c 2d 3e 73 6f   = 0;.  pCol->so
4d00: 72 74 4f 72 64 65 72 20 3d 20 73 71 6c 69 74 65  rtOrder = sqlite
4d10: 33 43 6f 6c 6c 61 74 65 54 79 70 65 28 7a 2c 20  3CollateType(z, 
4d20: 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  n);.}../*.** The
4d30: 20 67 69 76 65 6e 20 74 6f 6b 65 6e 20 69 73 20   given token is 
4d40: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
4d50: 65 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 63  e for the last c
4d60: 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 0a 2a  olumn added to.*
4d70: 2a 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  * the table curr
4d80: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
4d90: 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 22 6d  truction.  If "m
4da0: 69 6e 75 73 46 6c 61 67 22 20 69 73 20 74 72 75  inusFlag" is tru
4db0: 65 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74  e, it.** means t
4dc0: 68 65 20 76 61 6c 75 65 20 74 6f 6b 65 6e 20 77  he value token w
4dd0: 61 73 20 70 72 65 63 65 64 65 64 20 62 79 20 61  as preceded by a
4de0: 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a   minus sign..**.
4df0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4e00: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
4e10: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
4e20: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
4e30: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
4e40: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
4e50: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
4e60: 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c  te3AddDefaultVal
4e70: 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
4e80: 2c 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20 69  , Token *pVal, i
4e90: 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20  nt minusFlag){. 
4ea0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
4eb0: 20 69 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b   i;.  char **pz;
4ec0: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
4ed0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
4ee0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
4ef0: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69  = p->nCol-1;.  i
4f00: 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b  f( i<0 ) return;
4f10: 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c  .  pz = &p->aCol
4f20: 5b 69 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69 66 28  [i].zDflt;.  if(
4f30: 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20   minusFlag ){.  
4f40: 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72    sqlite3SetNStr
4f50: 69 6e 67 28 70 7a 2c 20 22 2d 22 2c 20 31 2c 20  ing(pz, "-", 1, 
4f60: 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e  pVal->z, pVal->n
4f70: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
4f80: 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74     sqlite3SetNSt
4f90: 72 69 6e 67 28 70 7a 2c 20 70 56 61 6c 2d 3e 7a  ring(pz, pVal->z
4fa0: 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20  , pVal->n, 0);. 
4fb0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75   }.  sqlite3Dequ
4fc0: 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a  ote(*pz);.}../*.
4fd0: 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65  ** Designate the
4fe0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72   PRIMARY KEY for
4ff0: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69   the table.  pLi
5000: 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
5010: 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c  names .** of col
5020: 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74  umns that form t
5030: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  he primary key. 
5040: 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c   If pList is NUL
5050: 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d  L, then the.** m
5060: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
5070: 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ed column of the
5080: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72   table is the pr
5090: 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  imary key..**.**
50a0: 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76   A table can hav
50b0: 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72  e at most one pr
50c0: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74  imary key.  If t
50d0: 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
50e0: 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72   has.** a primar
50f0: 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20  y key (and this 
5100: 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72  is the second pr
5110: 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20  imary key) then 
5120: 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72  create an.** err
5130: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  or..**.** If the
5140: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20   PRIMARY KEY is 
5150: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  on a single colu
5160: 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70  mn whose datatyp
5170: 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a  e is INTEGER,.**
5180: 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72   then we will tr
5190: 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f  y to use that co
51a0: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 20  lumn as the row 
51b0: 69 64 2e 20 20 28 45 78 63 65 70 74 69 6f 6e 3a  id.  (Exception:
51c0: 0a 2a 2a 20 46 6f 72 20 62 61 63 6b 77 61 72 64  .** For backward
51d0: 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
51e0: 77 69 74 68 20 6f 6c 64 65 72 20 64 61 74 61 62  with older datab
51f0: 61 73 65 73 2c 20 64 6f 20 6e 6f 74 20 64 6f 20  ases, do not do 
5200: 74 68 69 73 0a 2a 2a 20 69 66 20 74 68 65 20 66  this.** if the f
5210: 69 6c 65 20 66 6f 72 6d 61 74 20 76 65 72 73 69  ile format versi
5220: 6f 6e 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  on number is les
5230: 73 20 74 68 61 6e 20 31 2e 29 20 20 53 65 74 20  s than 1.)  Set 
5240: 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a  the Table.iPKey.
5250: 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
5260: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
5270: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74  truction to be t
5280: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
5290: 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ** INTEGER PRIMA
52a0: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20  RY KEY column.  
52b0: 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73  Table.iPKey is s
52c0: 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72  et to -1 if ther
52d0: 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47  e is.** no INTEG
52e0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  ER PRIMARY KEY..
52f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79  **.** If the key
5300: 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47   is not an INTEG
5310: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
5320: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e  then create a un
5330: 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f  ique.** index fo
5340: 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69  r the key.  No i
5350: 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20  ndex is created 
5360: 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d  for INTEGER PRIM
5370: 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69  ARY KEYs..*/.voi
5380: 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d  d sqlite3AddPrim
5390: 61 72 79 4b 65 79 28 50 61 72 73 65 20 2a 70 50  aryKey(Parse *pP
53a0: 61 72 73 65 2c 20 49 64 4c 69 73 74 20 2a 70 4c  arse, IdList *pL
53b0: 69 73 74 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72  ist, int onError
53c0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
53d0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
53e0: 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54  able;.  char *zT
53f0: 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ype = 0;.  int i
5400: 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69  Col = -1, i;.  i
5410: 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74  f( pTab==0 ) got
5420: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
5430: 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  it;.  if( pTab->
5440: 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20  hasPrimKey ){.  
5450: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5460: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
5470: 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68   "table \"%s\" h
5480: 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
5490: 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70   primary key", p
54a0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
54b0: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
54c0: 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54  y_exit;.  }.  pT
54d0: 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d  ab->hasPrimKey =
54e0: 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   1;.  if( pList=
54f0: 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  =0 ){.    iCol =
5500: 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b   pTab->nCol - 1;
5510: 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  .    pTab->aCol[
5520: 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20  iCol].isPrimKey 
5530: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
5540: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
5550: 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
5560: 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b       for(iCol=0;
5570: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
5580: 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
5590: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
55a0: 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
55b0: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  ].zName, pTab->a
55c0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
55d0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
55e0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
55f0: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  Col<pTab->nCol )
5600: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
5610: 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b  ].isPrimKey = 1;
5620: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
5630: 4c 69 73 74 2d 3e 6e 49 64 3e 31 20 29 20 69 43  List->nId>1 ) iC
5640: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69  ol = -1;.  }.  i
5650: 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  f( iCol>=0 && iC
5660: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  ol<pTab->nCol ){
5670: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61  .    zType = pTa
5680: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
5690: 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ype;.  }.  if( z
56a0: 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 33 53  Type && sqlite3S
56b0: 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49  trICmp(zType, "I
56c0: 4e 54 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20  NTEGER")==0 ){. 
56d0: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
56e0: 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d   iCol;.    pTab-
56f0: 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72  >keyConf = onErr
5700: 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  or;.  }else{.   
5710: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
5720: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
5730: 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72  , pList, onError
5740: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69  , 0, 0);.    pLi
5750: 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69  st = 0;.  }..pri
5760: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20  mary_key_exit:. 
5770: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
5780: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72  lete(pList);.  r
5790: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
57a0: 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f  Return the appro
57b0: 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67  priate collating
57c0: 20 74 79 70 65 20 67 69 76 65 6e 20 61 20 74 79   type given a ty
57d0: 70 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54  pe name..**.** T
57e0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70  he collation typ
57f0: 65 20 69 73 20 74 65 78 74 20 28 53 51 4c 49 54  e is text (SQLIT
5800: 45 5f 53 4f 5f 54 45 58 54 29 20 69 66 20 74 68  E_SO_TEXT) if th
5810: 65 20 74 79 70 65 0a 2a 2a 20 6e 61 6d 65 20 63  e type.** name c
5820: 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 68 61 72  ontains the char
5830: 61 63 74 65 72 20 73 74 72 65 61 6d 20 22 74 65  acter stream "te
5840: 78 74 22 20 6f 72 20 22 62 6c 6f 62 22 20 6f 72  xt" or "blob" or
5850: 0a 2a 2a 20 22 63 6c 6f 62 22 2e 20 20 41 6e 79  .** "clob".  Any
5860: 20 6f 74 68 65 72 20 74 79 70 65 20 6e 61 6d 65   other type name
5870: 20 69 73 20 63 6f 6c 6c 61 74 65 64 20 61 73 20   is collated as 
5880: 6e 75 6d 65 72 69 63 0a 2a 2a 20 28 53 51 4c 49  numeric.** (SQLI
5890: 54 45 5f 53 4f 5f 4e 55 4d 29 2e 0a 2a 2f 0a 69  TE_SO_NUM)..*/.i
58a0: 6e 74 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 74  nt sqlite3Collat
58b0: 65 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72  eType(const char
58c0: 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79   *zType, int nTy
58d0: 70 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pe){.  int i;.  
58e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 79 70 65  for(i=0; i<nType
58f0: 2d 33 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  -3; i++){.    in
5900: 74 20 63 20 3d 20 2a 28 7a 54 79 70 65 2b 2b 29  t c = *(zType++)
5910: 20 7c 20 30 78 36 30 3b 0a 20 20 20 20 69 66 28   | 0x60;.    if(
5920: 20 28 63 3d 3d 27 62 27 20 7c 7c 20 63 3d 3d 27   (c=='b' || c=='
5930: 63 27 29 20 26 26 20 73 71 6c 69 74 65 33 53 74  c') && sqlite3St
5940: 72 4e 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 6c  rNICmp(zType, "l
5950: 6f 62 22 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20  ob", 3)==0 ){.  
5960: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5970: 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 7d  E_SO_TEXT;.    }
5980: 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 63 27 20  .    if( c=='c' 
5990: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
59a0: 6d 70 28 7a 54 79 70 65 2c 20 22 68 61 72 22 2c  mp(zType, "har",
59b0: 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   3)==0 ){.      
59c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f  return SQLITE_SO
59d0: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _TEXT;.    }.   
59e0: 20 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20 73   if( c=='t' && s
59f0: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
5a00: 54 79 70 65 2c 20 22 65 78 74 22 2c 20 33 29 3d  Type, "ext", 3)=
5a10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
5a20: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58  rn SQLITE_SO_TEX
5a30: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  T;.    }.  }.  r
5a40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f  eturn SQLITE_SO_
5a50: 4e 55 4d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  NUM;.}../*.** Th
5a60: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
5a70: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
5a80: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
5a90: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
5aa0: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
5ab0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
5ac0: 41 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75  A "COLLATE" clau
5ad0: 73 65 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73  se has.** been s
5ae0: 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e  een on a column.
5af0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
5b00: 65 74 73 20 74 68 65 20 43 6f 6c 75 6d 6e 2e 73  ets the Column.s
5b10: 6f 72 74 4f 72 64 65 72 20 6f 6e 0a 2a 2a 20 74  ortOrder on.** t
5b20: 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e  he column curren
5b30: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
5b40: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
5b50: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74  sqlite3AddCollat
5b60: 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  eType(Parse *pPa
5b70: 72 73 65 2c 20 69 6e 74 20 63 6f 6c 6c 54 79 70  rse, int collTyp
5b80: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
5b90: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28    int i;.  if( (
5ba0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
5bb0: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
5bc0: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
5bd0: 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20  l-1;.  if( i>=0 
5be0: 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 73 6f 72  ) p->aCol[i].sor
5bf0: 74 4f 72 64 65 72 20 3d 20 63 6f 6c 6c 54 79 70  tOrder = collTyp
5c00: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 65  e;.}../*.** Come
5c10: 20 75 70 20 77 69 74 68 20 61 20 6e 65 77 20 72   up with a new r
5c20: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 66 6f 72 20  andom value for 
5c30: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
5c40: 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 0a 2a 2a  e.  Make sure.**
5c50: 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69   the new value i
5c60: 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
5c70: 20 74 68 65 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20   the old..**.** 
5c80: 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  The schema cooki
5c90: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
5ca0: 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20  ermine when the 
5cb0: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a  schema for the.*
5cc0: 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  * database chang
5cd0: 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68 20  es.  After each 
5ce0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74  schema change, t
5cf0: 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a  he cookie value.
5d00: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65  ** changes.  Whe
5d10: 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72 73  n a process firs
5d20: 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68 65  t reads the sche
5d30: 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74 68  ma it records th
5d40: 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68  e.** cookie.  Th
5d50: 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76  ereafter, whenev
5d60: 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63  er it goes to ac
5d70: 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
5d80: 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20  e,.** it checks 
5d90: 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61  the cookie to ma
5da0: 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68 65  ke sure the sche
5db0: 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  ma has not chang
5dc0: 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77  ed.** since it w
5dd0: 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a  as last read..**
5de0: 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73  .** This plan is
5df0: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
5e00: 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49  bullet-proof.  I
5e10: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
5e20: 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20  r.** the schema 
5e30: 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70  to change multip
5e40: 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72  le times and for
5e50: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62   the cookie to b
5e60: 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f  e.** set back to
5e70: 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42   prior value.  B
5e80: 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ut schema change
5e90: 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74  s are infrequent
5ea0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62  .** and the prob
5eb0: 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69  ability of hitti
5ec0: 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b  ng the same cook
5ed0: 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79  ie value is only
5ee0: 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20  .** 1 chance in 
5ef0: 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20  2^32.  So we're 
5f00: 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a  safe enough..*/.
5f10: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e  void sqlite3Chan
5f20: 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 20  geCookie(sqlite 
5f30: 2a 64 62 2c 20 56 64 62 65 20 2a 76 29 7b 0a 20  *db, Vdbe *v){. 
5f40: 20 69 66 28 20 64 62 2d 3e 6e 65 78 74 5f 63 6f   if( db->next_co
5f50: 6f 6b 69 65 3d 3d 64 62 2d 3e 61 44 62 5b 30 5d  okie==db->aDb[0]
5f60: 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 29  .schema_cookie )
5f70: 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  {.    unsigned c
5f80: 68 61 72 20 72 3b 0a 20 20 20 20 73 71 6c 69 74  har r;.    sqlit
5f90: 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 31 2c 20  e3Randomness(1, 
5fa0: 26 72 29 3b 0a 20 20 20 20 64 62 2d 3e 6e 65 78  &r);.    db->nex
5fb0: 74 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 61  t_cookie = db->a
5fc0: 44 62 5b 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f  Db[0].schema_coo
5fd0: 6b 69 65 20 2b 20 72 20 2b 20 31 3b 0a 20 20 20  kie + r + 1;.   
5fe0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
5ff0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
6000: 65 73 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  es;.    sqlite3V
6010: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
6020: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 6e 65 78 74  nteger, db->next
6030: 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20  _cookie, 0);.   
6040: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6050: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
6060: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  e, 0, 0);.  }.}.
6070: 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74  ./*.** Measure t
6080: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
6090: 72 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74  racters needed t
60a0: 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76  o output the giv
60b0: 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72  en.** identifier
60c0: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65  .  The number re
60d0: 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20  turned includes 
60e0: 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a  any quotes used.
60f0: 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  ** but does not 
6100: 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c  include the null
6110: 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a   terminator..*/.
6120: 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74  static int ident
6130: 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61  Length(const cha
6140: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  r *z){.  int n;.
6150: 20 20 69 6e 74 20 6e 65 65 64 51 75 6f 74 65 20    int needQuote 
6160: 3d 20 30 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20  = 0;.  for(n=0; 
6170: 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20  *z; n++, z++){. 
6180: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 27 27 20     if( *z=='\'' 
6190: 29 7b 20 6e 2b 2b 3b 20 6e 65 65 64 51 75 6f 74  ){ n++; needQuot
61a0: 65 3d 31 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74  e=1; }.  }.  ret
61b0: 75 72 6e 20 6e 20 2b 20 6e 65 65 64 51 75 6f 74  urn n + needQuot
61c0: 65 2a 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  e*2;.}../*.** Wr
61d0: 69 74 65 20 61 6e 20 69 64 65 6e 74 69 66 69 65  ite an identifie
61e0: 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  r onto the end o
61f0: 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  f the given stri
6200: 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74  ng.  Add.** quot
6210: 65 20 63 68 61 72 61 63 74 65 72 73 20 61 73 20  e characters as 
6220: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
6230: 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28  c void identPut(
6240: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49  char *z, int *pI
6250: 64 78 2c 20 63 68 61 72 20 2a 7a 49 64 65 6e 74  dx, char *zIdent
6260: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e  ){.  int i, j, n
6270: 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20  eedQuote;.  i = 
6280: 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30  *pIdx;.  for(j=0
6290: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
62a0: 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c  ){.    if( !isal
62b0: 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26  num(zIdent[j]) &
62c0: 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27  & zIdent[j]!='_'
62d0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
62e0: 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a 49 64  needQuote =  zId
62f0: 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64  ent[j]!=0 || isd
6300: 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a  igit(zIdent[0]).
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6320: 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77    || sqlite3Keyw
6330: 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20  ordCode(zIdent, 
6340: 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28  j)!=TK_ID;.  if(
6350: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69   needQuote ) z[i
6360: 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 66 6f  ++] = '\'';.  fo
6370: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
6380: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b  ; j++){.    z[i+
6390: 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a  +] = zIdent[j];.
63a0: 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a      if( zIdent[j
63b0: 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b 69 2b 2b 5d  ]=='\'' ) z[i++]
63c0: 20 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a 20 20 69   = '\'';.  }.  i
63d0: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
63e0: 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  [i++] = '\'';.  
63f0: 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64  z[i] = 0;.  *pId
6400: 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x = i;.}../*.** 
6410: 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54  Generate a CREAT
6420: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
6430: 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  t appropriate fo
6440: 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74  r the given.** t
6450: 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f  able.  Memory to
6460: 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f   hold the text o
6470: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
6480: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66  is obtained.** f
6490: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
64a0: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
64b0: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
64c0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
64d0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72  .static char *cr
64e0: 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 54 61  eateTableStmt(Ta
64f0: 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ble *p){.  int i
6500: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , k, n;.  char *
6510: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zStmt;.  char *z
6520: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45  Sep, *zSep2, *zE
6530: 6e 64 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66  nd;.  n = 0;.  f
6540: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
6550: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b  l; i++){.    n +
6560: 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d  = identLength(p-
6570: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  >aCol[i].zName);
6580: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e  .  }.  n += iden
6590: 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65  tLength(p->zName
65a0: 29 3b 0a 20 20 69 66 28 20 6e 3c 34 30 20 29 7b  );.  if( n<40 ){
65b0: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a  .    zSep = "";.
65c0: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b      zSep2 = ",";
65d0: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b  .    zEnd = ")";
65e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53  .  }else{.    zS
65f0: 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20  ep = "\n  ";.   
6600: 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22   zSep2 = ",\n  "
6610: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e  ;.    zEnd = "\n
6620: 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33  )";.  }.  n += 3
6630: 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20  5 + 6*p->nCol;. 
6640: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d   zStmt = sqliteM
6650: 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b 0a 20  allocRaw( n );. 
6660: 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20   if( zStmt==0 ) 
6670: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 74 72 63  return 0;.  strc
6680: 70 79 28 7a 53 74 6d 74 2c 20 70 2d 3e 69 44 62  py(zStmt, p->iDb
6690: 3d 3d 31 20 3f 20 22 43 52 45 41 54 45 20 54 45  ==1 ? "CREATE TE
66a0: 4d 50 20 54 41 42 4c 45 20 22 20 3a 20 22 43 52  MP TABLE " : "CR
66b0: 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20  EATE TABLE ");. 
66c0: 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d   k = strlen(zStm
66d0: 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a  t);.  identPut(z
66e0: 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61  Stmt, &k, p->zNa
66f0: 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b  me);.  zStmt[k++
6700: 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 69  ] = '(';.  for(i
6710: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
6720: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28  ++){.    strcpy(
6730: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29  &zStmt[k], zSep)
6740: 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65  ;.    k += strle
6750: 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20  n(&zStmt[k]);.  
6760: 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a    zSep = zSep2;.
6770: 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74      identPut(zSt
6780: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 61 43 6f 6c 5b  mt, &k, p->aCol[
6790: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
67a0: 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b   strcpy(&zStmt[k
67b0: 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75  ], zEnd);.  retu
67c0: 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a  rn zStmt;.}../*.
67d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
67e0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70  is called to rep
67f0: 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29  ort the final ")
6800: 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65  " that terminate
6810: 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41  s.** a CREATE TA
6820: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
6830: 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73  *.** The table s
6840: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f 74  tructure that ot
6850: 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  her action routi
6860: 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62 75  nes have been bu
6870: 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64  ilding.** is add
6880: 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e  ed to the intern
6890: 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20  al hash tables, 
68a0: 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f  assuming no erro
68b0: 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72  rs have.** occur
68c0: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e  red..**.** An en
68d0: 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c  try for the tabl
68e0: 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65  e is made in the
68f0: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e   master table on
6900: 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a   disk, unless.**
6910: 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
6920: 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62  rary table or db
6930: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20  ->init.busy==1. 
6940: 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62   When db->init.b
6950: 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61  usy==1.** it mea
6960: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
6970: 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
6980: 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73  ter table becaus
6990: 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e  e we just.** con
69a0: 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64 61  nected to the da
69b0: 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75 73  tabase or becaus
69c0: 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
69d0: 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a  ter table has.**
69e0: 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65   recently change
69f0: 73 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20  s, so the entry 
6a00: 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 61  for this table a
6a10: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e  lready exists in
6a20: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  .** the sqlite_m
6a30: 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65  aster table.  We
6a40: 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20   do not want to 
6a50: 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e  create it again.
6a60: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53  .**.** If the pS
6a70: 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69  elect argument i
6a80: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d  s not NULL, it m
6a90: 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 72  eans that this r
6aa0: 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61  outine.** was ca
6ab0: 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
6ac0: 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
6ad0: 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45   from a .** "CRE
6ae0: 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53  ATE TABLE ... AS
6af0: 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61   SELECT ..." sta
6b00: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c  tement.  The col
6b10: 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  umn names of.** 
6b20: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69  the new table wi
6b30: 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65 73  ll match the res
6b40: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
6b50: 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ELECT..*/.void s
6b60: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 50  qlite3EndTable(P
6b70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
6b80: 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65 6c 65 63  ken *pEnd, Selec
6b90: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
6ba0: 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74  able *p;.  sqlit
6bb0: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
6bc0: 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64  db;..  if( (pEnd
6bd0: 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d  ==0 && pSelect==
6be0: 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  0) || pParse->nE
6bf0: 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
6c00: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
6c10: 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72  turn;.  p = pPar
6c20: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
6c30: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
6c40: 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  rn;..  /* If the
6c50: 20 74 61 62 6c 65 20 69 73 20 67 65 6e 65 72 61   table is genera
6c60: 74 65 64 20 66 72 6f 6d 20 61 20 53 45 4c 45 43  ted from a SELEC
6c70: 54 2c 20 74 68 65 6e 20 63 6f 6e 73 74 72 75 63  T, then construc
6c80: 74 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 20  t the.  ** list 
6c90: 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74  of columns and t
6ca0: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 74  he text of the t
6cb0: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
6cc0: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
6cd0: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 20 3d  Table *pSelTab =
6ce0: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
6cf0: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
6d00: 2c 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  , 0, pSelect);. 
6d10: 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d     if( pSelTab==
6d20: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
6d30: 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d  assert( p->aCol=
6d40: 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f  =0 );.    p->nCo
6d50: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
6d60: 6c 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d  l;.    p->aCol =
6d70: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a   pSelTab->aCol;.
6d80: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f      pSelTab->nCo
6d90: 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54  l = 0;.    pSelT
6da0: 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
6db0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
6dc0: 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29  able(0, pSelTab)
6dd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
6de0: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  he db->init.busy
6df0: 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77   is 1 it means w
6e00: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
6e10: 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20  e SQL off the.  
6e20: 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65  ** "sqlite_maste
6e30: 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65  r" or "sqlite_te
6e40: 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65  mp_master" table
6e50: 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20   on the disk..  
6e60: 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69  ** So do not wri
6e70: 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  te to the disk a
6e80: 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74  gain.  Extract t
6e90: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
6ea0: 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ber.  ** for the
6eb0: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
6ec0: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
6ed0: 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61   field.  (The pa
6ee0: 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73  ge number.  ** s
6ef0: 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
6f00: 70 75 74 20 74 68 65 72 65 20 62 79 20 74 68 65  put there by the
6f10: 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f   sqliteOpenCb ro
6f20: 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69  utine.).  */.  i
6f30: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
6f40: 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20   ){.    p->tnum 
6f50: 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
6f60: 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  um;.  }..  /* If
6f70: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   not initializin
6f80: 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  g, then create a
6f90: 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20   record for the 
6fa0: 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69  new table.  ** i
6fb0: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  n the SQLITE_MAS
6fc0: 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65  TER table of the
6fd0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
6fe0: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20  record number.  
6ff0: 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  ** for the new t
7000: 61 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c  able entry shoul
7010: 64 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20  d already be on 
7020: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a  the stack..  **.
7030: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
7040: 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c  a TEMPORARY tabl
7050: 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74  e, write the ent
7060: 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69  ry into the auxi
7070: 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20  liary.  ** file 
7080: 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20  instead of into 
7090: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
70a0: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  e file..  */.  i
70b0: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
70c0: 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  y ){.    int n;.
70d0: 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20      Vdbe *v;..  
70e0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
70f0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
7100: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
7110: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  urn;.    if( p->
7120: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
7130: 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72      /* A regular
7140: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
7150: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
7160: 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  , OP_CreateTable
7170: 2c 20 30 2c 20 70 2d 3e 69 44 62 2c 20 28 63 68  , 0, p->iDb, (ch
7180: 61 72 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20 50 33  ar*)&p->tnum, P3
7190: 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d  _POINTER);.    }
71a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
71b0: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 73   view */.      s
71c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
71d0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
71e0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
71f0: 70 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20  p->tnum = 0;.   
7200: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7210: 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c  p(v, OP_Pull, 1,
7220: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
7230: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74  VdbeOp3(v, OP_St
7240: 72 69 6e 67 2c 20 30 2c 20 30 2c 20 70 2d 3e 70  ring, 0, 0, p->p
7250: 53 65 6c 65 63 74 3d 3d 30 3f 22 74 61 62 6c 65  Select==0?"table
7260: 22 3a 22 76 69 65 77 22 2c 20 50 33 5f 53 54 41  ":"view", P3_STA
7270: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
7280: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53  3VdbeOp3(v, OP_S
7290: 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20 70 2d 3e  tring, 0, 0, p->
72a0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
72b0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
72c0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
72d0: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  , p->zName, 0);.
72e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
72f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
7300: 34 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  4, 0);.    sqlit
7310: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
7320: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
7330: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
7340: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
7350: 7a 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53  z = createTableS
7360: 74 6d 74 28 70 29 3b 0a 20 20 20 20 20 20 6e 20  tmt(p);.      n 
7370: 3d 20 7a 20 3f 20 73 74 72 6c 65 6e 28 7a 29 20  = z ? strlen(z) 
7380: 3a 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  : 0;.      sqlit
7390: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
73a0: 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  , -1, z, n);.   
73b0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29     sqliteFree(z)
73c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
73d0: 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 21     assert( pEnd!
73e0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  =0 );.      n = 
73f0: 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20  Addr(pEnd->z) - 
7400: 41 64 64 72 28 70 50 61 72 73 65 2d 3e 73 46 69  Addr(pParse->sFi
7410: 72 73 74 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b  rstToken.z) + 1;
7420: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7430: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
7440: 2c 20 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74  , pParse->sFirst
7450: 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a 20 20 20  Token.z, n);.   
7460: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
7470: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
7480: 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b  keRecord, 5, 0);
7490: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
74a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49  AddOp(v, OP_PutI
74b0: 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20  ntKey, 0, 0);.  
74c0: 20 20 69 66 28 20 21 70 2d 3e 69 44 62 20 29 7b    if( !p->iDb ){
74d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
74e0: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
74f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
7500: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
7510: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
7520: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  ;.    if( pSelec
7530: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
7540: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
7550: 50 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e 69 44  P_Integer, p->iD
7560: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  b, 0);.      sql
7570: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
7580: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31   OP_OpenWrite, 1
7590: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
75a0: 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20  se->nTab = 2;.  
75b0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
75c0: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
75d0: 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c  t, SRT_Table, 1,
75e0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 0, 0);.    }
75f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 57  .    sqlite3EndW
7600: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
7610: 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arse);.  }..  /*
7620: 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74   Add the table t
7630: 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o the in-memory 
7640: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
7650: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
7660: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
7670: 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 26 26  e->explain==0 &&
7680: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
7690: 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
76a0: 4f 6c 64 3b 0a 20 20 20 20 46 4b 65 79 20 2a 70  Old;.    FKey *p
76b0: 46 4b 65 79 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  FKey;.    pOld =
76c0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
76d0: 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69  rt(&db->aDb[p->i
76e0: 44 62 5d 2e 74 62 6c 48 61 73 68 2c 20 0a 20 20  Db].tblHash, .  
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7700: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 4e 61            p->zNa
7710: 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e  me, strlen(p->zN
7720: 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20  ame)+1, p);.    
7730: 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20  if( pOld ){.    
7740: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c    assert( p==pOl
7750: 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  d );  /* Malloc 
7760: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
7770: 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65   inside HashInse
7780: 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 72 65  rt() */.      re
7790: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
77a0: 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70 46 4b  for(pFKey=p->pFK
77b0: 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79  ey; pFKey; pFKey
77c0: 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f  =pFKey->pNextFro
77d0: 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54  m){.      int nT
77e0: 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b 65 79  o = strlen(pFKey
77f0: 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20  ->zTo) + 1;.    
7800: 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f    pFKey->pNextTo
7810: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
7820: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69  nd(&db->aDb[p->i
7830: 44 62 5d 2e 61 46 4b 65 79 2c 20 70 46 4b 65 79  Db].aFKey, pFKey
7840: 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20  ->zTo, nTo);.   
7850: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
7860: 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d  sert(&db->aDb[p-
7870: 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 20 70 46 4b  >iDb].aFKey, pFK
7880: 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46  ey->zTo, nTo, pF
7890: 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Key);.    }.    
78a0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
78b0: 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e  e = 0;.    db->n
78c0: 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d  Table++;.    db-
78d0: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
78e0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
78f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
7900: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
7910: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72  is routine in or
7920: 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20  der to create a 
7930: 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64  new VIEW.*/.void
7940: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69   sqlite3CreateVi
7950: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
7960: 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rse,     /* The 
7970: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
7980: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67  */.  Token *pBeg
7990: 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43  in,     /* The C
79a0: 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74  REATE token that
79b0: 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74   begins the stat
79c0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ement */.  Token
79d0: 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 2f 2a   *pName,      /*
79e0: 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
79f0: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
7a00: 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
7a10: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
7a20: 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73     /* A SELECT s
7a30: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69  tatement that wi
7a40: 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
7a50: 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  w view */.  int 
7a60: 69 73 54 65 6d 70 20 20 20 20 20 20 20 20 20 2f  isTemp         /
7a70: 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d  * TRUE for a TEM
7a80: 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 29  PORARY view */.)
7a90: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
7aa0: 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63  int n;.  const c
7ab0: 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20  har *z;.  Token 
7ac0: 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20  sEnd;.  DbFixer 
7ad0: 73 46 69 78 3b 0a 0a 20 20 73 71 6c 69 74 65 33  sFix;..  sqlite3
7ae0: 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73  StartTable(pPars
7af0: 65 2c 20 70 42 65 67 69 6e 2c 20 70 4e 61 6d 65  e, pBegin, pName
7b00: 2c 20 69 73 54 65 6d 70 2c 20 31 29 3b 0a 20 20  , isTemp, 1);.  
7b10: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
7b20: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
7b30: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
7b40: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
7b50: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
7b60: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
7b70: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  n;.  }.  if( sql
7b80: 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
7b90: 78 2c 20 70 50 61 72 73 65 2c 20 70 2d 3e 69 44  x, pParse, p->iD
7ba0: 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65  b, "view", pName
7bb0: 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  ).    && sqlite3
7bc0: 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c  FixSelect(&sFix,
7bd0: 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20   pSelect).  ){. 
7be0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
7bf0: 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b  Delete(pSelect);
7c00: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
7c10: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f  ..  /* Make a co
7c20: 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  py of the entire
7c30: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
7c40: 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
7c50: 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68  he view..  ** Th
7c60: 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c  is will force al
7c70: 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e  l the Expr.token
7c80: 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  .z values to be 
7c90: 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a  dynamically.  **
7ca0: 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65   allocated rathe
7cb0: 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20  r than point to 
7cc0: 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67  the input string
7cd0: 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74   - which means t
7ce0: 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69  hat.  ** they wi
7cf0: 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65 72  ll persist after
7d00: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c   the current sql
7d10: 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c  ite3_exec() call
7d20: 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20   returns..  */. 
7d30: 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71   p->pSelect = sq
7d40: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
7d50: 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74  Select);.  sqlit
7d60: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
7d70: 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 21  Select);.  if( !
7d80: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74  pParse->db->init
7d90: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c  .busy ){.    sql
7da0: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
7db0: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
7dc0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  );.  }..  /* Loc
7dd0: 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
7de0: 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73  he CREATE VIEW s
7df0: 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20  tatement.  Make 
7e00: 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20  sEnd point to.  
7e10: 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f  ** the end..  */
7e20: 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65  .  sEnd = pParse
7e30: 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20  ->sLastToken;.  
7e40: 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30  if( sEnd.z[0]!=0
7e50: 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27   && sEnd.z[0]!='
7e60: 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a  ;' ){.    sEnd.z
7e70: 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a   += sEnd.n;.  }.
7e80: 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20    sEnd.n = 0;.  
7e90: 6e 20 3d 20 28 28 69 6e 74 29 73 45 6e 64 2e 7a  n = ((int)sEnd.z
7ea0: 29 20 2d 20 28 69 6e 74 29 70 42 65 67 69 6e 2d  ) - (int)pBegin-
7eb0: 3e 7a 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e  >z;.  z = pBegin
7ec0: 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e  ->z;.  while( n>
7ed0: 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b  0 && (z[n-1]==';
7ee0: 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e  ' || isspace(z[n
7ef0: 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  -1])) ){ n--; }.
7f00: 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d    sEnd.z = &z[n-
7f10: 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31  1];.  sEnd.n = 1
7f20: 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69  ;..  /* Use sqli
7f30: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f  te3EndTable() to
7f40: 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f   add the view to
7f50: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
7f60: 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ER table */.  sq
7f70: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50  lite3EndTable(pP
7f80: 61 72 73 65 2c 20 26 73 45 6e 64 2c 20 30 29 3b  arse, &sEnd, 0);
7f90: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
7fa0: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74  .** The Table st
7fb0: 72 75 63 74 75 72 65 20 70 54 61 62 6c 65 20 69  ructure pTable i
7fc0: 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e  s really a VIEW.
7fd0: 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61    Fill in the na
7fe0: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f  mes of.** the co
7ff0: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65  lumns of the vie
8000: 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20  w in the pTable 
8010: 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75  structure.  Retu
8020: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  rn the number.**
8030: 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
8040: 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e  an error is seen
8050: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
8060: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
8070: 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69  e->zErrMsg..*/.i
8080: 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  nt sqlite3ViewGe
8090: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72  tColumnNames(Par
80a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
80b0: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 45 78  e *pTable){.  Ex
80c0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
80d0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a    Select *pSel;.
80e0: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
80f0: 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  ;.  int nErr = 0
8100: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
8110: 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70  ble );..  /* A p
8120: 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61  ositive nCol mea
8130: 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e  ns the columns n
8140: 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69  ames for this vi
8150: 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65  ew are.  ** alre
8160: 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a  ady known..  */.
8170: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
8180: 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ol>0 ) return 0;
8190: 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76  ..  /* A negativ
81a0: 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63  e nCol is a spec
81b0: 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69  ial marker meani
81c0: 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63  ng that we are c
81d0: 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72  urrently.  ** tr
81e0: 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20  ying to compute 
81f0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
8200: 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74  .  If we enter t
8210: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
8220: 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65  .  ** a negative
8230: 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20   nCol, it means 
8240: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77  two or more view
8250: 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c  s form a loop, l
8260: 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ike this:.  **. 
8270: 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
8280: 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43  IEW one AS SELEC
8290: 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20  T * FROM two;.  
82a0: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
82b0: 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54  EW two AS SELECT
82c0: 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a   * FROM one;.  *
82d0: 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  *.  ** Actually,
82e0: 20 74 68 69 73 20 65 72 72 6f 72 20 69 73 20 63   this error is c
82f0: 61 75 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79  aught previously
8300: 20 61 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c   and so the foll
8310: 6f 77 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20  owing test.  ** 
8320: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61  should always fa
8330: 69 6c 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c  il.  But we will
8340: 20 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61   leave it in pla
8350: 63 65 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61  ce just to be sa
8360: 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  fe..  */.  if( p
8370: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b  Table->nCol<0 ){
8380: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
8390: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
83a0: 65 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61  ew %s is circula
83b0: 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54  rly defined", pT
83c0: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
83d0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
83e0: 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20  .  /* If we get 
83f0: 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
8400: 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f  ns we need to co
8410: 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20  mpute the table 
8420: 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73  names..  */.  as
8430: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53  sert( pTable->pS
8440: 65 6c 65 63 74 20 29 3b 20 2f 2a 20 49 66 20 6e  elect ); /* If n
8450: 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 70 54 61  Col==0, then pTa
8460: 62 6c 65 20 6d 75 73 74 20 62 65 20 61 20 56 49  ble must be a VI
8470: 45 57 20 2a 2f 0a 20 20 70 53 65 6c 20 3d 20 70  EW */.  pSel = p
8480: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3b 0a  Table->pSelect;.
8490: 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  /* Note that 
84a0: 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
84b0: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
84c0: 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61  lect() will expa
84d0: 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20  nd any.  ** "*" 
84e0: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 69 73  elements in this
84f0: 20 6c 69 73 74 2e 20 20 42 75 74 20 77 65 20 77   list.  But we w
8500: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 72 65 73 74  ill need to rest
8510: 6f 72 65 20 74 68 65 20 6c 69 73 74 0a 20 20 2a  ore the list.  *
8520: 2a 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  * back to its or
8530: 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61  iginal configura
8540: 74 69 6f 6e 20 61 66 74 65 72 77 61 72 64 73 2c  tion afterwards,
8550: 20 73 6f 20 77 65 20 73 61 76 65 20 61 20 63 6f   so we save a co
8560: 70 79 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 6f  py of.  ** the o
8570: 72 69 67 69 6e 61 6c 20 69 6e 20 70 45 4c 69 73  riginal in pELis
8580: 74 2e 0a 20 20 2a 2f 0a 20 20 70 45 4c 69 73 74  t..  */.  pEList
8590: 20 3d 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3b   = pSel->pEList;
85a0: 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20  .  pSel->pEList 
85b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
85c0: 74 44 75 70 28 70 45 4c 69 73 74 29 3b 0a 20 20  tDup(pEList);.  
85d0: 69 66 28 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  if( pSel->pEList
85e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 53 65 6c 2d  ==0 ){.    pSel-
85f0: 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74  >pEList = pEList
8600: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20  ;.    return 1; 
8610: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65   /* Malloc faile
8620: 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 61 62 6c  d */.  }.  pTabl
8630: 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20  e->nCol = -1;.  
8640: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
8650: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
8660: 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53  ct(pParse, 0, pS
8670: 65 6c 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 54  el);.  if( pSelT
8680: 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
8690: 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d  ( pTable->aCol==
86a0: 30 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  0 );.    pTable-
86b0: 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
86c0: 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 6c  >nCol;.    pTabl
86d0: 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->aCol = pSelTa
86e0: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65  b->aCol;.    pSe
86f0: 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  lTab->nCol = 0;.
8700: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
8710: 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  l = 0;.    sqlit
8720: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  e3DeleteTable(0,
8730: 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 44   pSelTab);.    D
8740: 62 53 65 74 50 72 6f 70 65 72 74 79 28 70 50 61  bSetProperty(pPa
8750: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 6c 65 2d  rse->db, pTable-
8760: 3e 69 44 62 2c 20 44 42 5f 55 6e 72 65 73 65 74  >iDb, DB_Unreset
8770: 56 69 65 77 73 29 3b 0a 20 20 7d 65 6c 73 65 7b  Views);.  }else{
8780: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  .    pTable->nCo
8790: 6c 20 3d 20 30 3b 0a 20 20 20 20 6e 45 72 72 2b  l = 0;.    nErr+
87a0: 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  +;.  }.  sqlite3
87b0: 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 70 53 65  SelectUnbind(pSe
87c0: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  l);.  sqlite3Exp
87d0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 53 65 6c  rListDelete(pSel
87e0: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 65  ->pEList);.  pSe
87f0: 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69  l->pEList = pELi
8800: 73 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45 72  st;.  return nEr
8810: 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  r;  .}../*.** Cl
8820: 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
8830: 61 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 56 49  ames from the VI
8840: 45 57 20 70 54 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  EW pTable..**.**
8850: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
8860: 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72   called whenever
8870: 20 61 6e 79 20 6f 74 68 65 72 20 74 61 62 6c 65   any other table
8880: 20 6f 72 20 76 69 65 77 20 69 73 20 6d 6f 64 69   or view is modi
8890: 66 69 65 64 2e 0a 2a 2a 20 54 68 65 20 76 69 65  fied..** The vie
88a0: 77 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68  w passed into th
88b0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
88c0: 20 64 65 70 65 6e 64 20 64 69 72 65 63 74 6c 79   depend directly
88d0: 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 0a 2a   or indirectly.*
88e0: 2a 20 6f 6e 20 74 68 65 20 6d 6f 64 69 66 69 65  * on the modifie
88f0: 64 20 6f 72 20 64 65 6c 65 74 65 64 20 74 61 62  d or deleted tab
8900: 6c 65 20 73 6f 20 77 65 20 6e 65 65 64 20 74 6f  le so we need to
8910: 20 63 6c 65 61 72 20 74 68 65 20 6f 6c 64 20 63   clear the old c
8920: 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d 65 73 20 73  olumn.** names s
8930: 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c  o that they will
8940: 20 62 65 20 72 65 63 6f 6d 70 75 74 65 64 2e 0a   be recomputed..
8950: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
8960: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 43 6f  qliteViewResetCo
8970: 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20  lumnNames(Table 
8980: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20  *pTable){.  int 
8990: 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  i;.  Column *pCo
89a0: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  l;.  assert( pTa
89b0: 62 6c 65 21 3d 30 20 26 26 20 70 54 61 62 6c 65  ble!=0 && pTable
89c0: 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ->pSelect!=0 );.
89d0: 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
89e0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 20 69 3c  pTable->aCol; i<
89f0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b  pTable->nCol; i+
8a00: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
8a10: 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d  sqliteFree(pCol-
8a20: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
8a30: 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 44  iteFree(pCol->zD
8a40: 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  flt);.    sqlite
8a50: 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65  Free(pCol->zType
8a60: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
8a70: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
8a80: 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f  );.  pTable->aCo
8a90: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  l = 0;.  pTable-
8aa0: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  >nCol = 0;.}../*
8ab0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f  .** Clear the co
8ac0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
8ad0: 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61  every VIEW in da
8ae0: 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73  tabase idx..*/.s
8af0: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
8b00: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71  eViewResetAll(sq
8b10: 6c 69 74 65 20 2a 64 62 2c 20 69 6e 74 20 69 64  lite *db, int id
8b20: 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  x){.  HashElem *
8b30: 69 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50  i;.  if( !DbHasP
8b40: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
8b50: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
8b60: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  ) ) return;.  fo
8b70: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
8b80: 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78  rst(&db->aDb[idx
8b90: 5d 2e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69  ].tblHash); i; i
8ba0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
8bb0: 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  i)){.    Table *
8bc0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
8bd0: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
8be0: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
8bf0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
8c00: 69 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61  iewResetColumnNa
8c10: 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d  mes(pTab);.    }
8c20: 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72  .  }.  DbClearPr
8c30: 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20  operty(db, idx, 
8c40: 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
8c50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
8c60: 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75   a token, look u
8c70: 70 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  p a table with t
8c80: 68 61 74 20 6e 61 6d 65 2e 20 20 49 66 20 6e 6f  hat name.  If no
8c90: 74 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65 0a 2a  t found, leave.*
8ca0: 2a 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 74  * an error for t
8cb0: 68 65 20 70 61 72 73 65 72 20 74 6f 20 66 69 6e  he parser to fin
8cc0: 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  d and return NUL
8cd0: 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  L..*/.Table *sql
8ce0: 69 74 65 33 54 61 62 6c 65 46 72 6f 6d 54 6f 6b  ite3TableFromTok
8cf0: 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  en(Parse *pParse
8d00: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a  , Token *pTok){.
8d10: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
8d20: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
8d30: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 54  zName = sqlite3T
8d40: 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ableNameFromToke
8d50: 6e 28 70 54 6f 6b 29 3b 0a 20 20 69 66 28 20 7a  n(pTok);.  if( z
8d60: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
8d70: 20 30 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c   0;.  pTab = sql
8d80: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50  ite3FindTable(pP
8d90: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  arse->db, zName,
8da0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65   0);.  sqliteFre
8db0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  e(zName);.  if( 
8dc0: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pTab==0 ){.    s
8dd0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8de0: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
8df0: 74 61 62 6c 65 3a 20 25 54 22 2c 20 70 54 6f 6b  table: %T", pTok
8e00: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
8e10: 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pTab;.}../*.** T
8e20: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
8e30: 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20  alled to do the 
8e40: 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54  work of a DROP T
8e50: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
8e60: 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  ** pName is the 
8e70: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
8e80: 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e  e to be dropped.
8e90: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8ea0: 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
8eb0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
8ec0: 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65  pName, int isVie
8ed0: 77 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  w){.  Table *pTa
8ee0: 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  ble;.  Vdbe *v;.
8ef0: 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 73 71    int base;.  sq
8f00: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
8f10: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
8f20: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
8f30: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
8f40: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
8f50: 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 61 62 6c   return;.  pTabl
8f60: 65 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65  e = sqlite3Table
8f70: 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
8f80: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
8f90: 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75  pTable==0 ) retu
8fa0: 72 6e 3b 0a 20 20 69 44 62 20 3d 20 70 54 61 62  rn;.  iDb = pTab
8fb0: 6c 65 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65 72  le->iDb;.  asser
8fc0: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
8fd0: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 23 69 66 6e  <db->nDb );.#ifn
8fe0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8ff0: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
9000: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  {.    int code;.
9010: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
9020: 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
9030: 42 4c 45 28 70 54 61 62 6c 65 2d 3e 69 44 62 29  BLE(pTable->iDb)
9040: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
9050: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
9060: 70 54 61 62 6c 65 2d 3e 69 44 62 5d 2e 7a 4e 61  pTable->iDb].zNa
9070: 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
9080: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
9090: 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
90a0: 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
90b0: 29 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  )){.      return
90c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
90d0: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
90e0: 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20  if( iDb==1 ){.  
90f0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
9100: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49  ITE_DROP_TEMP_VI
9110: 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EW;.      }else{
9120: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
9130: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57  SQLITE_DROP_VIEW
9140: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
9150: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69  lse{.      if( i
9160: 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
9170: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
9180: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ROP_TEMP_TABLE;.
9190: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
91a0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
91b0: 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20  TE_DROP_TABLE;. 
91c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
91d0: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
91e0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
91f0: 64 65 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  de, pTable->zNam
9200: 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
9210: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
9220: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
9230: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
9240: 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
9250: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c  , pTable->zName,
9260: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
9270: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
9280: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
9290: 20 70 54 61 62 6c 65 2d 3e 72 65 61 64 4f 6e 6c   pTable->readOnl
92a0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
92b0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
92c0: 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
92d0: 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
92e0: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
92f0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
9300: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
9310: 20 20 7d 0a 20 20 69 66 28 20 69 73 56 69 65 77    }.  if( isView
9320: 20 26 26 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c   && pTable->pSel
9330: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
9340: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9350: 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
9360: 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20  TABLE to delete 
9370: 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 6c  table %s", pTabl
9380: 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  e->zName);.    r
9390: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
93a0: 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62   !isView && pTab
93b0: 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  le->pSelect ){. 
93c0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
93d0: 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
93e0: 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c  DROP VIEW to del
93f0: 65 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54  ete view %s", pT
9400: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
9410: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
9420: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
9430: 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
9440: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d  table from the m
9450: 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a  aster table.  **
9460: 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
9470: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
9480: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
9490: 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74  f( v ){.    stat
94a0: 69 63 20 56 64 62 65 4f 70 4c 69 73 74 20 64 72  ic VdbeOpList dr
94b0: 6f 70 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20  opTable[] = {.  
94c0: 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c      { OP_Rewind,
94d0: 20 20 20 20 20 30 2c 20 41 44 44 52 28 31 30 29       0, ADDR(10)
94e0: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
94f0: 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20  _String,     0, 
9500: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a  0,        0}, /*
9510: 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   1 */.      { OP
9520: 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20  _MemStore,   1, 
9530: 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  1,        0},.  
9540: 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64      { OP_MemLoad
9550: 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
9560: 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20    0}, /* 3 */.  
9570: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
9580: 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20       0, 2,      
9590: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
95a0: 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 30 2c 20  _Ne,         0, 
95b0: 41 44 44 52 28 39 29 2c 20 20 30 7d 2c 0a 20 20  ADDR(9),  0},.  
95c0: 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c      { OP_Delete,
95d0: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
95e0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
95f0: 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20  _Rewind,     0, 
9600: 41 44 44 52 28 31 30 29 2c 20 30 7d 2c 0a 20 20  ADDR(10), 0},.  
9610: 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20      { OP_Goto,  
9620: 20 20 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c       0, ADDR(3),
9630: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
9640: 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20  _Next,       0, 
9650: 41 44 44 52 28 33 29 2c 20 20 30 7d 2c 20 2f 2a  ADDR(3),  0}, /*
9660: 20 39 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20   9 */.    };.   
9670: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
9680: 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
9690: 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ger;.    sqlite3
96a0: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
96b0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ion(pParse, 0, p
96c0: 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 0a 20 20  Table->iDb);..  
96d0: 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72    /* Drop all tr
96e0: 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65  iggers associate
96f0: 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
9700: 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 2a   being dropped *
9710: 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d  /.    pTrigger =
9720: 20 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65   pTable->pTrigge
9730: 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54  r;.    while( pT
9740: 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20  rigger ){.      
9750: 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
9760: 2d 3e 69 44 62 3d 3d 70 54 61 62 6c 65 2d 3e 69  ->iDb==pTable->i
9770: 44 62 20 7c 7c 20 70 54 72 69 67 67 65 72 2d 3e  Db || pTrigger->
9780: 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  iDb==1 );.      
9790: 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67  sqlite3DropTrigg
97a0: 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70 54  erPtr(pParse, pT
97b0: 72 69 67 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  rigger, 1);.    
97c0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
97d0: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20  plain ){.       
97e0: 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69   pTrigger = pTri
97f0: 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  gger->pNext;.   
9800: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9810: 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 61    pTrigger = pTa
9820: 62 6c 65 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20  ble->pTrigger;. 
9830: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
9840: 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51    /* Drop all SQ
9850: 4c 49 54 45 5f 4d 41 53 54 45 52 20 65 6e 74 72  LITE_MASTER entr
9860: 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74  ies that refer t
9870: 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  o the table */. 
9880: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61     sqlite3OpenMa
9890: 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70 54 61  sterTable(v, pTa
98a0: 62 6c 65 2d 3e 69 44 62 29 3b 0a 20 20 20 20 62  ble->iDb);.    b
98b0: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ase = sqlite3Vdb
98c0: 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
98d0: 72 61 79 53 69 7a 65 28 64 72 6f 70 54 61 62 6c  raySize(dropTabl
98e0: 65 29 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a  e), dropTable);.
98f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
9900: 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b  hangeP3(v, base+
9910: 31 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  1, pTable->zName
9920: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72  , 0);..    /* Dr
9930: 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 54 45  op all SQLITE_TE
9940: 4d 50 5f 4d 41 53 54 45 52 20 65 6e 74 72 69 65  MP_MASTER entrie
9950: 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
9960: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
9970: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 69 44 62   if( pTable->iDb
9980: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=1 ){.      sql
9990: 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61  ite3OpenMasterTa
99a0: 62 6c 65 28 76 2c 20 31 29 3b 0a 20 20 20 20 20  ble(v, 1);.     
99b0: 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56   base = sqlite3V
99c0: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
99d0: 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70 54 61  ArraySize(dropTa
99e0: 62 6c 65 29 2c 20 64 72 6f 70 54 61 62 6c 65 29  ble), dropTable)
99f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9a00: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62  dbeChangeP3(v, b
9a10: 61 73 65 2b 31 2c 20 70 54 61 62 6c 65 2d 3e 7a  ase+1, pTable->z
9a20: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Name, 0);.    }.
9a30: 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d  .    if( pTable-
9a40: 3e 69 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >iDb==0 ){.     
9a50: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
9a60: 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a 20 20 20  okie(db, v);.   
9a70: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
9a80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
9a90: 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ose, 0, 0);.    
9aa0: 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20  if( !isView ){. 
9ab0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9ac0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74  AddOp(v, OP_Dest
9ad0: 72 6f 79 2c 20 70 54 61 62 6c 65 2d 3e 74 6e 75  roy, pTable->tnu
9ae0: 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b  m, pTable->iDb);
9af0: 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d  .      for(pIdx=
9b00: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
9b10: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
9b20: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
9b30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9b40: 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c  p(v, OP_Destroy,
9b50: 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 49 64   pIdx->tnum, pId
9b60: 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 7d  x->iDb);.      }
9b70: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9b80: 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  e3EndWriteOperat
9b90: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  ion(pParse);.  }
9ba0: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
9bb0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 63  e in-memory desc
9bc0: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  ription of the t
9bd0: 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
9be0: 45 78 63 65 70 74 69 6f 6e 3a 20 69 66 20 74 68  Exception: if th
9bf0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
9c00: 62 65 67 61 6e 20 77 69 74 68 20 74 68 65 20 45  began with the E
9c10: 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 2c 0a  XPLAIN keyword,.
9c20: 20 20 2a 2a 20 74 68 65 6e 20 6e 6f 20 63 68 61    ** then no cha
9c30: 6e 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 6d  nges should be m
9c40: 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ade..  */.  if( 
9c50: 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
9c60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e   ){.    sqliteUn
9c70: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62  linkAndDeleteTab
9c80: 6c 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  le(db, pTable);.
9c90: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
9ca0: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
9cb0: 61 6e 67 65 73 3b 0a 20 20 7d 0a 20 20 73 71 6c  anges;.  }.  sql
9cc0: 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
9cd0: 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  db, iDb);.}../*.
9ce0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9cf0: 63 6f 6e 73 74 72 75 63 74 73 20 61 20 50 33 20  constructs a P3 
9d00: 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20  string suitable 
9d10: 66 6f 72 20 61 6e 20 4f 50 5f 4d 61 6b 65 49 64  for an OP_MakeId
9d20: 78 4b 65 79 0a 2a 2a 20 6f 70 63 6f 64 65 20 61  xKey.** opcode a
9d30: 6e 64 20 61 64 64 73 20 74 68 61 74 20 50 33 20  nd adds that P3 
9d40: 73 74 72 69 6e 67 20 74 6f 20 74 68 65 20 6d 6f  string to the mo
9d50: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
9d60: 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  rted instruction
9d70: 0a 2a 2a 20 69 6e 20 74 68 65 20 76 69 72 74 75  .** in the virtu
9d80: 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 65  al machine.  The
9d90: 20 50 33 20 73 74 72 69 6e 67 20 63 6f 6e 73 69   P3 string consi
9da0: 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  sts of a single 
9db0: 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 66 6f 72  character.** for
9dc0: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20   each column in 
9dd0: 74 68 65 20 69 6e 64 65 78 20 70 49 64 78 20 6f  the index pIdx o
9de0: 66 20 74 61 62 6c 65 20 70 54 61 62 2e 20 20 49  f table pTab.  I
9df0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 75 73 65  f the column use
9e00: 73 0a 2a 2a 20 61 20 6e 75 6d 65 72 69 63 20 73  s.** a numeric s
9e10: 6f 72 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20  ort order, then 
9e20: 74 68 65 20 50 33 20 73 74 72 69 6e 67 20 63 68  the P3 string ch
9e30: 61 72 61 63 74 65 72 20 63 6f 72 72 65 73 70 6f  aracter correspo
9e40: 6e 64 69 6e 67 20 74 6f 0a 2a 2a 20 74 68 61 74  nding to.** that
9e50: 20 63 6f 6c 75 6d 6e 20 69 73 20 27 6e 27 2e 20   column is 'n'. 
9e60: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 75   If the column u
9e70: 73 65 73 20 61 20 74 65 78 74 20 73 6f 72 74 20  ses a text sort 
9e80: 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68 65 0a  order, then the.
9e90: 2a 2a 20 50 33 20 73 74 72 69 6e 67 20 69 73 20  ** P3 string is 
9ea0: 27 74 27 2e 20 20 53 65 65 20 74 68 65 20 4f 50  't'.  See the OP
9eb0: 5f 4d 61 6b 65 49 64 78 4b 65 79 20 6f 70 63 6f  _MakeIdxKey opco
9ec0: 64 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  de documentation
9ed0: 20 66 6f 72 0a 2a 2a 20 61 64 64 69 74 69 6f 6e   for.** addition
9ee0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  al information. 
9ef0: 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 73 71   See also the sq
9f00: 6c 69 74 65 33 41 64 64 4b 65 79 54 79 70 65 28  lite3AddKeyType(
9f10: 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f  ) routine..*/.vo
9f20: 69 64 20 73 71 6c 69 74 65 33 41 64 64 49 64 78  id sqlite3AddIdx
9f30: 4b 65 79 54 79 70 65 28 56 64 62 65 20 2a 76 2c  KeyType(Vdbe *v,
9f40: 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20   Index *pIdx){. 
9f50: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20   char *zType;.  
9f60: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69  Table *pTab;.  i
9f70: 6e 74 20 69 2c 20 6e 3b 0a 20 20 61 73 73 65 72  nt i, n;.  asser
9f80: 74 28 20 70 49 64 78 21 3d 30 20 26 26 20 70 49  t( pIdx!=0 && pI
9f90: 64 78 2d 3e 70 54 61 62 6c 65 21 3d 30 20 29 3b  dx->pTable!=0 );
9fa0: 0a 20 20 70 54 61 62 20 3d 20 70 49 64 78 2d 3e  .  pTab = pIdx->
9fb0: 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 70 49  pTable;.  n = pI
9fc0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7a  dx->nColumn;.  z
9fd0: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Type = sqliteMal
9fe0: 6c 6f 63 52 61 77 28 20 6e 2b 31 20 29 3b 0a 20  locRaw( n+1 );. 
9ff0: 20 69 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20   if( zType==0 ) 
a000: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
a010: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
a020: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64    int iCol = pId
a030: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  x->aiColumn[i];.
a040: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
a050: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
a060: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 69 66  ->nCol );.    if
a070: 28 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  ( (pTab->aCol[iC
a080: 6f 6c 5d 2e 73 6f 72 74 4f 72 64 65 72 20 26 20  ol].sortOrder & 
a090: 53 51 4c 49 54 45 5f 53 4f 5f 54 59 50 45 4d 41  SQLITE_SO_TYPEMA
a0a0: 53 4b 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54  SK)==SQLITE_SO_T
a0b0: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  EXT ){.      zTy
a0c0: 70 65 5b 69 5d 20 3d 20 27 74 27 3b 0a 20 20 20  pe[i] = 't';.   
a0d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 54   }else{.      zT
a0e0: 79 70 65 5b 69 5d 20 3d 20 27 6e 27 3b 0a 20 20  ype[i] = 'n';.  
a0f0: 20 20 7d 0a 20 20 7d 0a 20 20 7a 54 79 70 65 5b    }.  }.  zType[
a100: 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  n] = 0;.  sqlite
a110: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
a120: 20 2d 31 2c 20 7a 54 79 70 65 2c 20 6e 29 3b 0a   -1, zType, n);.
a130: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 79    sqliteFree(zTy
a140: 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  pe);.}../*.** Th
a150: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
a160: 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
a170: 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79   new foreign key
a180: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a   on the table.**
a190: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
a1a0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
a1b0: 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69  pFromCol determi
a1c0: 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e  nes which column
a1d0: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72  s.** in the curr
a1e0: 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20  ent table point 
a1f0: 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  to the foreign k
a200: 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c  ey.  If pFromCol
a210: 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e  ==0 then.** conn
a220: 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74  ect the key to t
a230: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69  he last column i
a240: 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73  nserted.  pTo is
a250: 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20   the name of.** 
a260: 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72  the table referr
a270: 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69  ed to.  pToCol i
a280: 73 20 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c  s a list of tabl
a290: 65 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 0a  es in the other.
a2a0: 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20 74 68 61  ** pTo table tha
a2b0: 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  t the foreign ke
a2c0: 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c  y points to.  fl
a2d0: 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ags contains all
a2e0: 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
a2f0: 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69  about the confli
a300: 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
a310: 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69  gorithms specifi
a320: 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20  ed.** in the ON 
a330: 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54  DELETE, ON UPDAT
a340: 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20  E and ON INSERT 
a350: 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  clauses..**.** A
a360: 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65  n FKey structure
a370: 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
a380: 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
a390: 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  le currently.** 
a3a0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
a3b0: 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  on in the pParse
a3c0: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c  ->pNewTable fiel
a3d0: 64 2e 20 20 54 68 65 20 6e 65 77 20 46 4b 65 79  d.  The new FKey
a3e0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e 6b 65  .** is not linke
a3f0: 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b 65 79  d into db->aFKey
a400: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 2d   at this point -
a410: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 68   that does not h
a420: 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73  appen.** until s
a430: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
a440: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65  ..**.** The fore
a450: 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66  ign key is set f
a460: 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f  or IMMEDIATE pro
a470: 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73  cessing.  A subs
a480: 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74  equent call.** t
a490: 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f  o sqlite3DeferFo
a4a0: 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74  reignKey() might
a4b0: 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20   change this to 
a4c0: 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69  DEFERRED..*/.voi
a4d0: 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  d sqlite3CreateF
a4e0: 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72  oreignKey(.  Par
a4f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
a500: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
a510: 74 65 78 74 20 2a 2f 0a 20 20 49 64 4c 69 73 74  text */.  IdList
a520: 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 20 20 2f   *pFromCol,    /
a530: 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69  * Columns in thi
a540: 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69  s table that poi
a550: 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c  nt to other tabl
a560: 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  e */.  Token *pT
a570: 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  o,          /* N
a580: 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72  ame of the other
a590: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 64 4c 69   table */.  IdLi
a5a0: 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 20  st *pToCol,     
a5b0: 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
a5c0: 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
a5d0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
a5e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
a5f0: 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
a600: 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29  algorithms. */.)
a610: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70  {.  Table *p = p
a620: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
a630: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
a640: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43   int i;.  int nC
a650: 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  ol;.  char *z;. 
a660: 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30   FKey *pFKey = 0
a670: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  ;..  assert( pTo
a680: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
a690: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
a6a0: 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  r ) goto fk_end;
a6b0: 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
a6c0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  =0 ){.    int iC
a6d0: 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  ol = p->nCol-1;.
a6e0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
a6f0: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
a700: 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20    if( pToCol && 
a710: 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 31 20 29  pToCol->nId!=1 )
a720: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
a730: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
a740: 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20  "foreign key on 
a750: 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20 73  %s".         " s
a760: 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20  hould reference 
a770: 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20  only one column 
a780: 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20  of table %T",.  
a790: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69         p->aCol[i
a7a0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29  Col].zName, pTo)
a7b0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ;.      goto fk_
a7c0: 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  end;.    }.    n
a7d0: 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Col = 1;.  }else
a7e0: 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70   if( pToCol && p
a7f0: 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 70 46 72 6f  ToCol->nId!=pFro
a800: 6d 43 6f 6c 2d 3e 6e 49 64 20 29 7b 0a 20 20 20  mCol->nId ){.   
a810: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
a820: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
a830: 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75   "number of colu
a840: 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  mns in foreign k
a850: 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ey does not matc
a860: 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  h the number of 
a870: 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d  ".        "colum
a880: 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65  ns in the refere
a890: 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20  nced table");.  
a8a0: 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
a8b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c   }else{.    nCol
a8c0: 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 49 64   = pFromCol->nId
a8d0: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
a8e0: 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b  sizeof(*pFKey) +
a8f0: 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46 4b   nCol*sizeof(pFK
a900: 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70  ey->aCol[0]) + p
a910: 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28  To->n + 1;.  if(
a920: 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
a930: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c  or(i=0; i<pToCol
a940: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
a950: 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c     nByte += strl
a960: 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  en(pToCol->a[i].
a970: 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  zName) + 1;.    
a980: 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20  }.  }.  pFKey = 
a990: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42  sqliteMalloc( nB
a9a0: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b  yte );.  if( pFK
a9b0: 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b 5f  ey==0 ) goto fk_
a9c0: 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 46  end;.  pFKey->pF
a9d0: 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79  rom = p;.  pFKey
a9e0: 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d  ->pNextFrom = p-
a9f0: 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63  >pFKey;.  z = (c
aa00: 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a  har*)&pFKey[1];.
aa10: 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20    pFKey->aCol = 
aa20: 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a  (struct sColMap*
aa30: 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f  )z;.  z += sizeo
aa40: 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70  f(struct sColMap
aa50: 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d  )*nCol;.  pFKey-
aa60: 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63  >zTo = z;.  memc
aa70: 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54  py(z, pTo->z, pT
aa80: 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e  o->n);.  z[pTo->
aa90: 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70  n] = 0;.  z += p
aaa0: 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79  To->n+1;.  pFKey
aab0: 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20  ->pNextTo = 0;. 
aac0: 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e   pFKey->nCol = n
aad0: 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  Col;.  if( pFrom
aae0: 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  Col==0 ){.    pF
aaf0: 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72  Key->aCol[0].iFr
ab00: 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  om = p->nCol-1;.
ab10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
ab20: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
ab30: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  +){.      int j;
ab40: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
ab50: 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  j<p->nCol; j++){
ab60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
ab70: 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61  ite3StrICmp(p->a
ab80: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46  Col[j].zName, pF
ab90: 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
aba0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
abb0: 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
abc0: 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20  i].iFrom = j;.  
abd0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
abe0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
abf0: 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d  .      if( j>=p-
ac00: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
ac10: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
ac20: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
ac30: 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c      "unknown col
ac40: 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f  umn \"%s\" in fo
ac50: 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
ac60: 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  tion", .        
ac70: 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d    pFromCol->a[i]
ac80: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
ac90: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
aca0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
acb0: 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
acc0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
acd0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
ace0: 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28   int n = strlen(
acf0: 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
ad00: 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79  me);.      pFKey
ad10: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d  ->aCol[i].zCol =
ad20: 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   z;.      memcpy
ad30: 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  (z, pToCol->a[i]
ad40: 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  .zName, n);.    
ad50: 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20    z[n] = 0;.    
ad60: 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20    z += n+1;.    
ad70: 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69  }.  }.  pFKey->i
ad80: 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20  sDeferred = 0;. 
ad90: 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f   pFKey->deleteCo
ada0: 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66  nf = flags & 0xf
adb0: 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61  f;.  pFKey->upda
adc0: 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20  teConf = (flags 
add0: 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20  >> 8 ) & 0xff;. 
ade0: 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f   pFKey->insertCo
adf0: 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31  nf = (flags >> 1
ae00: 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f  6 ) & 0xff;..  /
ae10: 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69  * Link the forei
ae20: 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61  gn key to the ta
ae30: 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20  ble as the last 
ae40: 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  step..  */.  p->
ae50: 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20  pFKey = pFKey;. 
ae60: 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f   pFKey = 0;..fk_
ae70: 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46 72 65  end:.  sqliteFre
ae80: 65 28 70 46 4b 65 79 29 3b 0a 20 20 73 71 6c 69  e(pFKey);.  sqli
ae90: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
aea0: 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c  pFromCol);.  sql
aeb0: 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
aec0: 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  (pToCol);.}../*.
aed0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
aee0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
aef0: 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  n INITIALLY IMME
af00: 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c  DIATE or INITIAL
af10: 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63  LY DEFERRED.** c
af20: 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73  lause is seen as
af30: 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69   part of a forei
af40: 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
af50: 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72  n.  The isDeferr
af60: 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  ed.** parameter 
af70: 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c  is 1 for INITIAL
af80: 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20  LY DEFERRED and 
af90: 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  0 for INITIALLY 
afa0: 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68  IMMEDIATE..** Th
afb0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68  e behavior of th
afc0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
afd0: 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20  created foreign 
afe0: 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a  key is adjusted.
aff0: 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  ** accordingly..
b000: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
b010: 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50  eferForeignKey(P
b020: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
b030: 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 20  t isDeferred){. 
b040: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
b050: 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69  FKey *pFKey;.  i
b060: 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73  f( (pTab = pPars
b070: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
b080: 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61   || (pFKey = pTa
b090: 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72  b->pFKey)==0 ) r
b0a0: 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e  eturn;.  pFKey->
b0b0: 69 73 44 65 66 65 72 72 65 64 20 3d 20 69 73 44  isDeferred = isD
b0c0: 65 66 65 72 72 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  eferred;.}../*.*
b0d0: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69  * Create a new i
b0e0: 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20  ndex for an SQL 
b0f0: 74 61 62 6c 65 2e 20 20 70 49 6e 64 65 78 20 69  table.  pIndex i
b100: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
b110: 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20  e index .** and 
b120: 70 54 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61  pTable is the na
b130: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
b140: 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
b150: 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c  dexed.  Both wil
b160: 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f  l .** be NULL fo
b170: 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  r a primary key 
b180: 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  or an index that
b190: 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20 73   is created to s
b1a0: 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51  atisfy a.** UNIQ
b1b0: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
b1c0: 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49  If pTable and pI
b1d0: 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75  ndex are NULL, u
b1e0: 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
b1f0: 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74  able.** as the t
b200: 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
b210: 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  ed.  pParse->pNe
b220: 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c  wTable is a tabl
b230: 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72  e that is.** cur
b240: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
b250: 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43 52  structed by a CR
b260: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
b270: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  ment..**.** pLis
b280: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63  t is a list of c
b290: 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
b2a0: 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c  exed.  pList wil
b2b0: 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69  l be NULL if thi
b2c0: 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72  s.** is a primar
b2d0: 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d  y key or unique-
b2e0: 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68  constraint on th
b2f0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f  e most recent co
b300: 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f  lumn added.** to
b310: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
b320: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
b330: 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f  ruction.  .*/.vo
b340: 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
b350: 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
b360: 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 41 6c 6c  pParse,   /* All
b370: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
b380: 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f  ut this parse */
b390: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
b3a0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
b3b0: 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 79 20 62  he index.  May b
b3c0: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c  e NULL */.  SrcL
b3d0: 69 73 74 20 2a 70 54 61 62 6c 65 2c 20 2f 2a 20  ist *pTable, /* 
b3e0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
b3f0: 65 20 74 6f 20 69 6e 64 65 78 2e 20 20 55 73 65  e to index.  Use
b400: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
b410: 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 49 64 4c  le if 0 */.  IdL
b420: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
b430: 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   A list of colum
b440: 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
b450: 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
b460: 72 2c 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f  r,     /* OE_Abo
b470: 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f  rt, OE_Ignore, O
b480: 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45  E_Replace, or OE
b490: 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  _None */.  Token
b4a0: 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20 54   *pStart,   /* T
b4b0: 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20  he CREATE token 
b4c0: 74 68 61 74 20 62 65 67 69 6e 73 20 61 20 43 52  that begins a CR
b4d0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
b4e0: 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
b4f0: 2a 70 45 6e 64 20 20 20 20 20 20 2f 2a 20 54 68  *pEnd      /* Th
b500: 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65  e ")" that close
b510: 73 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44  s the CREATE IND
b520: 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EX statement */.
b530: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
b540: 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74  ;     /* Table t
b550: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
b560: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
b570: 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
b580: 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f  to be created */
b590: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
b5a0: 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   0;.  int i, j;.
b5b0: 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20    Token nullId; 
b5c0: 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e     /* Fake token
b5d0: 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44   for an empty ID
b5e0: 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46 69 78   list */.  DbFix
b5f0: 65 72 20 73 46 69 78 3b 20 20 20 20 2f 2a 20 46  er sFix;    /* F
b600: 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74  or assigning dat
b610: 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70  abase names to p
b620: 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  Table */.  int i
b630: 73 54 65 6d 70 3b 20 20 20 20 20 20 2f 2a 20 54  sTemp;      /* T
b640: 72 75 65 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  rue for a tempor
b650: 61 72 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 73  ary index */.  s
b660: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
b670: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
b680: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
b690: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
b6a0: 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74  iled ) goto exit
b6b0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
b6c0: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
b6d0: 73 79 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69  sy .     && sqli
b6e0: 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
b6f0: 2c 20 70 50 61 72 73 65 2c 20 64 62 2d 3e 69 6e  , pParse, db->in
b700: 69 74 2e 69 44 62 2c 20 22 69 6e 64 65 78 22 2c  it.iDb, "index",
b710: 20 70 4e 61 6d 65 29 0a 20 20 20 20 20 26 26 20   pName).     && 
b720: 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
b730: 74 28 26 73 46 69 78 2c 20 70 54 61 62 6c 65 29  t(&sFix, pTable)
b740: 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  .  ){.    goto e
b750: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
b760: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
b770: 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   Find the table 
b780: 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
b790: 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65  dexed.  Return e
b7a0: 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e  arly if not foun
b7b0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  d..  */.  if( pT
b7c0: 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 61  able!=0 ){.    a
b7d0: 73 73 65 72 74 28 20 70 4e 61 6d 65 21 3d 30 20  ssert( pName!=0 
b7e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
b7f0: 54 61 62 6c 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  Table->nSrc==1 )
b800: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20 73 71  ;.    pTab =  sq
b810: 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b  lite3SrcListLook
b820: 75 70 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c  up(pParse, pTabl
b830: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
b840: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d   assert( pName==
b850: 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  0 );.    pTab = 
b860: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
b870: 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54  le;.  }.  if( pT
b880: 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  ab==0 || pParse-
b890: 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69  >nErr ) goto exi
b8a0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
b8b0: 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64    if( pTab->read
b8c0: 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  Only ){.    sqli
b8d0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
b8e0: 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
b8f0: 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
b900: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
b910: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
b920: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
b930: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69 44 62  .  if( pTab->iDb
b940: 3e 3d 32 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  >=2 && db->init.
b950: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73  busy==0 ){.    s
b960: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
b970: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
b980: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 69 6e   may not have in
b990: 64 69 63 65 73 20 61 64 64 65 64 22 2c 20 70 54  dices added", pT
b9a0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
b9b0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
b9c0: 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
b9d0: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
b9e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
b9f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
ba00: 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65  views may not be
ba10: 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20   indexed");.    
ba20: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
ba30: 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 73  _index;.  }.  is
ba40: 54 65 6d 70 20 3d 20 70 54 61 62 2d 3e 69 44 62  Temp = pTab->iDb
ba50: 3d 3d 31 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ==1;..  /*.  ** 
ba60: 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  Find the name of
ba70: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b   the index.  Mak
ba80: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
ba90: 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74  not already anot
baa0: 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  her.  ** index o
bab0: 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  r table with the
bac0: 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20   same name.  .  
bad0: 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
bae0: 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65  n:  If we are re
baf0: 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ading the names 
bb00: 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64  of permanent ind
bb10: 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ices from the.  
bb20: 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
bb30: 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20   table (because 
bb40: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
bb50: 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73  ss changed the s
bb60: 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20  chema) and.  ** 
bb70: 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
bb80: 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20   names collides 
bb90: 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
bba0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
bbb0: 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78  le or.  ** index
bbc0: 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63  , then we will c
bbd0: 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65  ontinue to proce
bbe0: 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  ss this index.. 
bbf0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d   **.  ** If pNam
bc00: 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
bc10: 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64  at we are.  ** d
bc20: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72  ealing with a pr
bc30: 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49  imary key or UNI
bc40: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
bc50: 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65   We have to inve
bc60: 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20  nt our.  ** own 
bc70: 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
bc80: 20 70 4e 61 6d 65 20 26 26 20 21 64 62 2d 3e 69   pName && !db->i
bc90: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
bca0: 49 6e 64 65 78 20 2a 70 49 53 61 6d 65 4e 61 6d  Index *pISameNam
bcb0: 65 3b 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72  e;    /* Another
bcc0: 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20   index with the 
bcd0: 73 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  same name */.   
bce0: 20 54 61 62 6c 65 20 2a 70 54 53 61 6d 65 4e 61   Table *pTSameNa
bcf0: 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74 61 62 6c  me;    /* A tabl
bd00: 65 20 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65  e with same name
bd10: 20 61 73 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   as the index */
bd20: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
bd30: 69 74 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65  iteStrNDup(pName
bd40: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a  ->z, pName->n);.
bd50: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
bd60: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
bd70: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
bd80: 66 28 20 28 70 49 53 61 6d 65 4e 61 6d 65 20 3d  f( (pISameName =
bd90: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
bda0: 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29  x(db, zName, 0))
bdb0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
bdc0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
bdd0: 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61  rse, "index %s a
bde0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
bdf0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
be00: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
be10: 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
be20: 69 66 28 20 28 70 54 53 61 6d 65 4e 61 6d 65 20  if( (pTSameName 
be30: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
be40: 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  le(db, zName, 0)
be50: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=0 ){.      sq
be60: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
be70: 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20  arse, "there is 
be80: 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20  already a table 
be90: 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
bea0: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  );.      goto ex
beb0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
bec0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
bed0: 66 28 20 70 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( pName==0 ){. 
bee0: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d     char zBuf[30]
bef0: 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
bf00: 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20   Index *pLoop;. 
bf10: 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61     for(pLoop=pTa
bf20: 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20  b->pIndex, n=1; 
bf30: 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
bf40: 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b  op->pNext, n++){
bf50: 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  }.    sprintf(zB
bf60: 75 66 2c 22 25 64 29 22 2c 6e 29 3b 0a 20 20 20  uf,"%d)",n);.   
bf70: 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20   zName = 0;.    
bf80: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
bf90: 28 26 7a 4e 61 6d 65 2c 20 22 28 22 2c 20 70 54  (&zName, "(", pT
bfa0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 20 61 75 74  ab->zName, " aut
bfb0: 6f 69 6e 64 65 78 20 22 2c 20 7a 42 75 66 2c 20  oindex ", zBuf, 
bfc0: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 69  (char*)0);.    i
bfd0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
bfe0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
bff0: 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ndex;.  }else{. 
c000: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
c010: 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e  eStrNDup(pName->
c020: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
c030: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
c040: 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  r authorization 
c050: 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  to create an ind
c060: 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ex..  */.#ifndef
c070: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
c080: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
c090: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
c0a0: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61  Db = db->aDb[pTa
c0b0: 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 0a  b->iDb].zName;..
c0c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
c0d0: 2d 3e 69 44 62 3d 3d 64 62 2d 3e 69 6e 69 74 2e  ->iDb==db->init.
c0e0: 69 44 62 20 7c 7c 20 69 73 54 65 6d 70 20 29 3b  iDb || isTemp );
c0f0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
c100: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
c110: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
c120: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73   SCHEMA_TABLE(is
c130: 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29  Temp), 0, zDb) )
c140: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
c150: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
c160: 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51      }.    i = SQ
c170: 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
c180: 58 3b 0a 20 20 20 20 69 66 28 20 69 73 54 65 6d  X;.    if( isTem
c190: 70 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43  p ) i = SQLITE_C
c1a0: 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
c1b0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
c1c0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
c1d0: 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61  e, i, zName, pTa
c1e0: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
c1f0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
c200: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
c210: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
c220: 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d  ..  /* If pList=
c230: 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69  =0, it means thi
c240: 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
c250: 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70  lled to make a p
c260: 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20  rimary.  ** key 
c270: 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20  out of the last 
c280: 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20  column added to 
c290: 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
c2a0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20  construction..  
c2b0: 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66  ** So create a f
c2c0: 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75  ake list to simu
c2d0: 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a  late this..  */.
c2e0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
c2f0: 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d  {.    nullId.z =
c300: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62   pTab->aCol[pTab
c310: 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b  ->nCol-1].zName;
c320: 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20  .    nullId.n = 
c330: 73 74 72 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29  strlen(nullId.z)
c340: 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  ;.    pList = sq
c350: 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
c360: 64 28 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20  d(0, &nullId);. 
c370: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
c380: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
c390: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20  te_index;.  }.. 
c3a0: 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61   /* .  ** Alloca
c3b0: 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72  te the index str
c3c0: 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20  ucture. .  */.  
c3d0: 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 4d  pIndex = sqliteM
c3e0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 6e  alloc( sizeof(In
c3f0: 64 65 78 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e  dex) + strlen(zN
c400: 61 6d 65 29 20 2b 20 31 20 2b 0a 20 20 20 20 20  ame) + 1 +.     
c410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c420: 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 70     sizeof(int)*p
c430: 4c 69 73 74 2d 3e 6e 49 64 20 29 3b 0a 20 20 69  List->nId );.  i
c440: 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 20 67  f( pIndex==0 ) g
c450: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
c460: 69 6e 64 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d  index;.  pIndex-
c470: 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74  >aiColumn = (int
c480: 2a 29 26 70 49 6e 64 65 78 5b 31 5d 3b 0a 20 20  *)&pIndex[1];.  
c490: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20  pIndex->zName = 
c4a0: 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e  (char*)&pIndex->
c4b0: 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e  aiColumn[pList->
c4c0: 6e 49 64 5d 3b 0a 20 20 73 74 72 63 70 79 28 70  nId];.  strcpy(p
c4d0: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  Index->zName, zN
c4e0: 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ame);.  pIndex->
c4f0: 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20  pTable = pTab;. 
c500: 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
c510: 20 3d 20 70 4c 69 73 74 2d 3e 6e 49 64 3b 0a 20   = pList->nId;. 
c520: 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
c530: 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49   = onError;.  pI
c540: 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20  ndex->autoIndex 
c550: 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20 20 70 49  = pName==0;.  pI
c560: 6e 64 65 78 2d 3e 69 44 62 20 3d 20 69 73 54 65  ndex->iDb = isTe
c570: 6d 70 20 3f 20 31 20 3a 20 64 62 2d 3e 69 6e 69  mp ? 1 : db->ini
c580: 74 2e 69 44 62 3b 0a 0a 20 20 2f 2a 20 53 63 61  t.iDb;..  /* Sca
c590: 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  n the names of t
c5a0: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
c5b0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
c5c0: 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c  dexed and.  ** l
c5d0: 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  oad the column i
c5e0: 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20  ndices into the 
c5f0: 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  Index structure.
c600: 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f    Report an erro
c610: 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f  r.  ** if any co
c620: 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e  lumn is not foun
c630: 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  d..  */.  for(i=
c640: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
c650: 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28 6a   i++){.    for(j
c660: 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; j<pTab->nCol
c670: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
c680: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
c690: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
c6a0: 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  me, pTab->aCol[j
c6b0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
c6c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
c6d0: 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c  f( j>=pTab->nCol
c6e0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c6f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
c700: 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20  , "table %s has 
c710: 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20  no column named 
c720: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
c730: 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69 73 74 2d  b->zName, pList-
c740: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
c750: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
c760: 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 67 6f  Index);.      go
c770: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
c780: 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
c790: 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
c7a0: 5b 69 5d 20 3d 20 6a 3b 0a 20 20 7d 0a 0a 20 20  [i] = j;.  }..  
c7b0: 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20  /* Link the new 
c7c0: 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
c7d0: 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64  to its table and
c7e0: 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20   to the other.  
c7f0: 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
c800: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73  abase structures
c810: 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  . .  */.  if( !p
c820: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
c830: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a  {.    Index *p;.
c840: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
c850: 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61  ashInsert(&db->a
c860: 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e  Db[pIndex->iDb].
c870: 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20  idxHash, .      
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c890: 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
c8a0: 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d  , strlen(pIndex-
c8b0: 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65  >zName)+1, pInde
c8c0: 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  x);.    if( p ){
c8d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c8e0: 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20  ==pIndex );  /* 
c8f0: 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
c900: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
c910: 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64   sqliteFree(pInd
c920: 65 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ex);.      goto 
c930: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
c940: 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  x;.    }.    db-
c950: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
c960: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
c970: 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61    }..  /* When a
c980: 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74  dding an index t
c990: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
c9a0: 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c  dices for a tabl
c9b0: 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  e, make.  ** sur
c9c0: 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61  e all indices la
c9d0: 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65  beled OE_Replace
c9e0: 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20   come after all 
c9f0: 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20  those labeled.  
ca00: 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54  ** OE_Ignore.  T
ca10: 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
ca20: 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74   for the correct
ca30: 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50   operation of UP
ca40: 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e  DATE.  ** and IN
ca50: 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  SERT..  */.  if(
ca60: 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70   onError!=OE_Rep
ca70: 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49  lace || pTab->pI
ca80: 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 7c  ndex==0.       |
ca90: 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e  | pTab->pIndex->
caa0: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c  onError==OE_Repl
cab0: 61 63 65 29 7b 0a 20 20 20 20 70 49 6e 64 65 78  ace){.    pIndex
cac0: 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e  ->pNext = pTab->
cad0: 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62  pIndex;.    pTab
cae0: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
caf0: 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  x;.  }else{.    
cb00: 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20  Index *pOther = 
cb10: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
cb20: 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d    while( pOther-
cb30: 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72  >pNext && pOther
cb40: 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72  ->pNext->onError
cb50: 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a  !=OE_Replace ){.
cb60: 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70        pOther = p
cb70: 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
cb80: 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
cb90: 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e  pNext = pOther->
cba0: 70 4e 65 78 74 3b 0a 20 20 20 20 70 4f 74 68 65  pNext;.    pOthe
cbb0: 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  r->pNext = pInde
cbc0: 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  x;.  }..  /* If 
cbd0: 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  the db->init.bus
cbe0: 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20  y is 1 it means 
cbf0: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
cc00: 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20  he SQL off the. 
cc10: 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74   ** "sqlite_mast
cc20: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
cc30: 20 64 69 73 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f   disk.  So do no
cc40: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  t write to the d
cc50: 69 73 6b 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20  isk.  ** again. 
cc60: 20 45 78 74 72 61 63 74 20 74 68 65 20 74 61 62   Extract the tab
cc70: 6c 65 20 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74  le number from t
cc80: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  he db->init.newT
cc90: 6e 75 6d 20 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a  num field..  */.
cca0: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
ccb0: 75 73 79 20 26 26 20 70 54 61 62 6c 65 21 3d 30  usy && pTable!=0
ccc0: 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e   ){.    pIndex->
ccd0: 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
cce0: 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20  newTnum;.  }..  
ccf0: 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
cd00: 69 74 2e 62 75 73 79 20 69 73 20 30 20 74 68 65  it.busy is 0 the
cd10: 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64  n create the ind
cd20: 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69  ex on disk.  Thi
cd30: 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20  s.  ** involves 
cd40: 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65  writing the inde
cd50: 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65  x into the maste
cd60: 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c  r table and fill
cd70: 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ing in the.  ** 
cd80: 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63  index with the c
cd90: 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e  urrent table con
cda0: 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tents..  **.  **
cdb0: 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   The db->init.bu
cdc0: 73 79 20 69 73 20 30 20 77 68 65 6e 20 74 68 65  sy is 0 when the
cdd0: 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65   user first ente
cde0: 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45  rs a CREATE INDE
cdf0: 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e  X .  ** command.
ce00: 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20    db->init.busy 
ce10: 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61  is 1 when a data
ce20: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61  base is opened a
ce30: 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20  nd .  ** CREATE 
ce40: 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73  INDEX statements
ce50: 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66   are read out of
ce60: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
ce70: 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20  e.  In.  ** the 
ce80: 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20  latter case the 
ce90: 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
cea0: 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68  ists on disk, wh
ceb0: 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20  ich is why.  ** 
cec0: 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  we don't want to
ced0: 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20   recreate it..  
cee0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 61 62 6c  **.  ** If pTabl
cef0: 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
cf00: 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65  is index is gene
cf10: 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61  rated as a prima
cf20: 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55  ry key.  ** or U
cf30: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
cf40: 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42   of a CREATE TAB
cf50: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  LE statement.  S
cf60: 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20  ince the table. 
cf70: 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65   ** has just bee
cf80: 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f  n created, it co
cf90: 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61  ntains no data a
cfa0: 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69  nd the index ini
cfb0: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
cfc0: 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69   step can be ski
cfd0: 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
cfe0: 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62  e if( db->init.b
cff0: 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  usy==0 ){.    in
d000: 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  t n;.    Vdbe *v
d010: 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31 2c 20  ;.    int lbl1, 
d020: 6c 62 6c 32 3b 0a 20 20 20 20 69 6e 74 20 69 3b  lbl2;.    int i;
d030: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a  .    int addr;..
d040: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
d050: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
d060: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67      if( v==0 ) g
d070: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
d080: 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  index;.    if( p
d090: 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20  Table!=0 ){.    
d0a0: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
d0b0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
d0c0: 72 73 65 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b  rse, 0, isTemp);
d0d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
d0e0: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c  enMasterTable(v,
d0f0: 20 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a   isTemp);.    }.
d100: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d110: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65  ddOp(v, OP_NewRe
d120: 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  cno, 0, 0);.    
d130: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
d140: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
d150: 30 2c 20 22 69 6e 64 65 78 22 2c 20 50 33 5f 53  0, "index", P3_S
d160: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
d170: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
d180: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20 70  _String, 0, 0, p
d190: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Index->zName, 0)
d1a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
d1b0: 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e  eOp3(v, OP_Strin
d1c0: 67 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  g, 0, 0, pTab->z
d1d0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  Name, 0);.    sq
d1e0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
d1f0: 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20  OP_CreateIndex, 
d200: 30 2c 20 69 73 54 65 6d 70 2c 28 63 68 61 72 2a  0, isTemp,(char*
d210: 29 26 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 50  )&pIndex->tnum,P
d220: 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20  3_POINTER);.    
d230: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 30  pIndex->tnum = 0
d240: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  ;.    if( pTable
d250: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d260: 33 56 64 62 65 43 6f 64 65 28 76 2c 0a 20 20 20  3VdbeCode(v,.   
d270: 20 20 20 20 20 20 20 4f 50 5f 44 75 70 2c 20 20         OP_Dup,  
d280: 20 20 20 20 20 30 2c 20 20 20 20 20 20 30 2c 0a       0,      0,.
d290: 20 20 20 20 20 20 20 20 20 20 4f 50 5f 49 6e 74            OP_Int
d2a0: 65 67 65 72 2c 20 20 20 69 73 54 65 6d 70 2c 20  eger,   isTemp, 
d2b0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 4f 50 5f  0,.          OP_
d2c0: 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 20 20  OpenWrite, 1,   
d2d0: 20 20 20 30 2c 0a 20 20 20 20 20 20 30 29 3b 0a     0,.      0);.
d2e0: 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d      }.    addr =
d2f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d300: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
d310: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
d320: 53 74 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b  Start && pEnd ){
d330: 0a 20 20 20 20 20 20 6e 20 3d 20 41 64 64 72 28  .      n = Addr(
d340: 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28  pEnd->z) - Addr(
d350: 70 53 74 61 72 74 2d 3e 7a 29 20 2b 20 31 3b 0a  pStart->z) + 1;.
d360: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d370: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
d380: 72 2c 20 70 53 74 61 72 74 2d 3e 7a 2c 20 6e 29  r, pStart->z, n)
d390: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
d3a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d3b0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35  OP_MakeRecord, 5
d3c0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
d3d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d3e0: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30  _PutIntKey, 0, 0
d3f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c  );.    if( pTabl
d400: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
d410: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d420: 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d  P_Integer, pTab-
d430: 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  >iDb, 0);.      
d440: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
d450: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 32  , OP_OpenRead, 2
d460: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 70 54  , pTab->tnum, pT
d470: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
d480: 20 20 20 20 20 6c 62 6c 32 20 3d 20 73 71 6c 69       lbl2 = sqli
d490: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
d4a0: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
d4b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d4c0: 50 5f 52 65 77 69 6e 64 2c 20 32 2c 20 6c 62 6c  P_Rewind, 2, lbl
d4d0: 32 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d  2);.      lbl1 =
d4e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d4f0: 70 28 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20 32  p(v, OP_Recno, 2
d500: 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  , 0);.      for(
d510: 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e  i=0; i<pIndex->n
d520: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
d530: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
d540: 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
d550: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  n[i];.        if
d560: 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69  ( pTab->iPKey==i
d570: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Col ){.         
d580: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d590: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 69 2c 20  p(v, OP_Dup, i, 
d5a0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0);.        }els
d5b0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
d5c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d5d0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 32 2c 20 69   OP_Column, 2, i
d5e0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Col);.        }.
d5f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
d600: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d610: 2c 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 2c  , OP_MakeIdxKey,
d620: 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
d630: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
d640: 74 65 33 41 64 64 49 64 78 4b 65 79 54 79 70 65  te3AddIdxKeyType
d650: 28 76 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20  (v, pIndex);.   
d660: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
d670: 33 28 76 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20  3(v, OP_IdxPut, 
d680: 31 2c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  1, pIndex->onErr
d690: 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 2c 0a 20 20 20  or!=OE_None,.   
d6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6b0: 20 20 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75     "indexed colu
d6c0: 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71  mns are not uniq
d6d0: 75 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ue", P3_STATIC);
d6e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d6f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
d700: 78 74 2c 20 32 2c 20 6c 62 6c 31 29 3b 0a 20 20  xt, 2, lbl1);.  
d710: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
d720: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
d730: 62 6c 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  bl2);.      sqli
d740: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d750: 4f 50 5f 43 6c 6f 73 65 2c 20 32 2c 20 30 29 3b  OP_Close, 2, 0);
d760: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d770: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
d780: 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ose, 1, 0);.    
d790: 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  }.    if( pTable
d7a0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
d7b0: 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20   !isTemp ){.    
d7c0: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
d7d0: 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a  eCookie(db, v);.
d7e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
d7f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d800: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30  , OP_Close, 0, 0
d810: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d820: 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
d830: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  n(pParse);.    }
d840: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
d850: 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69   up before exiti
d860: 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74  ng */.exit_creat
d870: 65 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74  e_index:.  sqlit
d880: 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  e3IdListDelete(p
d890: 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
d8a0: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54  SrcListDelete(pT
d8b0: 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  able);.  sqliteF
d8c0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  ree(zName);.  re
d8d0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
d8e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
d8f0: 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e   drop an existin
d900: 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20  g named index.  
d910: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
d920: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44  implements the D
d930: 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ROP INDEX statem
d940: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
d950: 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61  ite3DropIndex(Pa
d960: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
d970: 4c 69 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  List *pName){.  
d980: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
d990: 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
d9a0: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
d9b0: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  >db;..  if( pPar
d9c0: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
d9d0: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
d9e0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  d ) return;.  as
d9f0: 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
da00: 63 3d 3d 31 20 29 3b 0a 20 20 70 49 6e 64 65 78  c==1 );.  pIndex
da10: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
da20: 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61  dex(db, pName->a
da30: 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  [0].zName, pName
da40: 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
da50: 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d  );.  if( pIndex=
da60: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
da70: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
da80: 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
da90: 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29  : %S", pName, 0)
daa0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
dab0: 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
dac0: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75    if( pIndex->au
dad0: 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73  toIndex ){.    s
dae0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
daf0: 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73  Parse, "index as
db00: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e  sociated with UN
db10: 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72  IQUE ".      "or
db20: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
db30: 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62  straint cannot b
db40: 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a  e dropped", 0);.
db50: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
db60: 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
db70: 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 3e  if( pIndex->iDb>
db80: 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
db90: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
dba0: 20 22 63 61 6e 6e 6f 74 20 61 6c 74 65 72 20 73   "cannot alter s
dbb0: 63 68 65 6d 61 20 6f 66 20 61 74 74 61 63 68 65  chema of attache
dbc0: 64 20 22 0a 20 20 20 20 20 20 20 22 64 61 74 61  d ".       "data
dbd0: 62 61 73 65 73 22 2c 20 30 29 3b 0a 20 20 20 20  bases", 0);.    
dbe0: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
dbf0: 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  ndex;.  }.#ifnde
dc00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
dc10: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
dc20: 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53      int code = S
dc30: 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58  QLITE_DROP_INDEX
dc40: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
dc50: 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  b = pIndex->pTab
dc60: 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le;.    const ch
dc70: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
dc80: 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a  b[pIndex->iDb].z
dc90: 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Name;.    const 
dca0: 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48  char *zTab = SCH
dcb0: 45 4d 41 5f 54 41 42 4c 45 28 70 49 6e 64 65 78  EMA_TABLE(pIndex
dcc0: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20  ->iDb);.    if( 
dcd0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
dce0: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
dcf0: 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c  DELETE, zTab, 0,
dd00: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
dd10: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
dd20: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
dd30: 66 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 29  f( pIndex->iDb )
dd40: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
dd50: 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ROP_TEMP_INDEX;.
dd60: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
dd70: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
dd80: 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a   code, pIndex->z
dd90: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
dda0: 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
ddb0: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
ddc0: 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
ddd0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
dde0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
ddf0: 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
de00: 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  and from the mas
de10: 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76  ter table */.  v
de20: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
de30: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
de40: 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63   v ){.    static
de50: 20 56 64 62 65 4f 70 4c 69 73 74 20 64 72 6f 70   VdbeOpList drop
de60: 49 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20 20 20 20  Index[] = {.    
de70: 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20    { OP_Rewind,  
de80: 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30     0, ADDR(9), 0
de90: 7d 2c 20 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53  }, .      { OP_S
dea0: 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c  tring,     0, 0,
deb0: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20         0}, /* 1 
dec0: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65  */.      { OP_Me
ded0: 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20  mStore,   1, 1, 
dee0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
def0: 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20  { OP_MemLoad,   
df00: 20 31 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   1, 0,       0},
df10: 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 3 */.      {
df20: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20   OP_Column,     
df30: 30 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a  0, 1,       0},.
df40: 20 20 20 20 20 20 7b 20 4f 50 5f 45 71 2c 20 20        { OP_Eq,  
df50: 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 38         0, ADDR(8
df60: 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ), 0},.      { O
df70: 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c  P_Next,       0,
df80: 20 41 44 44 52 28 33 29 2c 20 30 7d 2c 0a 20 20   ADDR(3), 0},.  
df90: 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20      { OP_Goto,  
dfa0: 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c       0, ADDR(9),
dfb0: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
dfc0: 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30  Delete,     0, 0
dfd0: 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 38  ,       0}, /* 8
dfe0: 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69   */.    };.    i
dff0: 6e 74 20 62 61 73 65 3b 0a 0a 20 20 20 20 73 71  nt base;..    sq
e000: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
e010: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
e020: 20 30 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29   0, pIndex->iDb)
e030: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  ;.    sqlite3Ope
e040: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20  nMasterTable(v, 
e050: 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20  pIndex->iDb);.  
e060: 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33    base = sqlite3
e070: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
e080: 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70 49   ArraySize(dropI
e090: 6e 64 65 78 29 2c 20 64 72 6f 70 49 6e 64 65 78  ndex), dropIndex
e0a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
e0b0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61  beChangeP3(v, ba
e0c0: 73 65 2b 31 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  se+1, pIndex->zN
e0d0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ame, 0);.    if(
e0e0: 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 30 20   pIndex->iDb==0 
e0f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e100: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
e110: 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   v);.    }.    s
e120: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
e130: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20  v, OP_Close, 0, 
e140: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
e150: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
e160: 65 73 74 72 6f 79 2c 20 70 49 6e 64 65 78 2d 3e  estroy, pIndex->
e170: 74 6e 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44  tnum, pIndex->iD
e180: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  b);.    sqlite3E
e190: 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  ndWriteOperation
e1a0: 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20  (pParse);.  }.. 
e1b0: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 69   /* Delete the i
e1c0: 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 63 72 69 70  n-memory descrip
e1d0: 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 69 6e 64  tion of this ind
e1e0: 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ex..  */.  if( !
e1f0: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
e200: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 55 6e  ){.    sqlite3Un
e210: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
e220: 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
e230: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
e240: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
e250: 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 65 78 69 74  anges;.  }..exit
e260: 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73  _drop_index:.  s
e270: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
e280: 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  ete(pName);.}../
e290: 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
e2a0: 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
e2b0: 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20   given IdList.  
e2c0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c  Create a new IdL
e2d0: 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
e2e0: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49  e..**.** A new I
e2f0: 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  dList is returne
e300: 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61  d, or NULL if ma
e310: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
e320: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
e330: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c  IdListAppend(IdL
e340: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
e350: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
e360: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
e370: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
e380: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49  Malloc( sizeof(I
e390: 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  dList) );.    if
e3a0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
e3b0: 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
e3c0: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  ->nAlloc = 0;.  
e3d0: 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e  }.  if( pList->n
e3e0: 49 64 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  Id>=pList->nAllo
e3f0: 63 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  c ){.    struct 
e400: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  IdList_item *a;.
e410: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
e420: 63 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  c = pList->nAllo
e430: 63 2a 32 20 2b 20 35 3b 0a 20 20 20 20 61 20 3d  c*2 + 5;.    a =
e440: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70   sqliteRealloc(p
e450: 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e  List->a, pList->
e460: 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 4c  nAlloc*sizeof(pL
e470: 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  ist->a[0]) );.  
e480: 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20    if( a==0 ){.  
e490: 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
e4a0: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
e4b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
e4c0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
e4d0: 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65  >a = a;.  }.  me
e4e0: 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70  mset(&pList->a[p
e4f0: 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73  List->nId], 0, s
e500: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
e510: 5d 29 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  ]));.  if( pToke
e520: 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a  n ){.    char **
e530: 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  pz = &pList->a[p
e540: 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65  List->nId].zName
e550: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
e560: 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 54 6f 6b  NString(pz, pTok
e570: 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
e580: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70  , 0);.    if( *p
e590: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  z==0 ){.      sq
e5a0: 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
e5b0: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
e5c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
e5d0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
e5e0: 65 33 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a  e3Dequote(*pz);.
e5f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73      }.  }.  pLis
e600: 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75  t->nId++;.  retu
e610: 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
e620: 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
e630: 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
e640: 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e  e given SrcList.
e650: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53    Create a new S
e660: 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  rcList if.** nee
e670: 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74  d be.  A new ent
e680: 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  ry is created in
e690: 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65   the SrcList eve
e6a0: 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e  n if pToken is N
e6b0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  ULL..**.** A new
e6c0: 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75   SrcList is retu
e6d0: 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
e6e0: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
e6f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62  .**.** If pDatab
e700: 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c  ase is not null,
e710: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
e720: 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20  he table has an 
e730: 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61  optional.** data
e740: 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78  base name prefix
e750: 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22  .  Like this:  "
e760: 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e  database.table".
e770: 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a    The pDatabase.
e780: 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ** points to the
e790: 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
e7a0: 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74  the pTable point
e7b0: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
e7c0: 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53  e name..** The S
e7d0: 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65  rcList.a[].zName
e7e0: 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64   field is filled
e7f0: 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
e800: 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74  name which might
e810: 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54  .** come from pT
e820: 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61  able (if pDataba
e830: 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66  se is NULL) or f
e840: 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20  rom pDatabase.  
e850: 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  .** SrcList.a[].
e860: 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c  zDatabase is fil
e870: 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  led with the dat
e880: 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20  abase name from 
e890: 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69  pTable,.** or wi
e8a0: 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61  th NULL if no da
e8b0: 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66  tabase is specif
e8c0: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74  ied..**.** In ot
e8d0: 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61  her words, if ca
e8e0: 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ll like this:.**
e8f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
e900: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
e910: 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54  (A,B,0);.**.** T
e920: 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65  hen B is a table
e930: 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
e940: 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75  tabase name is u
e950: 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20  nspecified.  If 
e960: 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74  called.** like t
e970: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
e980: 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
e990: 74 41 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b 0a  tAppend(A,B,C);.
e9a0: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20  **.** Then C is 
e9b0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
e9c0: 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61  nd B is the data
e9d0: 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72  base name..*/.Sr
e9e0: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
e9f0: 63 4c 69 73 74 41 70 70 65 6e 64 28 53 72 63 4c  cListAppend(SrcL
ea00: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
ea10: 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65 6e  n *pTable, Token
ea20: 20 2a 70 44 61 74 61 62 61 73 65 29 7b 0a 20 20   *pDatabase){.  
ea30: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
ea40: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
ea50: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
ea60: 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20  (SrcList) );.   
ea70: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
ea80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c  return 0;.    pL
ea90: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b  ist->nAlloc = 1;
eaa0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
eab0: 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e  ->nSrc>=pList->n
eac0: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63  Alloc ){.    Src
ead0: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  List *pNew;.    
eae0: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d  pList->nAlloc *=
eaf0: 20 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73   2;.    pNew = s
eb00: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69  qliteRealloc(pLi
eb10: 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
eb20: 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74     sizeof(*pList
eb30: 29 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c  ) + (pList->nAll
eb40: 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69  oc-1)*sizeof(pLi
eb50: 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20  st->a[0]) );.   
eb60: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
eb70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
eb80: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
eb90: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
eba0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  0;.    }.    pLi
ebb0: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  st = pNew;.  }. 
ebc0: 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e   memset(&pList->
ebd0: 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2c 20  a[pList->nSrc], 
ebe0: 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  0, sizeof(pList-
ebf0: 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70  >a[0]));.  if( p
ec00: 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74  Database && pDat
ec10: 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  abase->z==0 ){. 
ec20: 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30     pDatabase = 0
ec30: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74  ;.  }.  if( pDat
ec40: 61 62 61 73 65 20 26 26 20 70 54 61 62 6c 65 20  abase && pTable 
ec50: 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  ){.    Token *pT
ec60: 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b  emp = pDatabase;
ec70: 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
ec80: 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61   pTable;.    pTa
ec90: 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d  ble = pTemp;.  }
eca0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b  .  if( pTable ){
ecb0: 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d  .    char **pz =
ecc0: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
ecd0: 2d 3e 6e 53 72 63 5d 2e 7a 4e 61 6d 65 3b 0a 20  ->nSrc].zName;. 
ece0: 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74     sqlite3SetNSt
ecf0: 72 69 6e 67 28 70 7a 2c 20 70 54 61 62 6c 65 2d  ring(pz, pTable-
ed00: 3e 7a 2c 20 70 54 61 62 6c 65 2d 3e 6e 2c 20 30  >z, pTable->n, 0
ed10: 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d  );.    if( *pz==
ed20: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
ed30: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
ed40: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
ed50: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73  turn 0;.    }els
ed60: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
ed70: 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20  Dequote(*pz);.  
ed80: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 44    }.  }.  if( pD
ed90: 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20 63  atabase ){.    c
eda0: 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73  har **pz = &pLis
edb0: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
edc0: 5d 2e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 20  ].zDatabase;.   
edd0: 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69   sqlite3SetNStri
ede0: 6e 67 28 70 7a 2c 20 70 44 61 74 61 62 61 73 65  ng(pz, pDatabase
edf0: 2d 3e 7a 2c 20 70 44 61 74 61 62 61 73 65 2d 3e  ->z, pDatabase->
ee00: 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a  n, 0);.    if( *
ee10: 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  pz==0 ){.      s
ee20: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
ee30: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
ee40: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
ee50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
ee60: 69 74 65 33 44 65 71 75 6f 74 65 28 2a 70 7a 29  ite3Dequote(*pz)
ee70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c  ;.    }.  }.  pL
ee80: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53  ist->a[pList->nS
ee90: 72 63 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31  rc].iCursor = -1
eea0: 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 2b  ;.  pList->nSrc+
eeb0: 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  +;.  return pLis
eec0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  t;.}../*.** Assi
eed0: 67 6e 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c  gn cursors to al
eee0: 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72  l tables in a Sr
eef0: 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71  cList.*/.void sq
ef00: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
ef10: 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65 20  gnCursors(Parse 
ef20: 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
ef30: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
ef40: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
ef50: 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
ef60: 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  ){.    if( pList
ef70: 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 30  ->a[i].iCursor<0
ef80: 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d   ){.      pList-
ef90: 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20  >a[i].iCursor = 
efa0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
efb0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
efc0: 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20  ** Add an alias 
efd0: 74 6f 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e  to the last iden
efe0: 74 69 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69  tifier on the gi
eff0: 76 65 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c  ven identifier l
f000: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
f010: 69 74 65 33 53 72 63 4c 69 73 74 41 64 64 41 6c  ite3SrcListAddAl
f020: 69 61 73 28 53 72 63 4c 69 73 74 20 2a 70 4c 69  ias(SrcList *pLi
f030: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
f040: 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20  n){.  if( pList 
f050: 26 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30  && pList->nSrc>0
f060: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20   ){.    int i = 
f070: 70 4c 69 73 74 2d 3e 6e 53 72 63 20 2d 20 31 3b  pList->nSrc - 1;
f080: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e  .    sqlite3SetN
f090: 53 74 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61  String(&pList->a
f0a0: 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20 70 54 6f 6b  [i].zAlias, pTok
f0b0: 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
f0c0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
f0d0: 33 44 65 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e  3Dequote(pList->
f0e0: 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20  a[i].zAlias);.  
f0f0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
f100: 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a  e an IdList..*/.
f110: 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69  void sqlite3IdLi
f120: 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20  stDelete(IdList 
f130: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
f140: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
f150: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
f160: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
f170: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
f180: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
f190: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  a[i].zName);.  }
f1a0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
f1b0: 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
f1c0: 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  eFree(pList);.}.
f1d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
f1e0: 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  e index in pList
f1f0: 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69   of the identifi
f200: 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52  er named zId.  R
f210: 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e  eturn -1.** if n
f220: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  ot found..*/.int
f230: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
f240: 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  dex(IdList *pLis
f250: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
f260: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
f270: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
f280: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f   return -1;.  fo
f290: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
f2a0: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nId; i++){.    i
f2b0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
f2c0: 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
f2d0: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
f2e0: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
f2f0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
f300: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
f310: 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e  ntire SrcList in
f320: 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20  cluding all its 
f330: 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  substructure..*/
f340: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
f350: 4c 69 73 74 44 65 6c 65 74 65 28 53 72 63 4c 69  ListDelete(SrcLi
f360: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
f370: 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
f380: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
f390: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
f3a0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
f3b0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
f3c0: 73 74 2d 3e 61 5b 69 5d 2e 7a 44 61 74 61 62 61  st->a[i].zDataba
f3d0: 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  se);.    sqliteF
f3e0: 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
f3f0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
f400: 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b  teFree(pList->a[
f410: 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  i].zAlias);.    
f420: 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
f430: 70 54 61 62 20 26 26 20 70 4c 69 73 74 2d 3e 61  pTab && pList->a
f440: 5b 69 5d 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e  [i].pTab->isTran
f450: 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  sient ){.      s
f460: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
f470: 65 28 30 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  e(0, pList->a[i]
f480: 2e 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  .pTab);.    }.  
f490: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
f4a0: 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  elete(pList->a[i
f4b0: 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ].pSelect);.    
f4c0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
f4d0: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 4f  e(pList->a[i].pO
f4e0: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49  n);.    sqlite3I
f4f0: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  dListDelete(pLis
f500: 74 2d 3e 61 5b 69 5d 2e 70 55 73 69 6e 67 29 3b  t->a[i].pUsing);
f510: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
f520: 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pList);.}../*.
f530: 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73  ** Begin a trans
f540: 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
f550: 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73  qlite3BeginTrans
f560: 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
f570: 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  arse, int onErro
f580: 72 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  r){.  sqlite *db
f590: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
f5a0: 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
f5b0: 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
f5c0: 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
f5d0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
f5e0: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
f5f0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
f600: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
f610: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
f620: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
f630: 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
f640: 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20   "BEGIN", 0, 0) 
f650: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
f660: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
f670: 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20  TE_InTrans ){.  
f680: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
f690: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
f6a0: 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
f6b0: 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20 74  ction within a t
f6c0: 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20  ransaction");.  
f6d0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
f6e0: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
f6f0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
f700: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  e, 0, 0);.  if( 
f710: 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
f720: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67   ){.    db->flag
f730: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 54 72  s |= SQLITE_InTr
f740: 61 6e 73 3b 0a 20 20 20 20 64 62 2d 3e 6f 6e 45  ans;.    db->onE
f750: 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  rror = onError;.
f760: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d    }.}../*.** Com
f770: 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  mit a transactio
f780: 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
f790: 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69  3CommitTransacti
f7a0: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
f7b0: 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b  ){.  sqlite *db;
f7c0: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
f7d0: 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
f7e0: 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  >db)==0 || db->a
f7f0: 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
f800: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
f810: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
f820: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
f830: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
f840: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
f850: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
f860: 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
f870: 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20  "COMMIT", 0, 0) 
f880: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
f890: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
f8a0: 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20  ITE_InTrans)==0 
f8b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
f8c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
f8d0: 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 2d 20  cannot commit - 
f8e0: 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  no transaction i
f8f0: 73 20 61 63 74 69 76 65 22 29 3b 0a 20 20 20 20  s active");.    
f900: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
f910: 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  ( !pParse->expla
f920: 69 6e 20 29 7b 0a 20 20 20 20 64 62 2d 3e 66 6c  in ){.    db->fl
f930: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
f940: 6e 54 72 61 6e 73 3b 0a 20 20 7d 0a 20 20 73 71  nTrans;.  }.  sq
f950: 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65  lite3EndWriteOpe
f960: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a  ration(pParse);.
f970: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65    if( !pParse->e
f980: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 64 62  xplain ){.    db
f990: 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44  ->onError = OE_D
f9a0: 65 66 61 75 6c 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f  efault;.  }.}../
f9b0: 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20  *.** Rollback a 
f9c0: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
f9d0: 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  oid sqlite3Rollb
f9e0: 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ackTransaction(P
f9f0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
fa00: 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56   sqlite *db;.  V
fa10: 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70  dbe *v;..  if( p
fa20: 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d  Parse==0 || (db=
fa30: 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c  pParse->db)==0 |
fa40: 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  | db->aDb[0].pBt
fa50: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
fa60: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
fa70: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
fa80: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
fa90: 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
faa0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
fab0: 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
fac0: 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b  CTION, "ROLLBACK
fad0: 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  ", 0, 0) ) retur
fae0: 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  n;.  if( (db->fl
faf0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
fb00: 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  rans)==0 ){.    
fb10: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
fb20: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
fb30: 72 6f 6c 6c 62 61 63 6b 20 2d 20 6e 6f 20 74 72  rollback - no tr
fb40: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
fb50: 69 76 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ive");.    retur
fb60: 6e 3b 20 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  n; .  }.  v = sq
fb70: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
fb80: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
fb90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
fba0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 6c 6c  AddOp(v, OP_Roll
fbb0: 62 61 63 6b 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  back, 0, 0);.  }
fbc0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
fbd0: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 64  explain ){.    d
fbe0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
fbf0: 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 20  ITE_InTrans;.   
fc00: 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f   db->onError = O
fc10: 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20 7d 0a 7d  E_Default;.  }.}
fc20: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
fc30: 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
fc40: 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20  will verify the 
fc50: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 66 6f  schema cookie fo
fc60: 72 20 61 6c 6c 0a 2a 2a 20 6e 61 6d 65 64 20 64  r all.** named d
fc70: 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a  atabase files..*
fc80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
fc90: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50  deVerifySchema(P
fca0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
fcb0: 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65  t iDb){.  sqlite
fcc0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
fcd0: 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  b;.  Vdbe *v = s
fce0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
fcf0: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
fd00: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
fd10: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
fd20: 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  rt( db->aDb[iDb]
fd30: 2e 70 42 74 21 3d 30 20 29 3b 0a 20 20 69 66 28  .pBt!=0 );.  if(
fd40: 20 69 44 62 21 3d 31 20 26 26 20 21 44 62 48 61   iDb!=1 && !DbHa
fd50: 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44  sProperty(db, iD
fd60: 62 2c 20 44 42 5f 43 6f 6f 6b 69 65 29 20 29 7b  b, DB_Cookie) ){
fd70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
fd80: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69  AddOp(v, OP_Veri
fd90: 66 79 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 64  fyCookie, iDb, d
fda0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65  b->aDb[iDb].sche
fdb0: 6d 61 5f 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20  ma_cookie);.    
fdc0: 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64 62  DbSetProperty(db
fdd0: 2c 20 69 44 62 2c 20 44 42 5f 43 6f 6f 6b 69 65  , iDb, DB_Cookie
fde0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
fdf0: 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
fe00: 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65 73  de that prepares
fe10: 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70   for doing an op
fe20: 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  eration that.** 
fe30: 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65  might change the
fe40: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
fe50: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74   This routine st
fe60: 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73  arts a new trans
fe70: 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65  action if we are
fe80: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74   not already wit
fe90: 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63  hin.** a transac
fea0: 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65  tion.  If we are
feb0: 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20   already within 
fec0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  a transaction, t
fed0: 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  hen a checkpoint
fee0: 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74 68  .** is set if th
fef0: 65 20 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 20  e setCheckpoint 
ff00: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75  parameter is tru
ff10: 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74  e.  A checkpoint
ff20: 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65   should.** be se
ff30: 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73  t for operations
ff40: 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c   that might fail
ff50: 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74   (due to a const
ff60: 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a  raint) part of.*
ff70: 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67  * the way throug
ff80: 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c  h and which will
ff90: 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f   need to undo so
ffa0: 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75  me writes withou
ffb0: 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72  t having to.** r
ffc0: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c  ollback the whol
ffd0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
ffe0: 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77  For operations w
fff0: 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  here all constra
10000 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63  ints.** can be c
10010 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e  hecked before an
10020 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  y changes are ma
10030 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  de to the databa
10040 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a  se, it is never.
10050 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ** necessary to 
10060 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64  undo a write and
10070 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
10080 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65  should not be se
10090 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61  t..**.** Only da
100a0 74 61 62 61 73 65 20 69 44 62 20 61 6e 64 20 74  tabase iDb and t
100b0 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
100c0 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62   are made writab
100d0 6c 65 20 62 79 20 74 68 69 73 20 63 61 6c 6c 2e  le by this call.
100e0 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20 74  .** If iDb==0, t
100f0 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e 64  hen the main and
10100 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 73 20   temp databases 
10110 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c  are made writabl
10120 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d 3d  e.   If.** iDb==
10130 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20  1 then only the 
10140 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 69 73  temp database is
10150 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20   made writable. 
10160 20 49 66 20 69 44 62 3e 31 20 74 68 65 6e 20 74   If iDb>1 then t
10170 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  he.** specified 
10180 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
10190 73 65 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20  se and the temp 
101a0 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 64  database are mad
101b0 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76  e writable..*/.v
101c0 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
101d0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50  WriteOperation(P
101e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
101f0 74 20 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 2c  t setCheckpoint,
10200 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
10210 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a  e *v;.  sqlite *
10220 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
10230 0a 20 20 69 66 28 20 44 62 48 61 73 50 72 6f 70  .  if( DbHasProp
10240 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42  erty(db, iDb, DB
10250 5f 4c 6f 63 6b 65 64 29 20 29 20 72 65 74 75 72  _Locked) ) retur
10260 6e 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  n;.  v = sqlite3
10270 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
10280 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
10290 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 64 62 2d  turn;.  if( !db-
102a0 3e 61 44 62 5b 69 44 62 5d 2e 69 6e 54 72 61 6e  >aDb[iDb].inTran
102b0 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  s ){.    sqlite3
102c0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
102d0 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62  Transaction, iDb
102e0 2c 20 30 29 3b 0a 20 20 20 20 44 62 53 65 74 50  , 0);.    DbSetP
102f0 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c  roperty(db, iDb,
10300 20 44 42 5f 4c 6f 63 6b 65 64 29 3b 0a 20 20 20   DB_Locked);.   
10310 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
10320 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
10330 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 69   iDb);.    if( i
10340 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  Db!=1 ){.      s
10350 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
10360 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
10370 2c 20 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 2c  , setCheckpoint,
10380 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   1);.    }.  }el
10390 73 65 20 69 66 28 20 73 65 74 43 68 65 63 6b 70  se if( setCheckp
103a0 6f 69 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  oint ){.    sqli
103b0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
103c0 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 2c 20 69  OP_Checkpoint, i
103d0 44 62 2c 20 30 29 3b 0a 20 20 20 20 44 62 53 65  Db, 0);.    DbSe
103e0 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44  tProperty(db, iD
103f0 62 2c 20 44 42 5f 4c 6f 63 6b 65 64 29 3b 0a 20  b, DB_Locked);. 
10400 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
10410 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 63  rate code that c
10420 6f 6e 63 6c 75 64 65 73 20 61 6e 20 6f 70 65 72  oncludes an oper
10430 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 68  ation that may h
10440 61 76 65 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74  ave changed.** t
10450 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
10460 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
10470 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61  nsaction was sta
10480 72 74 65 64 2c 20 74 68 65 6e 20 65 6d 69 74 0a  rted, then emit.
10490 2a 2a 20 61 6e 20 4f 50 5f 43 6f 6d 6d 69 74 20  ** an OP_Commit 
104a0 74 68 61 74 20 77 69 6c 6c 20 63 61 75 73 65 20  that will cause 
104b0 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 62  the changes to b
104c0 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64  e committed to d
104d0 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  isk..**.** Note 
104e0 74 68 61 74 20 63 68 65 63 6b 70 6f 69 6e 74 73  that checkpoints
104f0 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
10500 6c 79 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 20  ly committed at 
10510 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 61 20  the end of.** a 
10520 73 74 61 74 65 6d 65 6e 74 2e 20 20 4e 6f 74 65  statement.  Note
10530 20 61 6c 73 6f 20 74 68 61 74 20 74 68 65 72 65   also that there
10540 20 63 61 6e 20 62 65 20 6d 75 6c 74 69 70 6c 65   can be multiple
10550 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71   calls to .** sq
10560 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
10570 70 65 72 61 74 69 6f 6e 28 29 20 62 75 74 20 74  peration() but t
10580 68 65 72 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  here should only
10590 20 62 65 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20   be a single.** 
105a0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 45  call to sqlite3E
105b0 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  ndWriteOperation
105c0 28 29 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  () at the conclu
105d0 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74  sion of the stat
105e0 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
105f0 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70  qlite3EndWriteOp
10600 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
10610 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
10620 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  v;.  sqlite *db 
10630 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
10640 69 66 28 20 70 50 61 72 73 65 2d 3e 74 72 69 67  if( pParse->trig
10650 53 74 61 63 6b 20 29 20 72 65 74 75 72 6e 3b 20  Stack ) return; 
10660 2f 2a 20 69 66 20 74 68 69 73 20 69 73 20 69 6e  /* if this is in
10670 20 61 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20   a trigger */.  
10680 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
10690 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
106a0 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
106b0 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73  .  if( db->flags
106c0 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e   & SQLITE_InTran
106d0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 42 45  s ){.    /* A BE
106e0 47 49 4e 20 68 61 73 20 65 78 65 63 75 74 65 64  GIN has executed
106f0 2e 20 20 44 6f 20 6e 6f 74 20 63 6f 6d 6d 69 74  .  Do not commit
10700 20 75 6e 74 69 6c 20 77 65 20 73 65 65 20 61 6e   until we see an
10710 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20 2a 2a   explicit.    **
10720 20 43 4f 4d 4d 49 54 20 73 74 61 74 65 6d 65 6e   COMMIT statemen
10730 74 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  t. */.  }else{. 
10740 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10750 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74  dOp(v, OP_Commit
10760 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 0, 0);.  }.}..
10770 0a 0a                                            ..