/ Hex Artifact Content
Login

Artifact 6c0463907ba80e0269f0b7fdf4210a049275b48a:


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 34 20 32 30 30 34 2f 30 35 2f 31 36 20 31  184 2004/05/16 1
0300: 31 3a 31 35 3a 33 36 20 64 61 6e 69 65 6c 6b 31  1:15:36 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 69 66 28 20 70 2d 3e 7a 43 6f 6c 41 66 66    if( p->zColAff
1740: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
1750: 65 65 28 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  ee(p->zColAff);.
1760: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
1770: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  (p);.}../*.** Un
1780: 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 69  link the given i
1790: 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 74 61  ndex from its ta
17a0: 62 6c 65 2c 20 74 68 65 6e 20 72 65 6d 6f 76 65  ble, then remove
17b0: 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 66 72  .** the index fr
17c0: 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  om the index has
17d0: 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65  h table and free
17e0: 20 69 74 73 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73   its memory.** s
17f0: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
1800: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
1810: 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73  AndDeleteIndex(s
1820: 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65 78  qlite *db, Index
1830: 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 66 28   *pIndex){.  if(
1840: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
1850: 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20  >pIndex==pIndex 
1860: 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  ){.    pIndex->p
1870: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20  Table->pIndex = 
1880: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
1890: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65   }else{.    Inde
18a0: 78 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  x *p;.    for(p=
18b0: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
18c0: 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70 2d 3e  pIndex; p && p->
18d0: 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b 20 70  pNext!=pIndex; p
18e0: 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20  =p->pNext){}.   
18f0: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 4e 65   if( p && p->pNe
1900: 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20  xt==pIndex ){.  
1910: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
1920: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
1930: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1940: 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20  DeleteIndex(db, 
1950: 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pIndex);.}../*.*
1960: 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65  * Erase all sche
1970: 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ma information f
1980: 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  rom the in-memor
1990: 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66  y hash tables of
19a0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
19b0: 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 72  nection.  This r
19c0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
19d0: 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f   to reclaim memo
19e0: 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65  ry.** before the
19f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c 6f 73   connection clos
1a00: 65 73 2e 20 20 49 74 20 69 73 20 61 6c 73 6f 20  es.  It is also 
1a10: 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 61 20  called during a 
1a20: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 74  rollback.** if t
1a30: 68 65 72 65 20 77 65 72 65 20 73 63 68 65 6d 61  here were schema
1a40: 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20   changes during 
1a50: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
1a60: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 3d 30  .**.** If iDb<=0
1a70: 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20   then reset the 
1a80: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
1a90: 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64  tables for all d
1aa0: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73  atabase.** files
1ab0: 2e 20 20 49 66 20 69 44 62 3e 3d 32 20 74 68 65  .  If iDb>=2 the
1ac0: 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65  n reset the inte
1ad0: 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72 20  rnal schema for 
1ae0: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67  only the.** sing
1af0: 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74 65  le file indicate
1b00: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1b10: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
1b20: 63 68 65 6d 61 28 73 71 6c 69 74 65 20 2a 64 62  chema(sqlite *db
1b30: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 48 61  , int iDb){.  Ha
1b40: 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20  shElem *pElem;. 
1b50: 20 48 61 73 68 20 74 65 6d 70 31 3b 0a 20 20 48   Hash temp1;.  H
1b60: 61 73 68 20 74 65 6d 70 32 3b 0a 20 20 69 6e 74  ash temp2;.  int
1b70: 20 69 2c 20 6a 3b 0a 0a 20 20 61 73 73 65 72 74   i, j;..  assert
1b80: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
1b90: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 64 62 2d  db->nDb );.  db-
1ba0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
1bb0: 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 3b 0a 20  E_Initialized;. 
1bc0: 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c 64 62   for(i=iDb; i<db
1bd0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
1be0: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
1bf0: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 74 65 6d 70  aDb[i];.    temp
1c00: 31 20 3d 20 70 44 62 2d 3e 74 62 6c 48 61 73 68  1 = pDb->tblHash
1c10: 3b 0a 20 20 20 20 74 65 6d 70 32 20 3d 20 70 44  ;.    temp2 = pD
1c20: 62 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20 20 20  b->trigHash;.   
1c30: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
1c40: 28 26 70 44 62 2d 3e 74 72 69 67 48 61 73 68 2c  (&pDb->trigHash,
1c50: 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52   SQLITE_HASH_STR
1c60: 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ING, 0);.    sql
1c70: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 70  ite3HashClear(&p
1c80: 44 62 2d 3e 61 46 4b 65 79 29 3b 0a 20 20 20 20  Db->aFKey);.    
1c90: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
1ca0: 28 26 70 44 62 2d 3e 69 64 78 48 61 73 68 29 3b  (&pDb->idxHash);
1cb0: 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  .    for(pElem=s
1cc0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
1cd0: 74 65 6d 70 32 29 3b 20 70 45 6c 65 6d 3b 20 70  temp2); pElem; p
1ce0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
1cf0: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
1d00: 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69     Trigger *pTri
1d10: 67 67 65 72 20 3d 20 73 71 6c 69 74 65 48 61 73  gger = sqliteHas
1d20: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
1d30: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
1d40: 65 54 72 69 67 67 65 72 28 70 54 72 69 67 67 65  eTrigger(pTrigge
1d50: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
1d60: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
1d70: 74 65 6d 70 32 29 3b 0a 20 20 20 20 73 71 6c 69  temp2);.    sqli
1d80: 74 65 33 48 61 73 68 49 6e 69 74 28 26 70 44 62  te3HashInit(&pDb
1d90: 2d 3e 74 62 6c 48 61 73 68 2c 20 53 51 4c 49 54  ->tblHash, SQLIT
1da0: 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30  E_HASH_STRING, 0
1db0: 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d  );.    for(pElem
1dc0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
1dd0: 28 26 74 65 6d 70 31 29 3b 20 70 45 6c 65 6d 3b  (&temp1); pElem;
1de0: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
1df0: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
1e00: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
1e10: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
1e20: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20  a(pElem);.      
1e30: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
1e40: 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
1e50: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 48    }.    sqlite3H
1e60: 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70 31 29  ashClear(&temp1)
1e70: 3b 0a 20 20 20 20 44 62 43 6c 65 61 72 50 72 6f  ;.    DbClearPro
1e80: 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f  perty(db, i, DB_
1e90: 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3b 0a 20  SchemaLoaded);. 
1ea0: 20 20 20 69 66 28 20 69 44 62 3e 30 20 29 20 72     if( iDb>0 ) r
1eb0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
1ec0: 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a 20  ert( iDb==0 );. 
1ed0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
1ee0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
1ef0: 67 65 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  ges;..  /* If on
1f00: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
1f10: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
1f20: 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62 65  ase files has be
1f30: 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20  en closed,.  ** 
1f40: 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 6e  then remove then
1f50: 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c 69   from the auxili
1f60: 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69 73  ary database lis
1f70: 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65 0a  t.  We take the.
1f80: 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79    ** opportunity
1f90: 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72 65   to do this here
1fa0: 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6a   since we have j
1fb0: 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c 20  ust deleted all 
1fc0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68 65  of the.  ** sche
1fd0: 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20 61  ma hash tables a
1fe0: 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f 20  nd therefore do 
1ff0: 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b 65  not have to make
2000: 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20 2a   any changes.  *
2010: 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73  * to any of thos
2020: 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
2030: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
2040: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nDb; i++){.    s
2050: 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20  truct Db *pDb = 
2060: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
2070: 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30   if( pDb->pBt==0
2080: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
2090: 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62 2d 3e  b->pAux && pDb->
20a0: 78 46 72 65 65 41 75 78 20 29 20 70 44 62 2d 3e  xFreeAux ) pDb->
20b0: 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e 70 41  xFreeAux(pDb->pA
20c0: 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  ux);.      pDb->
20d0: 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pAux = 0;.    }.
20e0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b    }.  for(i=j=2;
20f0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
2100: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
2110: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
2120: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  i];.    if( pDb-
2130: 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >pBt==0 ){.     
2140: 20 73 71 6c 69 74 65 46 72 65 65 28 70 44 62 2d   sqliteFree(pDb-
2150: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  >zName);.      p
2160: 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  Db->zName = 0;. 
2170: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2180: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69     }.    if( j<i
2190: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44   ){.      db->aD
21a0: 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69  b[j] = db->aDb[i
21b0: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b  ];.    }.    j++
21c0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
21d0: 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28  db->aDb[j], 0, (
21e0: 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f  db->nDb-j)*sizeo
21f0: 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a  f(db->aDb[j]));.
2200: 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20    db->nDb = j;. 
2210: 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20   if( db->nDb<=2 
2220: 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e  && db->aDb!=db->
2230: 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20  aDbStatic ){.   
2240: 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53   memcpy(db->aDbS
2250: 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20  tatic, db->aDb, 
2260: 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62  2*sizeof(db->aDb
2270: 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  [0]));.    sqlit
2280: 65 46 72 65 65 28 64 62 2d 3e 61 44 62 29 3b 0a  eFree(db->aDb);.
2290: 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62      db->aDb = db
22a0: 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20 7d  ->aDbStatic;.  }
22b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
22c0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
22d0: 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
22e0: 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 20 49 66  back occurs.  If
22f0: 20 74 68 65 72 65 20 77 65 72 65 0a 2a 2a 20 73   there were.** s
2300: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75  chema changes du
2310: 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63  ring the transac
2320: 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20 68 61  tion, then we ha
2330: 76 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 0a  ve to reset the.
2340: 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  ** internal hash
2350: 20 74 61 62 6c 65 73 20 61 6e 64 20 72 65 6c 6f   tables and relo
2360: 61 64 20 74 68 65 6d 20 66 72 6f 6d 20 64 69 73  ad them from dis
2370: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  k..*/.void sqlit
2380: 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e  e3RollbackIntern
2390: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
23a0: 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d   *db){.  if( db-
23b0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
23c0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b  InternChanges ){
23d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65  .    sqlite3Rese
23e0: 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
23f0: 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  db, 0);.  }.}../
2400: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2410: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
2420: 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73   a commit occurs
2430: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2440: 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  3CommitInternalC
2450: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20 2a 64  hanges(sqlite *d
2460: 62 29 7b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d  b){.  db->aDb[0]
2470: 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d  .schema_cookie =
2480: 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65   db->next_cookie
2490: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
24a0: 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43   ~SQLITE_InternC
24b0: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
24c0: 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f   Remove the memo
24d0: 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ry data structur
24e0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
24f0: 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  th the given.** 
2500: 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67  Table.  No chang
2510: 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64  es are made to d
2520: 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74  isk by this rout
2530: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ine..**.** This 
2540: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c  routine just del
2550: 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74  etes the data st
2560: 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65  ructure.  It doe
2570: 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20  s not unlink.** 
2580: 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73  the table data s
2590: 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
25a0: 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 4e  e hash table.  N
25b0: 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d 6f 76  or does it remov
25c0: 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79  e.** foreign key
25d0: 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74  s from the sqlit
25e0: 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62  e.aFKey hash tab
25f0: 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73  le.  But it does
2600: 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f   destroy.** memo
2610: 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66  ry structures of
2620: 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64   the indices and
2630: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73   foreign keys as
2640: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a  sociated with .*
2650: 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  * the table..**.
2660: 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73 6f 63  ** Indices assoc
2670: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
2680: 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e 6b 65  able are unlinke
2690: 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62 22 0a  d from the "db".
26a0: 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ** data structur
26b0: 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e 20 20  e if db!=NULL.  
26c0: 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64  If db==NULL, ind
26d0: 69 63 65 73 20 61 74 74 61 63 68 65 64 20 74 6f  ices attached to
26e0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 61 72  .** the table ar
26f0: 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74 20 69  e deleted, but i
2700: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 65  t is assumed the
2710: 79 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  y have already b
2720: 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e  een.** unlinked.
2730: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2740: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
2750: 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  te *db, Table *p
2760: 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Table){.  int i;
2770: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
2780: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79  , *pNext;.  FKey
2790: 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46   *pFKey, *pNextF
27a0: 4b 65 79 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  Key;..  if( pTab
27b0: 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  le==0 ) return;.
27c0: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c  .  /* Delete all
27d0: 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
27e0: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61  ted with this ta
27f0: 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  ble.  */.  for(p
2800: 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e  Index = pTable->
2810: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
2820: 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20  pIndex=pNext){. 
2830: 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65     pNext = pInde
2840: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73  x->pNext;.    as
2850: 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 69 44  sert( pIndex->iD
2860: 62 3d 3d 70 54 61 62 6c 65 2d 3e 69 44 62 20 7c  b==pTable->iDb |
2870: 7c 20 28 70 54 61 62 6c 65 2d 3e 69 44 62 3d 3d  | (pTable->iDb==
2880: 30 20 26 26 20 70 49 6e 64 65 78 2d 3e 69 44 62  0 && pIndex->iDb
2890: 3d 3d 31 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ==1) );.    sqli
28a0: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62  teDeleteIndex(db
28b0: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a  , pIndex);.  }..
28c0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
28d0: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73  foreign keys ass
28e0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
28f0: 73 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6b 65  s table.  The ke
2900: 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  ys.  ** should h
2910: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
2920: 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74   unlinked from t
2930: 68 65 20 64 62 2d 3e 61 46 4b 65 79 20 68 61 73  he db->aFKey has
2940: 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a 20 20  h table .  */.  
2950: 66 6f 72 28 70 46 4b 65 79 3d 70 54 61 62 6c 65  for(pFKey=pTable
2960: 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20  ->pFKey; pFKey; 
2970: 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79 29  pFKey=pNextFKey)
2980: 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b 65 79 20  {.    pNextFKey 
2990: 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72  = pFKey->pNextFr
29a0: 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  om;.    assert( 
29b0: 70 54 61 62 6c 65 2d 3e 69 44 62 3c 64 62 2d 3e  pTable->iDb<db->
29c0: 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nDb );.    asser
29d0: 74 28 20 73 71 6c 69 74 65 33 48 61 73 68 46 69  t( sqlite3HashFi
29e0: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70 54 61 62  nd(&db->aDb[pTab
29f0: 6c 65 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 0a  le->iDb].aFKey,.
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79             pFKey
2a20: 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46  ->zTo, strlen(pF
2a30: 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46  Key->zTo)+1)!=pF
2a40: 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  Key );.    sqlit
2a50: 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20  eFree(pFKey);.  
2a60: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  }..  /* Delete t
2a70: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
2a80: 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a  re itself..  */.
2a90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
2aa0: 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  ble->nCol; i++){
2ab0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2ac0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e  pTable->aCol[i].
2ad0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
2ae0: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
2af0: 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20  Col[i].zDflt);. 
2b00: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54     sqliteFree(pT
2b10: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54  able->aCol[i].zT
2b20: 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ype);.  }.  sqli
2b30: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a  teFree(pTable->z
2b40: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  Name);.  sqliteF
2b50: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
2b60: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  );.  if( pTable-
2b70: 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a 20 20 20 20  >zColAff ){.    
2b80: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
2b90: 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 7d  e->zColAff);.  }
2ba0: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
2bb0: 44 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70  Delete(pTable->p
2bc0: 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74  Select);.  sqlit
2bd0: 65 46 72 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d  eFree(pTable);.}
2be0: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74  ../*.** Unlink t
2bf0: 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66  he given table f
2c00: 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62  rom the hash tab
2c10: 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65  les and the dele
2c20: 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  te the.** table 
2c30: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20 61  structure with a
2c40: 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20 61  ll its indices a
2c50: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e  nd foreign keys.
2c60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2c70: 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44  sqliteUnlinkAndD
2c80: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
2c90: 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29  e *db, Table *p)
2ca0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b  {.  Table *pOld;
2cb0: 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70  .  FKey *pF1, *p
2cc0: 46 32 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d  F2;.  int i = p-
2cd0: 3e 69 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20  >iDb;.  assert( 
2ce0: 64 62 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20  db!=0 );.  pOld 
2cf0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
2d00: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e  ert(&db->aDb[i].
2d10: 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  tblHash, p->zNam
2d20: 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61  e, strlen(p->zNa
2d30: 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73  me)+1, 0);.  ass
2d40: 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20  ert( pOld==0 || 
2d50: 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 6f 72  pOld==p );.  for
2d60: 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70  (pF1=p->pFKey; p
2d70: 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65  F1; pF1=pF1->pNe
2d80: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 69 6e 74  xtFrom){.    int
2d90: 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46   nTo = strlen(pF
2da0: 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20  1->zTo) + 1;.   
2db0: 20 70 46 32 20 3d 20 73 71 6c 69 74 65 33 48 61   pF2 = sqlite3Ha
2dc0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b  shFind(&db->aDb[
2dd0: 69 5d 2e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a  i].aFKey, pF1->z
2de0: 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 69 66  To, nTo);.    if
2df0: 28 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20  ( pF2==pF1 ){.  
2e00: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
2e10: 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69  nsert(&db->aDb[i
2e20: 5d 2e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54  ].aFKey, pF1->zT
2e30: 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65  o, nTo, pF1->pNe
2e40: 78 74 54 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  xtTo);.    }else
2e50: 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  {.      while( p
2e60: 46 32 20 26 26 20 70 46 32 2d 3e 70 4e 65 78 74  F2 && pF2->pNext
2e70: 54 6f 21 3d 70 46 31 20 29 7b 20 70 46 32 3d 70  To!=pF1 ){ pF2=p
2e80: 46 32 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20  F2->pNextTo; }. 
2e90: 20 20 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a       if( pF2 ){.
2ea0: 20 20 20 20 20 20 20 20 70 46 32 2d 3e 70 4e 65          pF2->pNe
2eb0: 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e 65 78  xtTo = pF1->pNex
2ec0: 74 54 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  tTo;.      }.   
2ed0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
2ee0: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
2ef0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  p);.}../*.** Con
2f00: 73 74 72 75 63 74 20 74 68 65 20 6e 61 6d 65 20  struct the name 
2f10: 6f 66 20 61 20 75 73 65 72 20 74 61 62 6c 65 20  of a user table 
2f20: 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d 20 61 20  or index from a 
2f30: 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  token..**.** Spa
2f40: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  ce to hold the n
2f50: 61 6d 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ame is obtained 
2f60: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
2f70: 63 28 29 20 61 6e 64 20 6d 75 73 74 0a 2a 2a 20  c() and must.** 
2f80: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
2f90: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2fa0: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
2fb0: 65 33 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  e3TableNameFromT
2fc0: 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d  oken(Token *pNam
2fd0: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
2fe0: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  e = sqliteStrNDu
2ff0: 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  p(pName->z, pNam
3000: 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33  e->n);.  sqlite3
3010: 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a  Dequote(zName);.
3020: 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a    return zName;.
3030: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
3040: 65 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74  e code to open t
3050: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
3060: 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 54 68  aster table.  Th
3070: 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 70 65 6e 65  e table.** opene
3080: 64 20 77 69 6c 6c 20 62 65 20 53 51 4c 49 54 45  d will be SQLITE
3090: 5f 4d 41 53 54 45 52 20 66 6f 72 20 70 65 72 73  _MASTER for pers
30a0: 69 73 74 65 6e 74 20 74 61 62 6c 65 73 20 61 6e  istent tables an
30b0: 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 4d  d .** SQLITE_TEM
30c0: 50 5f 4d 41 53 54 45 52 20 66 6f 72 20 74 65 6d  P_MASTER for tem
30d0: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
30e0: 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65  The table is ope
30f0: 6e 65 64 0a 2a 2a 20 6f 6e 20 63 75 72 73 6f 72  ned.** on cursor
3100: 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69   0..*/.void sqli
3110: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
3120: 6c 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  le(Vdbe *v, int 
3130: 69 73 54 65 6d 70 29 7b 0a 20 20 73 71 6c 69 74  isTemp){.  sqlit
3140: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3150: 50 5f 49 6e 74 65 67 65 72 2c 20 69 73 54 65 6d  P_Integer, isTem
3160: 70 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  p, 0);.  sqlite3
3170: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3180: 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41  OpenWrite, 0, MA
3190: 53 54 45 52 5f 52 4f 4f 54 29 3b 0a 7d 0a 0a 2f  STER_ROOT);.}../
31a0: 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74  *.** Begin const
31b0: 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ructing a new ta
31c0: 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
31d0: 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54  on in memory.  T
31e0: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
31f0: 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61  rst of several a
3200: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74  ction routines t
3210: 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69  hat get called i
3220: 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f  n response.** to
3230: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
3240: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70  statement.  In p
3250: 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20  articular, this 
3260: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
3270: 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e  d.** after seein
3280: 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45  g tokens "CREATE
3290: 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e  " and "TABLE" an
32a0: 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  d the table name
32b0: 2e 20 20 54 68 65 0a 2a 2a 20 70 53 74 61 72 74  .  The.** pStart
32c0: 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 43 52   token is the CR
32d0: 45 41 54 45 20 61 6e 64 20 70 4e 61 6d 65 20 69  EATE and pName i
32e0: 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  s the table name
32f0: 2e 20 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a  .  The isTemp.**
3300: 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66   flag is true if
3310: 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c   the table shoul
3320: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
3330: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
3340: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e  abase.** file in
3350: 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20  stead of in the 
3360: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
3370: 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  le.  This is nor
3380: 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a  mally the case.*
3390: 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50  * when the "TEMP
33a0: 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22  " or "TEMPORARY"
33b0: 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20   keyword occurs 
33c0: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52  in between.** CR
33d0: 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a  EATE and TABLE..
33e0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61  **.** The new ta
33f0: 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e  ble record is in
3400: 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75  itialized and pu
3410: 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65  t in pParse->pNe
3420: 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f  wTable..** As mo
3430: 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  re of the CREATE
3440: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
3450: 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69   is parsed, addi
3460: 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a  tional action.**
3470: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62   routines will b
3480: 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20  e called to add 
3490: 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
34a0: 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e   to this record.
34b0: 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
34c0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
34d0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  LE statement, th
34e0: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
34f0: 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  e() routine.** i
3500: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70  s called to comp
3510: 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75  lete the constru
3520: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77  ction of the new
3530: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a   table record..*
3540: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74  /.void sqlite3St
3550: 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73  artTable(.  Pars
3560: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
3570: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
3580: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72  /.  Token *pStar
3590: 74 2c 20 20 20 2f 2a 20 54 68 65 20 22 43 52 45  t,   /* The "CRE
35a0: 41 54 45 22 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  ATE" token */.  
35b0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20  Token *pName,   
35c0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c   /* Name of tabl
35d0: 65 20 6f 72 20 76 69 65 77 20 74 6f 20 63 72 65  e or view to cre
35e0: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  ate */.  int isT
35f0: 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  emp,      /* Tru
3600: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 54  e if this is a T
3610: 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  EMP table */.  i
3620: 6e 74 20 69 73 56 69 65 77 20 20 20 20 20 20 20  nt isView       
3630: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
3640: 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 29 7b 0a  is a VIEW */.){.
3650: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
3660: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
3670: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
3680: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
3690: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
36a0: 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a   *v;.  int iDb;.
36b0: 0a 20 20 70 50 61 72 73 65 2d 3e 73 46 69 72 73  .  pParse->sFirs
36c0: 74 54 6f 6b 65 6e 20 3d 20 2a 70 53 74 61 72 74  tToken = *pStart
36d0: 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  zName = sqli
36e0: 74 65 33 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d  te3TableNameFrom
36f0: 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20  Token(pName);.  
3700: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72  if( zName==0 ) r
3710: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d  eturn;.  if( db-
3720: 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69  >init.iDb==1 ) i
3730: 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64  sTemp = 1;.#ifnd
3740: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
3750: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61  UTHORIZATION.  a
3760: 73 73 65 72 74 28 20 28 69 73 54 65 6d 70 20 26  ssert( (isTemp &
3770: 20 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20   1)==isTemp );. 
3780: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b   {.    int code;
3790: 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  .    char *zDb =
37a0: 20 69 73 54 65 6d 70 20 3f 20 22 74 65 6d 70 22   isTemp ? "temp"
37b0: 20 3a 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 69   : "main";.    i
37c0: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
37d0: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
37e0: 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
37f0: 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c  A_TABLE(isTemp),
3800: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
3810: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
3820: 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
3830: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
3840: 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20   isView ){.     
3850: 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20   if( isTemp ){. 
3860: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
3870: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
3880: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
3890: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
38a0: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
38b0: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20  _VIEW;.      }. 
38c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
38d0: 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20  if( isTemp ){.  
38e0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
38f0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
3900: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  TABLE;.      }el
3910: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
3920: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
3930: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a  _TABLE;.      }.
3940: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
3950: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
3960: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61  Parse, code, zNa
3970: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
3980: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
3990: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
39a0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
39b0: 23 65 6e 64 69 66 0a 20 0a 0a 20 20 2f 2a 20 42  #endif. ..  /* B
39c0: 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 6f 20  efore trying to 
39d0: 63 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  create a tempora
39e0: 72 79 20 74 61 62 6c 65 2c 20 6d 61 6b 65 20 73  ry table, make s
39f0: 75 72 65 20 74 68 65 20 42 74 72 65 65 20 66 6f  ure the Btree fo
3a00: 72 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 74  r.  ** holding t
3a10: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20  emporary tables 
3a20: 69 73 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20  is open..  */.  
3a30: 69 66 28 20 69 73 54 65 6d 70 20 26 26 20 64 62  if( isTemp && db
3a40: 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20  ->aDb[1].pBt==0 
3a50: 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  && !pParse->expl
3a60: 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ain ){.    int r
3a70: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
3a80: 46 61 63 74 6f 72 79 28 64 62 2c 20 30 2c 20 30  Factory(db, 0, 0
3a90: 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 26 64 62  , MAX_PAGES, &db
3aa0: 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20  ->aDb[1].pBt);. 
3ab0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
3ac0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
3ad0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3ae0: 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
3af0: 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
3b00: 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20 20  y database ".   
3b10: 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73       "file for s
3b20: 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79  toring temporary
3b30: 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20   tables");.     
3b40: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
3b50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
3b60: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
3b70: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
3b80: 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20  InTrans ){.     
3b90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
3ba0: 65 65 42 65 67 69 6e 54 72 61 6e 73 28 64 62 2d  eeBeginTrans(db-
3bb0: 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[1].pBt);.  
3bc0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
3bd0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
3be0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3bf0: 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
3c00: 20 74 6f 20 67 65 74 20 61 20 77 72 69 74 65 20   to get a write 
3c10: 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20  lock on ".      
3c20: 20 20 20 20 22 74 68 65 20 74 65 6d 70 6f 72 61      "the tempora
3c30: 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
3c40: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
3c50: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
3c60: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
3c70: 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61   sure the new ta
3c80: 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f  ble name does no
3c90: 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61  t collide with a
3ca0: 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
3cb0: 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e  index or table n
3cc0: 61 6d 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65  ame.  Issue an e
3cd0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20  rror message if 
3ce0: 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2a 0a 20 20  it does..  **.  
3cf0: 2a 2a 20 49 66 20 77 65 20 61 72 65 20 72 65 2d  ** If we are re-
3d00: 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
3d10: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
3d20: 62 65 63 61 75 73 65 20 6f 66 20 61 20 73 63 68  because of a sch
3d30: 65 6d 61 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20  ema.  ** change 
3d40: 61 6e 64 20 61 20 6e 65 77 20 70 65 72 6d 61 6e  and a new perman
3d50: 65 6e 74 20 74 61 62 6c 65 20 69 73 20 66 6f 75  ent table is fou
3d60: 6e 64 20 77 68 6f 73 65 20 6e 61 6d 65 20 63 6f  nd whose name co
3d70: 6c 6c 69 64 65 73 20 77 69 74 68 0a 20 20 2a 2a  llides with.  **
3d80: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 65 6d   an existing tem
3d90: 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
3da0: 61 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72  at is not an err
3db0: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 6c  or..  */.  pTabl
3dc0: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  e = sqlite3FindT
3dd0: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
3de0: 30 29 3b 0a 20 20 69 44 62 20 3d 20 69 73 54 65  0);.  iDb = isTe
3df0: 6d 70 20 3f 20 31 20 3a 20 64 62 2d 3e 69 6e 69  mp ? 1 : db->ini
3e00: 74 2e 69 44 62 3b 0a 20 20 69 66 28 20 70 54 61  t.iDb;.  if( pTa
3e10: 62 6c 65 21 3d 30 20 26 26 20 28 70 54 61 62 6c  ble!=0 && (pTabl
3e20: 65 2d 3e 69 44 62 3d 3d 69 44 62 20 7c 7c 20 21  e->iDb==iDb || !
3e30: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29  db->init.busy) )
3e40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
3e50: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
3e60: 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20  able %T already 
3e70: 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b  exists", pName);
3e80: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
3e90: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
3ea0: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  rn;.  }.  if( (p
3eb0: 49 64 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Idx = sqlite3Fin
3ec0: 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
3ed0: 2c 20 30 29 29 21 3d 30 20 26 26 0a 20 20 20 20  , 0))!=0 &&.    
3ee0: 20 20 20 20 20 20 28 70 49 64 78 2d 3e 69 44 62        (pIdx->iDb
3ef0: 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74  ==0 || !db->init
3f00: 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 73 71  .busy) ){.    sq
3f10: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3f20: 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20  arse, "there is 
3f30: 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78  already an index
3f40: 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d   named %s", zNam
3f50: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
3f60: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ee(zName);.    r
3f70: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61  eturn;.  }.  pTa
3f80: 62 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ble = sqliteMall
3f90: 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  oc( sizeof(Table
3fa0: 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  ) );.  if( pTabl
3fb0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  e==0 ){.    sqli
3fc0: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
3fd0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
3fe0: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d   pTable->zName =
3ff0: 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65   zName;.  pTable
4000: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54  ->nCol = 0;.  pT
4010: 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  able->aCol = 0;.
4020: 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20    pTable->iPKey 
4030: 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  = -1;.  pTable->
4040: 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54  pIndex = 0;.  pT
4050: 61 62 6c 65 2d 3e 69 44 62 20 3d 20 69 44 62 3b  able->iDb = iDb;
4060: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70  .  if( pParse->p
4070: 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c 69 74  NewTable ) sqlit
4080: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
4090: 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  , pParse->pNewTa
40a0: 62 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  ble);.  pParse->
40b0: 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62  pNewTable = pTab
40c0: 6c 65 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  le;..  /* Begin 
40d0: 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63  generating the c
40e0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
40f0: 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72  sert the table r
4100: 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20  ecord into.  ** 
4110: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
4120: 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69  R table.  Note i
4130: 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61  n particular tha
4140: 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65  t we must go ahe
4150: 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f  ad.  ** and allo
4160: 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20  cate the record 
4170: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
4180: 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20  able entry now. 
4190: 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a   Before any.  **
41a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
41b0: 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20  UNIQUE keywords 
41c0: 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f  are parsed.  Tho
41d0: 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c  se keywords will
41e0: 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69   cause.  ** indi
41f0: 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65  ces to be create
4200: 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  d and the table 
4210: 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65  record must come
4220: 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a   before the .  *
4230: 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63  * indices.  Henc
4240: 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  e, the record nu
4250: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
4260: 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63  le must be alloc
4270: 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20  ated.  ** now.. 
4280: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
4290: 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d  nit.busy && (v =
42a0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
42b0: 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20  pParse))!=0 ){. 
42c0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
42d0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
42e0: 61 72 73 65 2c 20 30 2c 20 69 73 54 65 6d 70 29  arse, 0, isTemp)
42f0: 3b 0a 20 20 20 20 69 66 28 20 21 69 73 54 65 6d  ;.    if( !isTem
4300: 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
4310: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4320: 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 66  P_Integer, db->f
4330: 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 30 29 3b 0a  ile_format, 0);.
4340: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4350: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
4360: 43 6f 6f 6b 69 65 2c 20 30 2c 20 31 29 3b 0a 20  Cookie, 0, 1);. 
4370: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
4380: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
4390: 76 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20 20  v, isTemp);.    
43a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
43b0: 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c  (v, OP_NewRecno,
43c0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
43d0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
43e0: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
43f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4400: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
4410: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
4420: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4430: 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30   OP_PutIntKey, 0
4440: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
4450: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c  ** Add a new col
4460: 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65  umn to the table
4470: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
4480: 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a   constructed..**
4490: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
44a0: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
44b0: 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  e once for each 
44c0: 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  column declarati
44d0: 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54  on.** in a CREAT
44e0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
44f0: 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  t.  sqlite3Start
4500: 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c  Table() gets cal
4510: 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20  led.** first to 
4520: 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67  get things going
4530: 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75  .  Then this rou
4540: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
4550: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d  or each.** colum
4560: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
4570: 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73  e3AddColumn(Pars
4580: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
4590: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c   *pName){.  Tabl
45a0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
45b0: 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20   char *z = 0;.  
45c0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
45d0: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
45e0: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
45f0: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
4600: 65 33 53 65 74 4e 53 74 72 69 6e 67 28 26 7a 2c  e3SetNString(&z,
4610: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
4620: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 69 66 28 20 7a  ->n, 0);.  if( z
4630: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
4640: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
4650: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
4660: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
4670: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
4680: 72 49 43 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c  rICmp(z, p->aCol
4690: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
46a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
46b0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
46c0: 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e  duplicate column
46d0: 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a   name: %s", z);.
46e0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
46f0: 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (z);.      retur
4700: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  n;.    }.  }.  i
4710: 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78  f( (p->nCol & 0x
4720: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c  7)==0 ){.    Col
4730: 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61  umn *aNew;.    a
4740: 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
4750: 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70  loc( p->aCol, (p
4760: 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66  ->nCol+8)*sizeof
4770: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
4780: 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
4790: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 2d 3e   return;.    p->
47a0: 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d  aCol = aNew;.  }
47b0: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43  .  pCol = &p->aC
47c0: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d  ol[p->nCol];.  m
47d0: 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73  emset(pCol, 0, s
47e0: 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d  izeof(p->aCol[0]
47f0: 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  ));.  pCol->zNam
4800: 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66  e = z;. .  /* If
4810: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70   there is no typ
4820: 65 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c  e specified, col
4830: 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64 65  umns have the de
4840: 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20  fault affinity. 
4850: 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74   ** 'NONE'. If t
4860: 68 65 72 65 20 69 73 20 61 20 74 79 70 65 20 73  here is a type s
4870: 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73  pecified, then s
4880: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54  qlite3AddColumnT
4890: 79 70 65 28 29 0a 20 20 2a 2a 20 77 69 6c 6c 20  ype().  ** will 
48a0: 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74 20 74  be called next t
48b0: 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69  o set pCol->affi
48c0: 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a  nity correctly..
48d0: 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66    */.  pCol->aff
48e0: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
48f0: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 6e 43  FF_NONE;.  p->nC
4900: 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ol++;.}../*.** T
4910: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
4920: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
4930: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
4940: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
4950: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
4960: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
4970: 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f   A "NOT NULL" co
4980: 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20  nstraint has.** 
4990: 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63  been seen on a c
49a0: 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75  olumn.  This rou
49b0: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f  tine sets the no
49c0: 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a  tNull flag on.**
49d0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72   the column curr
49e0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
49f0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
4a00: 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e  d sqlite3AddNotN
4a10: 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73  ull(Parse *pPars
4a20: 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b  e, int onError){
4a30: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
4a40: 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d  nt i;.  if( (p =
4a50: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
4a60: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
4a70: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
4a80: 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70  ;.  if( i>=0 ) p
4a90: 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c  ->aCol[i].notNul
4aa0: 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a  l = onError;.}..
4ab0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4ac0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
4ad0: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
4ae0: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
4af0: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
4b00: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
4b10: 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72  ement.  The pFir
4b20: 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20  st token is the 
4b30: 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69  first.** token i
4b40: 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f  n the sequence o
4b50: 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65  f tokens that de
4b60: 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20  scribe the type 
4b70: 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e  of the.** column
4b80: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
4b90: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
4ba0: 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61   pLast is the la
4bb0: 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74  st token.** in t
4bc0: 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73  he sequence.  Us
4bd0: 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  e this informati
4be0: 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  on to construct 
4bf0: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74  a string.** that
4c00: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79   contains the ty
4c10: 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  pename of the co
4c20: 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74  lumn and store t
4c30: 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e  hat string.** in
4c40: 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64   zType..*/ .void
4c50: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
4c60: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
4c70: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 46 69 72  rse, Token *pFir
4c80: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74  st, Token *pLast
4c90: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
4ca0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
4cb0: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a   n;.  char *z, *
4cc0: 2a 70 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  *pz;.  Column *p
4cd0: 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  Col;.  if( (p = 
4ce0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4cf0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
4d00: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
4d10: 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74  .  if( i<0 ) ret
4d20: 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70  urn;.  pCol = &p
4d30: 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 70 7a 20  ->aCol[i];.  pz 
4d40: 3d 20 26 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a  = &pCol->zType;.
4d50: 20 20 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b    n = pLast->n +
4d60: 20 41 64 64 72 28 70 4c 61 73 74 2d 3e 7a 29 20   Addr(pLast->z) 
4d70: 2d 20 41 64 64 72 28 70 46 69 72 73 74 2d 3e 7a  - Addr(pFirst->z
4d80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 74 4e  );.  sqlite3SetN
4d90: 53 74 72 69 6e 67 28 70 7a 2c 20 70 46 69 72 73  String(pz, pFirs
4da0: 74 2d 3e 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 7a  t->z, n, 0);.  z
4db0: 20 3d 20 2a 70 7a 3b 0a 20 20 69 66 28 20 7a 3d   = *pz;.  if( z=
4dc0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
4dd0: 6f 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20  or(i=j=0; z[i]; 
4de0: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 20  i++){.    int c 
4df0: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  = z[i];.    if( 
4e00: 69 73 73 70 61 63 65 28 63 29 20 29 20 63 6f 6e  isspace(c) ) con
4e10: 74 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b  tinue;.    z[j++
4e20: 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a  ] = c;.  }.  z[j
4e30: 5d 20 3d 20 30 3b 0a 2f 2f 20 20 70 43 6f 6c 2d  ] = 0;.//  pCol-
4e40: 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 73 71 6c  >sortOrder = sql
4e50: 69 74 65 33 43 6f 6c 6c 61 74 65 54 79 70 65 28  ite3CollateType(
4e60: 7a 2c 20 6e 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61  z, n);.  pCol->a
4e70: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
4e80: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a 2c  3AffinityType(z,
4e90: 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   n);.}../*.** Th
4ea0: 65 20 67 69 76 65 6e 20 74 6f 6b 65 6e 20 69 73  e given token is
4eb0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
4ec0: 75 65 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20  ue for the last 
4ed0: 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 0a  column added to.
4ee0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  ** the table cur
4ef0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
4f00: 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 22  struction.  If "
4f10: 6d 69 6e 75 73 46 6c 61 67 22 20 69 73 20 74 72  minusFlag" is tr
4f20: 75 65 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20  ue, it.** means 
4f30: 74 68 65 20 76 61 6c 75 65 20 74 6f 6b 65 6e 20  the value token 
4f40: 77 61 73 20 70 72 65 63 65 64 65 64 20 62 79 20  was preceded by 
4f50: 61 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a  a minus sign..**
4f60: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4f70: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
4f80: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
4f90: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
4fa0: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
4fb0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
4fc0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
4fd0: 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61  ite3AddDefaultVa
4fe0: 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lue(Parse *pPars
4ff0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20  e, Token *pVal, 
5000: 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a  int minusFlag){.
5010: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
5020: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a  t i;.  char **pz
5030: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
5040: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
5050: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
5060: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
5070: 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
5080: 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f  ;.  pz = &p->aCo
5090: 6c 5b 69 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69 66  l[i].zDflt;.  if
50a0: 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20  ( minusFlag ){. 
50b0: 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74     sqlite3SetNSt
50c0: 72 69 6e 67 28 70 7a 2c 20 22 2d 22 2c 20 31 2c  ring(pz, "-", 1,
50d0: 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e   pVal->z, pVal->
50e0: 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n, 0);.  }else{.
50f0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53      sqlite3SetNS
5100: 74 72 69 6e 67 28 70 7a 2c 20 70 56 61 6c 2d 3e  tring(pz, pVal->
5110: 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a  z, pVal->n, 0);.
5120: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 71    }.  sqlite3Deq
5130: 75 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a  uote(*pz);.}../*
5140: 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68  .** Designate th
5150: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f  e PRIMARY KEY fo
5160: 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c  r the table.  pL
5170: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
5180: 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f   names .** of co
5190: 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20  lumns that form 
51a0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
51b0: 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55    If pList is NU
51c0: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  LL, then the.** 
51d0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
51e0: 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ded column of th
51f0: 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70  e table is the p
5200: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a  rimary key..**.*
5210: 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61  * A table can ha
5220: 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70  ve at most one p
5230: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
5240: 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
5250: 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61  y has.** a prima
5260: 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73  ry key (and this
5270: 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   is the second p
5280: 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e  rimary key) then
5290: 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72   create an.** er
52a0: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ror..**.** If th
52b0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
52c0: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   on a single col
52d0: 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79  umn whose dataty
52e0: 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a  pe is INTEGER,.*
52f0: 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74  * then we will t
5300: 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ry to use that c
5310: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77  olumn as the row
5320: 20 69 64 2e 20 20 28 45 78 63 65 70 74 69 6f 6e   id.  (Exception
5330: 3a 0a 2a 2a 20 46 6f 72 20 62 61 63 6b 77 61 72  :.** For backwar
5340: 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
5350: 20 77 69 74 68 20 6f 6c 64 65 72 20 64 61 74 61   with older data
5360: 62 61 73 65 73 2c 20 64 6f 20 6e 6f 74 20 64 6f  bases, do not do
5370: 20 74 68 69 73 0a 2a 2a 20 69 66 20 74 68 65 20   this.** if the 
5380: 66 69 6c 65 20 66 6f 72 6d 61 74 20 76 65 72 73  file format vers
5390: 69 6f 6e 20 6e 75 6d 62 65 72 20 69 73 20 6c 65  ion number is le
53a0: 73 73 20 74 68 61 6e 20 31 2e 29 20 20 53 65 74  ss than 1.)  Set
53b0: 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79   the Table.iPKey
53c0: 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
53d0: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
53e0: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
53f0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
5400: 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d  .** INTEGER PRIM
5410: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20  ARY KEY column. 
5420: 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20   Table.iPKey is 
5430: 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65  set to -1 if the
5440: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45  re is.** no INTE
5450: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
5460: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65  .**.** If the ke
5470: 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45  y is not an INTE
5480: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
5490: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75   then create a u
54a0: 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66  nique.** index f
54b0: 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20  or the key.  No 
54c0: 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
54d0: 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49   for INTEGER PRI
54e0: 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f  MARY KEYs..*/.vo
54f0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69  id sqlite3AddPri
5500: 6d 61 72 79 4b 65 79 28 50 61 72 73 65 20 2a 70  maryKey(Parse *p
5510: 50 61 72 73 65 2c 20 49 64 4c 69 73 74 20 2a 70  Parse, IdList *p
5520: 4c 69 73 74 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  List, int onErro
5530: 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  r){.  Table *pTa
5540: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
5550: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
5560: 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Type = 0;.  int 
5570: 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20  iCol = -1, i;.  
5580: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f  if( pTab==0 ) go
5590: 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  to primary_key_e
55a0: 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  xit;.  if( pTab-
55b0: 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a 20  >hasPrimKey ){. 
55c0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
55d0: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
55e0: 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20    "table \"%s\" 
55f0: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
5600: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20  e primary key", 
5610: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
5620: 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b    goto primary_k
5630: 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70  ey_exit;.  }.  p
5640: 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20  Tab->hasPrimKey 
5650: 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  = 1;.  if( pList
5660: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20  ==0 ){.    iCol 
5670: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31  = pTab->nCol - 1
5680: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c  ;.    pTab->aCol
5690: 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79  [iCol].isPrimKey
56a0: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
56b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
56c0: 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
56d0: 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30        for(iCol=0
56e0: 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ; iCol<pTab->nCo
56f0: 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
5700: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
5710: 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
5720: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i].zName, pTab->
5730: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
5740: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
5750: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
5760: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  iCol<pTab->nCol 
5770: 29 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ) pTab->aCol[iCo
5780: 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31  l].isPrimKey = 1
5790: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
57a0: 70 4c 69 73 74 2d 3e 6e 49 64 3e 31 20 29 20 69  pList->nId>1 ) i
57b0: 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20  Col = -1;.  }.  
57c0: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69  if( iCol>=0 && i
57d0: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  Col<pTab->nCol )
57e0: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54  {.    zType = pT
57f0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
5800: 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Type;.  }.  if( 
5810: 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 33  zType && sqlite3
5820: 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22  StrICmp(zType, "
5830: 49 4e 54 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a  INTEGER")==0 ){.
5840: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
5850: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62  = iCol;.    pTab
5860: 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72  ->keyConf = onEr
5870: 72 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ror;.  }else{.  
5880: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49    sqlite3CreateI
5890: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20  ndex(pParse, 0, 
58a0: 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f  0, pList, onErro
58b0: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 4c  r, 0, 0);.    pL
58c0: 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72  ist = 0;.  }..pr
58d0: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a  imary_key_exit:.
58e0: 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
58f0: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
5900: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
5910: 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   Return the appr
5920: 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e  opriate collatin
5930: 67 20 74 79 70 65 20 67 69 76 65 6e 20 61 20 74  g type given a t
5940: 79 70 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ype name..**.** 
5950: 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79  The collation ty
5960: 70 65 20 69 73 20 74 65 78 74 20 28 53 51 4c 49  pe is text (SQLI
5970: 54 45 5f 53 4f 5f 54 45 58 54 29 20 69 66 20 74  TE_SO_TEXT) if t
5980: 68 65 20 74 79 70 65 0a 2a 2a 20 6e 61 6d 65 20  he type.** name 
5990: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 68 61  contains the cha
59a0: 72 61 63 74 65 72 20 73 74 72 65 61 6d 20 22 74  racter stream "t
59b0: 65 78 74 22 20 6f 72 20 22 62 6c 6f 62 22 20 6f  ext" or "blob" o
59c0: 72 0a 2a 2a 20 22 63 6c 6f 62 22 2e 20 20 41 6e  r.** "clob".  An
59d0: 79 20 6f 74 68 65 72 20 74 79 70 65 20 6e 61 6d  y other type nam
59e0: 65 20 69 73 20 63 6f 6c 6c 61 74 65 64 20 61 73  e is collated as
59f0: 20 6e 75 6d 65 72 69 63 0a 2a 2a 20 28 53 51 4c   numeric.** (SQL
5a00: 49 54 45 5f 53 4f 5f 4e 55 4d 29 2e 0a 2a 2f 0a  ITE_SO_NUM)..*/.
5a10: 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61  int sqlite3Colla
5a20: 74 65 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61  teType(const cha
5a30: 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54  r *zType, int nT
5a40: 79 70 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ype){.  int i;. 
5a50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 79 70   for(i=0; i<nTyp
5a60: 65 2d 33 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  e-3; i++){.    i
5a70: 6e 74 20 63 20 3d 20 2a 28 7a 54 79 70 65 2b 2b  nt c = *(zType++
5a80: 29 20 7c 20 30 78 36 30 3b 0a 20 20 20 20 69 66  ) | 0x60;.    if
5a90: 28 20 28 63 3d 3d 27 62 27 20 7c 7c 20 63 3d 3d  ( (c=='b' || c==
5aa0: 27 63 27 29 20 26 26 20 73 71 6c 69 74 65 33 53  'c') && sqlite3S
5ab0: 74 72 4e 49 43 6d 70 28 7a 54 79 70 65 2c 20 22  trNICmp(zType, "
5ac0: 6c 6f 62 22 2c 20 33 29 3d 3d 30 20 29 7b 0a 20  lob", 3)==0 ){. 
5ad0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
5ae0: 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20  TE_SO_TEXT;.    
5af0: 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 63 27  }.    if( c=='c'
5b00: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
5b10: 43 6d 70 28 7a 54 79 70 65 2c 20 22 68 61 72 22  Cmp(zType, "har"
5b20: 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 3)==0 ){.     
5b30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53   return SQLITE_S
5b40: 4f 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  O_TEXT;.    }.  
5b50: 20 20 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20    if( c=='t' && 
5b60: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
5b70: 7a 54 79 70 65 2c 20 22 65 78 74 22 2c 20 33 29  zType, "ext", 3)
5b80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
5b90: 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45  urn SQLITE_SO_TE
5ba0: 58 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  XT;.    }.  }.  
5bb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f  return SQLITE_SO
5bc0: 5f 4e 55 4d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  _NUM;.}../*.** T
5bd0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
5be0: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
5bf0: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
5c00: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
5c10: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
5c20: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
5c30: 20 41 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c 61   A "COLLATE" cla
5c40: 75 73 65 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  use has.** been 
5c50: 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  seen on a column
5c60: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
5c70: 73 65 74 73 20 74 68 65 20 43 6f 6c 75 6d 6e 2e  sets the Column.
5c80: 73 6f 72 74 4f 72 64 65 72 20 6f 6e 0a 2a 2a 20  sortOrder on.** 
5c90: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  the column curre
5ca0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
5cb0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
5cc0: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61   sqlite3AddColla
5cd0: 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  teType(Parse *pP
5ce0: 61 72 73 65 2c 20 69 6e 74 20 63 6f 6c 6c 54 79  arse, int collTy
5cf0: 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  pe){.  Table *p;
5d00: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
5d10: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
5d20: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
5d30: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
5d40: 6f 6c 2d 31 3b 0a 0a 20 20 2f 2a 20 46 49 58 20  ol-1;..  /* FIX 
5d50: 4d 45 20 2a 2f 0a 20 20 2f 2a 20 69 66 28 20 69  ME */.  /* if( i
5d60: 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d  >=0 ) p->aCol[i]
5d70: 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 63 6f 6c  .sortOrder = col
5d80: 6c 54 79 70 65 3b 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  lType; */.}../*.
5d90: 2a 2a 20 50 61 72 73 65 20 74 68 65 20 63 6f 6c  ** Parse the col
5da0: 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54  umn type name zT
5db0: 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70  ype (length nTyp
5dc0: 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  e) and return th
5dd0: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
5de0: 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a  affinity type..*
5df0: 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66  /.char sqlite3Af
5e00: 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74  finityType(const
5e10: 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e   char *zType, in
5e20: 74 20 6e 54 79 70 65 29 7b 0a 20 20 2f 2a 20 46  t nType){.  /* F
5e30: 49 58 20 4d 45 3a 20 54 68 69 73 20 63 6f 75 6c  IX ME: This coul
5e40: 64 20 62 65 20 64 6f 6e 65 20 6d 6f 72 65 20 65  d be done more e
5e50: 66 66 69 63 69 65 6e 74 6c 79 20 2a 2f 0a 20 20  fficiently */.  
5e60: 69 6e 74 20 6e 2c 20 69 3b 0a 20 20 73 74 72 75  int n, i;.  stru
5e70: 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ct {.    const c
5e80: 68 61 72 20 2a 7a 53 75 62 3b 0a 20 20 20 20 69  har *zSub;.    i
5e90: 6e 74 20 6e 53 75 62 3b 0a 20 20 20 20 63 68 61  nt nSub;.    cha
5ea0: 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 7d 20  r affinity;.  } 
5eb0: 73 75 62 73 74 72 69 6e 67 73 5b 5d 20 3d 20 7b  substrings[] = {
5ec0: 0a 20 20 20 20 7b 22 49 4e 54 22 2c 20 33 2c 20  .    {"INT", 3, 
5ed0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
5ee0: 45 52 7d 2c 0a 20 20 20 20 7b 22 52 45 41 4c 22  ER},.    {"REAL"
5ef0: 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  , 4, SQLITE_AFF_
5f00: 4e 55 4d 45 52 49 43 7d 2c 0a 20 20 20 20 7b 22  NUMERIC},.    {"
5f10: 46 4c 4f 41 54 22 2c 20 35 2c 20 53 51 4c 49 54  FLOAT", 5, SQLIT
5f20: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 7d 2c 0a  E_AFF_NUMERIC},.
5f30: 20 20 20 20 7b 22 44 4f 55 42 4c 45 22 2c 20 36      {"DOUBLE", 6
5f40: 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  , SQLITE_AFF_NUM
5f50: 45 52 49 43 7d 2c 0a 20 20 20 20 7b 22 4e 55 4d  ERIC},.    {"NUM
5f60: 22 2c 20 33 2c 20 53 51 4c 49 54 45 5f 41 46 46  ", 3, SQLITE_AFF
5f70: 5f 4e 55 4d 45 52 49 43 7d 2c 0a 20 20 20 20 7b  _NUMERIC},.    {
5f80: 22 43 48 41 52 22 2c 20 34 2c 20 53 51 4c 49 54  "CHAR", 4, SQLIT
5f90: 45 5f 41 46 46 5f 54 45 58 54 7d 2c 0a 20 20 20  E_AFF_TEXT},.   
5fa0: 20 7b 22 43 4c 4f 42 22 2c 20 34 2c 20 53 51 4c   {"CLOB", 4, SQL
5fb0: 49 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c 0a 20  ITE_AFF_TEXT},. 
5fc0: 20 20 20 7b 22 54 45 58 54 22 2c 20 34 2c 20 53     {"TEXT", 4, S
5fd0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 7d 0a  QLITE_AFF_TEXT}.
5fe0: 20 20 7d 3b 0a 0a 20 20 66 6f 72 28 6e 3d 30 3b    };..  for(n=0;
5ff0: 20 6e 3c 28 6e 54 79 70 65 2d 33 29 3b 20 6e 2b   n<(nType-3); n+
6000: 2b 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  +){.    for(i=0;
6010: 20 69 3c 73 69 7a 65 6f 66 28 73 75 62 73 74 72   i<sizeof(substr
6020: 69 6e 67 73 29 2f 73 69 7a 65 6f 66 28 73 75 62  ings)/sizeof(sub
6030: 73 74 72 69 6e 67 73 5b 30 5d 29 3b 20 69 2b 2b  strings[0]); i++
6040: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ){.      if( 0==
6050: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
6060: 7a 54 79 70 65 2c 20 73 75 62 73 74 72 69 6e 67  zType, substring
6070: 73 5b 69 5d 2e 7a 53 75 62 2c 20 73 75 62 73 74  s[i].zSub, subst
6080: 72 69 6e 67 73 5b 69 5d 2e 6e 53 75 62 29 20 29  rings[i].nSub) )
6090: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
60a0: 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 61   substrings[i].a
60b0: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 7d  ffinity;.      }
60c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
60d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
60e0: 4e 4f 4e 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  NONE;.}../*.** C
60f0: 6f 6d 65 20 75 70 20 77 69 74 68 20 61 20 6e 65  ome up with a ne
6100: 77 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 66  w random value f
6110: 6f 72 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  or the schema co
6120: 6f 6b 69 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  okie.  Make sure
6130: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 76 61 6c 75  .** the new valu
6140: 65 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  e is different f
6150: 72 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a 2a 2a 0a  rom the old..**.
6160: 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f  ** The schema co
6170: 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20  okie is used to 
6180: 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74  determine when t
6190: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
61a0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68  e.** database ch
61b0: 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61  anges.  After ea
61c0: 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ch schema change
61d0: 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c  , the cookie val
61e0: 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  ue.** changes.  
61f0: 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66  When a process f
6200: 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73  irst reads the s
6210: 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73  chema it records
6220: 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20   the.** cookie. 
6230: 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65   Thereafter, whe
6240: 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f  never it goes to
6250: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
6260: 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63  base,.** it chec
6270: 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  ks the cookie to
6280: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
6290: 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68  chema has not ch
62a0: 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69  anged.** since i
62b0: 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e  t was last read.
62c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e  .**.** This plan
62d0: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   is not complete
62e0: 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e  ly bullet-proof.
62f0: 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65    It is possible
6300: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65   for.** the sche
6310: 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c  ma to change mul
6320: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20  tiple times and 
6330: 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  for the cookie t
6340: 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b  o be.** set back
6350: 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e   to prior value.
6360: 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61    But schema cha
6370: 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75  nges are infrequ
6380: 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70  ent.** and the p
6390: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69  robability of hi
63a0: 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  tting the same c
63b0: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f  ookie value is o
63c0: 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20  nly.** 1 chance 
63d0: 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27  in 2^32.  So we'
63e0: 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a  re safe enough..
63f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
6400: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69  hangeCookie(sqli
6410: 74 65 20 2a 64 62 2c 20 56 64 62 65 20 2a 76 29  te *db, Vdbe *v)
6420: 7b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 65 78 74  {.  if( db->next
6430: 5f 63 6f 6f 6b 69 65 3d 3d 64 62 2d 3e 61 44 62  _cookie==db->aDb
6440: 5b 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  [0].schema_cooki
6450: 65 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65  e ){.    unsigne
6460: 64 20 63 68 61 72 20 72 3b 0a 20 20 20 20 73 71  d char r;.    sq
6470: 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28  lite3Randomness(
6480: 31 2c 20 26 72 29 3b 0a 20 20 20 20 64 62 2d 3e  1, &r);.    db->
6490: 6e 65 78 74 5f 63 6f 6f 6b 69 65 20 3d 20 64 62  next_cookie = db
64a0: 2d 3e 61 44 62 5b 30 5d 2e 73 63 68 65 6d 61 5f  ->aDb[0].schema_
64b0: 63 6f 6f 6b 69 65 20 2b 20 72 20 2b 20 31 3b 0a  cookie + r + 1;.
64c0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
64d0: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
64e0: 61 6e 67 65 73 3b 0a 20 20 20 20 73 71 6c 69 74  anges;.    sqlit
64f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6500: 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 6e  P_Integer, db->n
6510: 65 78 74 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a  ext_cookie, 0);.
6520: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6530: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
6540: 6f 6b 69 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  okie, 0, 0);.  }
6550: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
6560: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
6570: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
6580: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
6590: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
65a0: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
65b0: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
65c0: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
65d0: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
65e0: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
65f0: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
6600: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64  */.static int id
6610: 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20  entLength(const 
6620: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
6630: 6e 3b 0a 20 20 69 6e 74 20 6e 65 65 64 51 75 6f  n;.  int needQuo
6640: 74 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6e 3d  te = 0;.  for(n=
6650: 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29  0; *z; n++, z++)
6660: 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c  {.    if( *z=='\
6670: 27 27 20 29 7b 20 6e 2b 2b 3b 20 6e 65 65 64 51  '' ){ n++; needQ
6680: 75 6f 74 65 3d 31 3b 20 7d 0a 20 20 7d 0a 20 20  uote=1; }.  }.  
6690: 72 65 74 75 72 6e 20 6e 20 2b 20 6e 65 65 64 51  return n + needQ
66a0: 75 6f 74 65 2a 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  uote*2;.}../*.**
66b0: 20 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69   Write an identi
66c0: 66 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e  fier onto the en
66d0: 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73  d of the given s
66e0: 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71  tring.  Add.** q
66f0: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20  uote characters 
6700: 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  as needed..*/.st
6710: 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50  atic void identP
6720: 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  ut(char *z, int 
6730: 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 49 64  *pIdx, char *zId
6740: 65 6e 74 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  ent){.  int i, j
6750: 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69  , needQuote;.  i
6760: 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28   = *pIdx;.  for(
6770: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
6780: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69  j++){.    if( !i
6790: 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d  salnum(zIdent[j]
67a0: 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d  ) && zIdent[j]!=
67b0: 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  '_' ) break;.  }
67c0: 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20  .  needQuote =  
67d0: 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20  zIdent[j]!=0 || 
67e0: 69 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30  isdigit(zIdent[0
67f0: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]).             
6800: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b       || sqlite3K
6810: 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e  eywordCode(zIden
6820: 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20  t, j)!=TK_ID;.  
6830: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
6840: 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20  z[i++] = '\'';. 
6850: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
6860: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a  [j]; j++){.    z
6870: 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a  [i++] = zIdent[j
6880: 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e  ];.    if( zIden
6890: 74 5b 6a 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b 69  t[j]=='\'' ) z[i
68a0: 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a  ++] = '\'';.  }.
68b0: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
68c0: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b  ) z[i++] = '\'';
68d0: 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a  .  z[i] = 0;.  *
68e0: 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a  pIdx = i;.}../*.
68f0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52  ** Generate a CR
6900: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
6910: 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65  ment appropriate
6920: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
6930: 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79  * table.  Memory
6940: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78   to hold the tex
6950: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
6960: 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  nt is obtained.*
6970: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  * from sqliteMal
6980: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
6990: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
69a0: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
69b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
69c0: 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74  *createTableStmt
69d0: 28 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e  (Table *p){.  in
69e0: 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61  t i, k, n;.  cha
69f0: 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72  r *zStmt;.  char
6a00: 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20   *zSep, *zSep2, 
6a10: 2a 7a 45 6e 64 3b 0a 20 20 6e 20 3d 20 30 3b 0a  *zEnd;.  n = 0;.
6a20: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
6a30: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
6a40: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
6a50: 28 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  (p->aCol[i].zNam
6a60: 65 29 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69  e);.  }.  n += i
6a70: 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e  dentLength(p->zN
6a80: 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 34 30  ame);.  if( n<40
6a90: 20 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22   ){.    zSep = "
6aa0: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
6ab0: 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22  ,";.    zEnd = "
6ac0: 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  )";.  }else{.   
6ad0: 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a   zSep = "\n  ";.
6ae0: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e      zSep2 = ",\n
6af0: 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20    ";.    zEnd = 
6b00: 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b  "\n)";.  }.  n +
6b10: 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c  = 35 + 6*p->nCol
6b20: 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69  ;.  zStmt = sqli
6b30: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29  teMallocRaw( n )
6b40: 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30  ;.  if( zStmt==0
6b50: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
6b60: 74 72 63 70 79 28 7a 53 74 6d 74 2c 20 70 2d 3e  trcpy(zStmt, p->
6b70: 69 44 62 3d 3d 31 20 3f 20 22 43 52 45 41 54 45  iDb==1 ? "CREATE
6b80: 20 54 45 4d 50 20 54 41 42 4c 45 20 22 20 3a 20   TEMP TABLE " : 
6b90: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 29  "CREATE TABLE ")
6ba0: 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a  ;.  k = strlen(z
6bb0: 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75  Stmt);.  identPu
6bc0: 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e  t(zStmt, &k, p->
6bd0: 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b  zName);.  zStmt[
6be0: 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f  k++] = '(';.  fo
6bf0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
6c00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63  ; i++){.    strc
6c10: 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53  py(&zStmt[k], zS
6c20: 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74  ep);.    k += st
6c30: 72 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b  rlen(&zStmt[k]);
6c40: 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70  .    zSep = zSep
6c50: 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28  2;.    identPut(
6c60: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 61 43  zStmt, &k, p->aC
6c70: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[i].zName);.  
6c80: 7d 0a 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d  }.  strcpy(&zStm
6c90: 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20 72  t[k], zEnd);.  r
6ca0: 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a  eturn zStmt;.}..
6cb0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
6cc0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
6cd0: 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c  report the final
6ce0: 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e   ")" that termin
6cf0: 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45  ates.** a CREATE
6d00: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
6d10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
6d20: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
6d30: 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f   other action ro
6d40: 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e  utines have been
6d50: 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20   building.** is 
6d60: 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74  added to the int
6d70: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
6d80: 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65  s, assuming no e
6d90: 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63  rrors have.** oc
6da0: 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  curred..**.** An
6db0: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74   entry for the t
6dc0: 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20  able is made in 
6dd0: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
6de0: 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73   on disk, unless
6df0: 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65  .** this is a te
6e00: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
6e10: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
6e20: 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69  1.  When db->ini
6e30: 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20  t.busy==1.** it 
6e40: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
6e50: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
6e60: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
6e70: 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20  ause we just.** 
6e80: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65  connected to the
6e90: 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63   database or bec
6ea0: 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  ause the sqlite_
6eb0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73  master table has
6ec0: 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61  .** recently cha
6ed0: 6e 67 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74  nges, so the ent
6ee0: 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
6ef0: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
6f00: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   in.** the sqlit
6f10: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
6f20: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
6f30: 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61  to create it aga
6f40: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  in..**.** If the
6f50: 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e   pSelect argumen
6f60: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  t is not NULL, i
6f70: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  t means that thi
6f80: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73  s routine.** was
6f90: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
6fa0: 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61  e a table genera
6fb0: 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22  ted from a .** "
6fc0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e  CREATE TABLE ...
6fd0: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20   AS SELECT ..." 
6fe0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
6ff0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a  column names of.
7000: 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
7010: 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20   will match the 
7020: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
7030: 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
7040: 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  d sqlite3EndTabl
7050: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
7060: 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65   Token *pEnd, Se
7070: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
7080: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71    Table *p;.  sq
7090: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
70a0: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70  e->db;..  if( (p
70b0: 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63  End==0 && pSelec
70c0: 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d  t==0) || pParse-
70d0: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
70e0: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
70f0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70   return;.  p = p
7100: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
7110: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
7120: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  eturn;..  /* If 
7130: 74 68 65 20 74 61 62 6c 65 20 69 73 20 67 65 6e  the table is gen
7140: 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 53 45  erated from a SE
7150: 4c 45 43 54 2c 20 74 68 65 6e 20 63 6f 6e 73 74  LECT, then const
7160: 72 75 63 74 20 74 68 65 0a 20 20 2a 2a 20 6c 69  ruct the.  ** li
7170: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 6e  st of columns an
7180: 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68  d the text of th
7190: 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  e table..  */.  
71a0: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
71b0: 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61     Table *pSelTa
71c0: 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
71d0: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
71e0: 72 73 65 2c 20 30 2c 20 70 53 65 6c 65 63 74 29  rse, 0, pSelect)
71f0: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 54 61  ;.    if( pSelTa
7200: 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  b==0 ) return;. 
7210: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43     assert( p->aC
7220: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  ol==0 );.    p->
7230: 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  nCol = pSelTab->
7240: 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 43 6f  nCol;.    p->aCo
7250: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
7260: 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  l;.    pSelTab->
7270: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53  nCol = 0;.    pS
7280: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
7290: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
72a0: 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54  teTable(0, pSelT
72b0: 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ab);.  }..  /* I
72c0: 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
72d0: 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e  usy is 1 it mean
72e0: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
72f0: 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
7300: 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
7310: 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65  ster" or "sqlite
7320: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61  _temp_master" ta
7330: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
7340: 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20  .  ** So do not 
7350: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73  write to the dis
7360: 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63  k again.  Extrac
7370: 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
7380: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
7390: 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
73a0: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  he db->init.newT
73b0: 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65  num field.  (The
73c0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
73d0: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  * should have be
73e0: 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20  en put there by 
73f0: 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62  the sqliteOpenCb
7400: 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a   routine.).  */.
7410: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
7420: 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e  usy ){.    p->tn
7430: 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
7440: 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  wTnum;.  }..  /*
7450: 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69   If not initiali
7460: 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74  zing, then creat
7470: 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74  e a record for t
7480: 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a  he new table.  *
7490: 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  * in the SQLITE_
74a0: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20  MASTER table of 
74b0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
74c0: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
74d0: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65  .  ** for the ne
74e0: 77 20 74 61 62 6c 65 20 65 6e 74 72 79 20 73 68  w table entry sh
74f0: 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
7500: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  on the stack..  
7510: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  **.  ** If this 
7520: 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74  is a TEMPORARY t
7530: 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20  able, write the 
7540: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61  entry into the a
7550: 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69  uxiliary.  ** fi
7560: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
7570: 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
7580: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
7590: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
75a0: 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  busy ){.    int 
75b0: 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  n;.    Vdbe *v;.
75c0: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
75d0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
75e0: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
75f0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20  return;.    if( 
7600: 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  p->pSelect==0 ){
7610: 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75  .      /* A regu
7620: 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  lar table */.   
7630: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
7640: 33 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61  3(v, OP_CreateTa
7650: 62 6c 65 2c 20 30 2c 20 70 2d 3e 69 44 62 2c 20  ble, 0, p->iDb, 
7660: 28 63 68 61 72 2a 29 26 70 2d 3e 74 6e 75 6d 2c  (char*)&p->tnum,
7670: 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20   P3_POINTER);.  
7680: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
7690: 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  * A view */.    
76a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
76b0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
76c0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
76d0: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a     p->tnum = 0;.
76e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
76f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c  ddOp(v, OP_Pull,
7700: 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   1, 0);.    sqli
7710: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
7720: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20 70  _String, 0, 0, p
7730: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 3f 22 74 61  ->pSelect==0?"ta
7740: 62 6c 65 22 3a 22 76 69 65 77 22 2c 20 50 33 5f  ble":"view", P3_
7750: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
7760: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
7770: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20  P_String, 0, 0, 
7780: 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  p->zName, 0);.  
7790: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
77a0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
77b0: 2c 20 30 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30  , 0, p->zName, 0
77c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
77d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
77e0: 70 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 73 71  p, 4, 0);.    sq
77f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
7800: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
7810: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c  0);.    if( pSel
7820: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ect ){.      cha
7830: 72 20 2a 7a 20 3d 20 63 72 65 61 74 65 54 61 62  r *z = createTab
7840: 6c 65 53 74 6d 74 28 70 29 3b 0a 20 20 20 20 20  leStmt(p);.     
7850: 20 6e 20 3d 20 7a 20 3f 20 73 74 72 6c 65 6e 28   n = z ? strlen(
7860: 7a 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 73 71  z) : 0;.      sq
7870: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7880: 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a  3(v, -1, z, n);.
7890: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
78a0: 28 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (z);.    }else{.
78b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
78c0: 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  nd!=0 );.      n
78d0: 20 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29   = Addr(pEnd->z)
78e0: 20 2d 20 41 64 64 72 28 70 50 61 72 73 65 2d 3e   - Addr(pParse->
78f0: 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 29 20 2b  sFirstToken.z) +
7900: 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
7910: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
7920: 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 73 46 69   -1, pParse->sFi
7930: 72 73 74 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a  rstToken.z, n);.
7940: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7950: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
7960: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20  _MakeRecord, 5, 
7970: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
7980: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
7990: 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b  utIntKey, 0, 0);
79a0: 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 69 44 62  .    if( !p->iDb
79b0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
79c0: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  3ChangeCookie(db
79d0: 2c 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , v);.    }.    
79e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
79f0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
7a00: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 65   0);.    if( pSe
7a10: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71  lect ){.      sq
7a20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
7a30: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 2d  , OP_Integer, p-
7a40: 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  >iDb, 0);.      
7a50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7a60: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
7a70: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  , 1, 0);.      p
7a80: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b  Parse->nTab = 2;
7a90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
7aa0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
7ab0: 6c 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c  lect, SRT_Table,
7ac0: 20 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   1, 0, 0, 0);.  
7ad0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
7ae0: 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  ndWriteOperation
7af0: 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20  (pParse);.  }.. 
7b00: 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c   /* Add the tabl
7b10: 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e to the in-memo
7b20: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
7b30: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
7b40: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
7b50: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30  arse->explain==0
7b60: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
7b70: 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  ==0 ){.    Table
7b80: 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65 79   *pOld;.    FKey
7b90: 20 2a 70 46 4b 65 79 3b 0a 20 20 20 20 70 4f 6c   *pFKey;.    pOl
7ba0: 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  d = sqlite3HashI
7bb0: 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70  nsert(&db->aDb[p
7bc0: 2d 3e 69 44 62 5d 2e 74 62 6c 48 61 73 68 2c 20  ->iDb].tblHash, 
7bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
7bf0: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d  zName, strlen(p-
7c00: 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20  >zName)+1, p);. 
7c10: 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20     if( pOld ){. 
7c20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
7c30: 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  pOld );  /* Mall
7c40: 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
7c50: 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49  led inside HashI
7c60: 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20  nsert() */.     
7c70: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
7c80: 20 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e     for(pFKey=p->
7c90: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46  pFKey; pFKey; pF
7ca0: 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74  Key=pFKey->pNext
7cb0: 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74  From){.      int
7cc0: 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46   nTo = strlen(pF
7cd0: 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20  Key->zTo) + 1;. 
7ce0: 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78       pFKey->pNex
7cf0: 74 54 6f 20 3d 20 73 71 6c 69 74 65 33 48 61 73  tTo = sqlite3Has
7d00: 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70  hFind(&db->aDb[p
7d10: 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 20 70 46  ->iDb].aFKey, pF
7d20: 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a  Key->zTo, nTo);.
7d30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73        sqlite3Has
7d40: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
7d50: 5b 70 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 20  [p->iDb].aFKey, 
7d60: 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c  pFKey->zTo, nTo,
7d70: 20 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20   pFKey);.    }. 
7d80: 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
7d90: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
7da0: 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20  ->nTable++;.    
7db0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
7dc0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
7dd0: 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s;.  }.}../*.** 
7de0: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
7df0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e   this routine in
7e00: 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
7e10: 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76   a new VIEW.*/.v
7e20: 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
7e30: 65 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a  eView(.  Parse *
7e40: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54  pParse,     /* T
7e50: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
7e60: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
7e70: 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68  Begin,     /* Th
7e80: 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
7e90: 68 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73  hat begins the s
7ea0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
7eb0: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20  ken *pName,     
7ec0: 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68   /* The token th
7ed0: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  at holds the nam
7ee0: 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f  e of the view */
7ef0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
7f00: 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43  ct,   /* A SELEC
7f10: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
7f20: 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
7f30: 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69   new view */.  i
7f40: 6e 74 20 69 73 54 65 6d 70 20 20 20 20 20 20 20  nt isTemp       
7f50: 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20    /* TRUE for a 
7f60: 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a  TEMPORARY view *
7f70: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
7f80: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73  .  int n;.  cons
7f90: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b  t char *z;.  Tok
7fa0: 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78  en sEnd;.  DbFix
7fb0: 65 72 20 73 46 69 78 3b 0a 0a 20 20 73 71 6c 69  er sFix;..  sqli
7fc0: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
7fd0: 61 72 73 65 2c 20 70 42 65 67 69 6e 2c 20 70 4e  arse, pBegin, pN
7fe0: 61 6d 65 2c 20 69 73 54 65 6d 70 2c 20 31 29 3b  ame, isTemp, 1);
7ff0: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
8000: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
8010: 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
8020: 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  nErr ){.    sqli
8030: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
8040: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
8050: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
8060: 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
8070: 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 70 2d  sFix, pParse, p-
8080: 3e 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e  >iDb, "view", pN
8090: 61 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69  ame).    && sqli
80a0: 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46  te3FixSelect(&sF
80b0: 69 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29  ix, pSelect).  )
80c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
80d0: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
80e0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
80f0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61    }..  /* Make a
8100: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74   copy of the ent
8110: 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ire SELECT state
8120: 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
8130: 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a  s the view..  **
8140: 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65   This will force
8150: 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f   all the Expr.to
8160: 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20  ken.z values to 
8170: 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  be dynamically. 
8180: 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61   ** allocated ra
8190: 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20  ther than point 
81a0: 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  to the input str
81b0: 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e  ing - which mean
81c0: 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79  s that.  ** they
81d0: 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66   will persist af
81e0: 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ter the current 
81f0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63  sqlite3_exec() c
8200: 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a  all returns..  *
8210: 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d  /.  p->pSelect =
8220: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
8230: 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  p(pSelect);.  sq
8240: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
8250: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66  e(pSelect);.  if
8260: 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69  ( !pParse->db->i
8270: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
8280: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
8290: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
82a0: 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , p);.  }..  /* 
82b0: 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f  Locate the end o
82c0: 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45  f the CREATE VIE
82d0: 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61  W statement.  Ma
82e0: 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f  ke sEnd point to
82f0: 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20  .  ** the end.. 
8300: 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61   */.  sEnd = pPa
8310: 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b  rse->sLastToken;
8320: 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d  .  if( sEnd.z[0]
8330: 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d  !=0 && sEnd.z[0]
8340: 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e  !=';' ){.    sEn
8350: 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20  d.z += sEnd.n;. 
8360: 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b   }.  sEnd.n = 0;
8370: 0a 20 20 6e 20 3d 20 28 28 69 6e 74 29 73 45 6e  .  n = ((int)sEn
8380: 64 2e 7a 29 20 2d 20 28 69 6e 74 29 70 42 65 67  d.z) - (int)pBeg
8390: 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 70 42 65  in->z;.  z = pBe
83a0: 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28  gin->z;.  while(
83b0: 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d   n>0 && (z[n-1]=
83c0: 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28  =';' || isspace(
83d0: 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b  z[n-1])) ){ n--;
83e0: 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a   }.  sEnd.z = &z
83f0: 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20  [n-1];.  sEnd.n 
8400: 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73  = 1;..  /* Use s
8410: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
8420: 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77   to add the view
8430: 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   to the SQLITE_M
8440: 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20  ASTER table */. 
8450: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
8460: 28 70 50 61 72 73 65 2c 20 26 73 45 6e 64 2c 20  (pParse, &sEnd, 
8470: 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  0);.  return;.}.
8480: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  ./*.** The Table
8490: 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c   structure pTabl
84a0: 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49  e is really a VI
84b0: 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  EW.  Fill in the
84c0: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
84d0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
84e0: 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62  view in the pTab
84f0: 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  le structure.  R
8500: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
8510: 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  .** of errors.  
8520: 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73  If an error is s
8530: 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72  een leave an err
8540: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
8550: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
8560: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65  /.int sqlite3Vie
8570: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
8580: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
8590: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
85a0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
85b0: 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  t;.  Select *pSe
85c0: 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c  l;.  Table *pSel
85d0: 54 61 62 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20  Tab;.  int nErr 
85e0: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
85f0: 70 54 61 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20  pTable );..  /* 
8600: 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20  A positive nCol 
8610: 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e  means the column
8620: 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73  s names for this
8630: 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61   view are.  ** a
8640: 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20  lready known..  
8650: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
8660: 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e  >nCol>0 ) return
8670: 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61   0;..  /* A nega
8680: 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73  tive nCol is a s
8690: 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65  pecial marker me
86a0: 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72  aning that we ar
86b0: 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a  e currently.  **
86c0: 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75   trying to compu
86d0: 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  te the column na
86e0: 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65  mes.  If we ente
86f0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  r this routine w
8700: 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74  ith.  ** a negat
8710: 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61  ive nCol, it mea
8720: 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76  ns two or more v
8730: 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70  iews form a loop
8740: 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a  , like this:.  *
8750: 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  *.  **     CREAT
8760: 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45  E VIEW one AS SE
8770: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b  LECT * FROM two;
8780: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
8790: 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c   VIEW two AS SEL
87a0: 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a  ECT * FROM one;.
87b0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
87c0: 6c 79 2c 20 74 68 69 73 20 65 72 72 6f 72 20 69  ly, this error i
87d0: 73 20 63 61 75 67 68 74 20 70 72 65 76 69 6f 75  s caught previou
87e0: 73 6c 79 20 61 6e 64 20 73 6f 20 74 68 65 20 66  sly and so the f
87f0: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a 20 20  ollowing test.  
8800: 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  ** should always
8810: 20 66 61 69 6c 2e 20 20 42 75 74 20 77 65 20 77   fail.  But we w
8820: 69 6c 6c 20 6c 65 61 76 65 20 69 74 20 69 6e 20  ill leave it in 
8830: 70 6c 61 63 65 20 6a 75 73 74 20 74 6f 20 62 65  place just to be
8840: 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   safe..  */.  if
8850: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30  ( pTable->nCol<0
8860: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
8870: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8880: 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63  "view %s is circ
8890: 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c  ularly defined",
88a0: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
88b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
88c0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67   }..  /* If we g
88d0: 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
88e0: 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f  means we need to
88f0: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62   compute the tab
8900: 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20  le names..  */. 
8910: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
8920: 3e 70 53 65 6c 65 63 74 20 29 3b 20 2f 2a 20 49  >pSelect ); /* I
8930: 66 20 6e 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20  f nCol==0, then 
8940: 70 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61  pTable must be a
8950: 20 56 49 45 57 20 2a 2f 0a 20 20 70 53 65 6c 20   VIEW */.  pSel 
8960: 3d 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  = pTable->pSelec
8970: 74 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68  t;..  /* Note th
8980: 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  at the call to s
8990: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
89a0: 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65  fSelect() will e
89b0: 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22  xpand any.  ** "
89c0: 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  *" elements in t
89d0: 68 69 73 20 6c 69 73 74 2e 20 20 42 75 74 20 77  his list.  But w
89e0: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 72  e will need to r
89f0: 65 73 74 6f 72 65 20 74 68 65 20 6c 69 73 74 0a  estore the list.
8a00: 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74 73    ** back to its
8a10: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67   original config
8a20: 75 72 61 74 69 6f 6e 20 61 66 74 65 72 77 61 72  uration afterwar
8a30: 64 73 2c 20 73 6f 20 77 65 20 73 61 76 65 20 61  ds, so we save a
8a40: 20 63 6f 70 79 20 6f 66 0a 20 20 2a 2a 20 74 68   copy of.  ** th
8a50: 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 20 70 45  e original in pE
8a60: 4c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 45 4c  List..  */.  pEL
8a70: 69 73 74 20 3d 20 70 53 65 6c 2d 3e 70 45 4c 69  ist = pSel->pELi
8a80: 73 74 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69  st;.  pSel->pELi
8a90: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
8aa0: 4c 69 73 74 44 75 70 28 70 45 4c 69 73 74 29 3b  ListDup(pEList);
8ab0: 0a 20 20 69 66 28 20 70 53 65 6c 2d 3e 70 45 4c  .  if( pSel->pEL
8ac0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 53  ist==0 ){.    pS
8ad0: 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c  el->pEList = pEL
8ae0: 69 73 74 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ist;.    return 
8af0: 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61  1;  /* Malloc fa
8b00: 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 54  iled */.  }.  pT
8b10: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b  able->nCol = -1;
8b20: 0a 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c  .  pSelTab = sql
8b30: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
8b40: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c  elect(pParse, 0,
8b50: 20 70 53 65 6c 29 3b 0a 20 20 69 66 28 20 70 53   pSel);.  if( pS
8b60: 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73  elTab ){.    ass
8b70: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f  ert( pTable->aCo
8b80: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62  l==0 );.    pTab
8b90: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54  le->nCol = pSelT
8ba0: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 54  ab->nCol;.    pT
8bb0: 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65  able->aCol = pSe
8bc0: 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
8bd0: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
8be0: 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  0;.    pSelTab->
8bf0: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71  aCol = 0;.    sq
8c00: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
8c10: 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  (0, pSelTab);.  
8c20: 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28    DbSetProperty(
8c30: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
8c40: 6c 65 2d 3e 69 44 62 2c 20 44 42 5f 55 6e 72 65  le->iDb, DB_Unre
8c50: 73 65 74 56 69 65 77 73 29 3b 0a 20 20 7d 65 6c  setViews);.  }el
8c60: 73 65 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e  se{.    pTable->
8c70: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 6e 45  nCol = 0;.    nE
8c80: 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rr++;.  }.  sqli
8c90: 74 65 33 53 65 6c 65 63 74 55 6e 62 69 6e 64 28  te3SelectUnbind(
8ca0: 70 53 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  pSel);.  sqlite3
8cb0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
8cc0: 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sel->pEList);.  
8cd0: 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70  pSel->pEList = p
8ce0: 45 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e 20  EList;.  return 
8cf0: 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  nErr;  .}../*.**
8d00: 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
8d10: 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68 65  n names from the
8d20: 20 56 49 45 57 20 70 54 61 62 6c 65 2e 0a 2a 2a   VIEW pTable..**
8d30: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8d40: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
8d50: 76 65 72 20 61 6e 79 20 6f 74 68 65 72 20 74 61  ver any other ta
8d60: 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 6d  ble or view is m
8d70: 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 54 68 65 20  odified..** The 
8d80: 76 69 65 77 20 70 61 73 73 65 64 20 69 6e 74 6f  view passed into
8d90: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
8da0: 67 68 74 20 64 65 70 65 6e 64 20 64 69 72 65 63  ght depend direc
8db0: 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c  tly or indirectl
8dc0: 79 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 64 69  y.** on the modi
8dd0: 66 69 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  fied or deleted 
8de0: 74 61 62 6c 65 20 73 6f 20 77 65 20 6e 65 65 64  table so we need
8df0: 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 6f 6c   to clear the ol
8e00: 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d 65  d column.** name
8e10: 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 77  s so that they w
8e20: 69 6c 6c 20 62 65 20 72 65 63 6f 6d 70 75 74 65  ill be recompute
8e30: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
8e40: 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
8e50: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62  tColumnNames(Tab
8e60: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69  le *pTable){.  i
8e70: 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  nt i;.  Column *
8e80: 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  pCol;.  assert( 
8e90: 70 54 61 62 6c 65 21 3d 30 20 26 26 20 70 54 61  pTable!=0 && pTa
8ea0: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20  ble->pSelect!=0 
8eb0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  );.  for(i=0, pC
8ec0: 6f 6c 3d 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b  ol=pTable->aCol;
8ed0: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
8ee0: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
8ef0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43     sqliteFree(pC
8f00: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
8f10: 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d  sqliteFree(pCol-
8f20: 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c  >zDflt);.    sql
8f30: 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54  iteFree(pCol->zT
8f40: 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ype);.  }.  sqli
8f50: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
8f60: 43 6f 6c 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Col);.  pTable->
8f70: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  aCol = 0;.  pTab
8f80: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a  le->nCol = 0;.}.
8f90: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
8fa0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72   column names fr
8fb0: 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e  om every VIEW in
8fc0: 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a   database idx..*
8fd0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
8fe0: 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
8ff0: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 69 6e 74  (sqlite *db, int
9000: 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65   idx){.  HashEle
9010: 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21 44 62 48  m *i;.  if( !DbH
9020: 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  asProperty(db, i
9030: 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
9040: 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ews) ) return;. 
9050: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
9060: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b  hFirst(&db->aDb[
9070: 69 64 78 5d 2e 74 62 6c 48 61 73 68 29 3b 20 69  idx].tblHash); i
9080: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
9090: 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c  xt(i)){.    Tabl
90a0: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
90b0: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
90c0: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
90d0: 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
90e0: 74 65 56 69 65 77 52 65 73 65 74 43 6f 6c 75 6d  teViewResetColum
90f0: 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20  nNames(pTab);.  
9100: 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61    }.  }.  DbClea
9110: 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  rProperty(db, id
9120: 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
9130: 77 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  ws);.}../*.** Gi
9140: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f  ven a token, loo
9150: 6b 20 75 70 20 61 20 74 61 62 6c 65 20 77 69 74  k up a table wit
9160: 68 20 74 68 61 74 20 6e 61 6d 65 2e 20 20 49 66  h that name.  If
9170: 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 65 61 76   not found, leav
9180: 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 66 6f  e.** an error fo
9190: 72 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  r the parser to 
91a0: 66 69 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20  find and return 
91b0: 4e 55 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  NULL..*/.Table *
91c0: 73 71 6c 69 74 65 33 54 61 62 6c 65 46 72 6f 6d  sqlite3TableFrom
91d0: 54 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61  Token(Parse *pPa
91e0: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  rse, Token *pTok
91f0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
9200: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
9210: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
9220: 65 33 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  e3TableNameFromT
9230: 6f 6b 65 6e 28 70 54 6f 6b 29 3b 0a 20 20 69 66  oken(pTok);.  if
9240: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
9250: 75 72 6e 20 30 3b 0a 20 20 70 54 61 62 20 3d 20  urn 0;.  pTab = 
9260: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
9270: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
9280: 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  me, 0);.  sqlite
9290: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69  Free(zName);.  i
92a0: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
92b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
92c0: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
92d0: 63 68 20 74 61 62 6c 65 3a 20 25 54 22 2c 20 70  ch table: %T", p
92e0: 54 6f 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Tok);.  }.  retu
92f0: 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
9300: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9310: 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74  s called to do t
9320: 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f  he work of a DRO
9330: 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  P TABLE statemen
9340: 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74  t..** pName is t
9350: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
9360: 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70  able to be dropp
9370: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
9380: 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72  te3DropTable(Par
9390: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
93a0: 6e 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73  n *pName, int is
93b0: 56 69 65 77 29 7b 0a 20 20 54 61 62 6c 65 20 2a  View){.  Table *
93c0: 70 54 61 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a  pTable;.  Vdbe *
93d0: 76 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20  v;.  int base;. 
93e0: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
93f0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
9400: 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  iDb;..  if( pPar
9410: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
9420: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
9430: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54  d ) return;.  pT
9440: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 54 61  able = sqlite3Ta
9450: 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  bleFromToken(pPa
9460: 72 73 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  rse, pName);.  i
9470: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72  f( pTable==0 ) r
9480: 65 74 75 72 6e 3b 0a 20 20 69 44 62 20 3d 20 70  eturn;.  iDb = p
9490: 54 61 62 6c 65 2d 3e 69 44 62 3b 0a 20 20 61 73  Table->iDb;.  as
94a0: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
94b0: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 23  iDb<db->nDb );.#
94c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
94d0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
94e0: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
94f0: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
9500: 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
9510: 5f 54 41 42 4c 45 28 70 54 61 62 6c 65 2d 3e 69  _TABLE(pTable->i
9520: 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  Db);.    const c
9530: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
9540: 44 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62 5d 2e  Db[pTable->iDb].
9550: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73  zName;.    if( s
9560: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
9570: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
9580: 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
9590: 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 72 65 74  zDb)){.      ret
95a0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
95b0: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
95c0: 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b     if( iDb==1 ){
95d0: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
95e0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
95f0: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
9600: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
9610: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
9620: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
9630: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
9640: 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  ( iDb==1 ){.    
9650: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
9660: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
9670: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
9680: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
9690: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
96a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
96b0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
96c0: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
96d0: 20 63 6f 64 65 2c 20 70 54 61 62 6c 65 2d 3e 7a   code, pTable->z
96e0: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
96f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
9700: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
9710: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
9720: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
9730: 45 54 45 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  ETE, pTable->zNa
9740: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
9750: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
9760: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
9770: 69 66 28 20 70 54 61 62 6c 65 2d 3e 72 65 61 64  if( pTable->read
9780: 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  Only ){.    sqli
9790: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
97a0: 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
97b0: 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  y not be dropped
97c0: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
97d0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
97e0: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
97f0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 56  n;.  }.  if( isV
9800: 69 65 77 20 26 26 20 70 54 61 62 6c 65 2d 3e 70  iew && pTable->p
9810: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
9820: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9830: 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
9840: 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65  OP TABLE to dele
9850: 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54  te table %s", pT
9860: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
9870: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
9880: 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70  if( !isView && p
9890: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29  Table->pSelect )
98a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
98b0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
98c0: 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20  se DROP VIEW to 
98d0: 64 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c  delete view %s",
98e0: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
98f0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
9900: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
9910: 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
9920: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
9930: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20  e master table. 
9940: 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a   ** on disk..  *
9950: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
9960: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
9970: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
9980: 74 61 74 69 63 20 56 64 62 65 4f 70 4c 69 73 74  tatic VdbeOpList
9990: 20 64 72 6f 70 54 61 62 6c 65 5b 5d 20 3d 20 7b   dropTable[] = {
99a0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69  .      { OP_Rewi
99b0: 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28  nd,     0, ADDR(
99c0: 31 30 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b  10), 0},.      {
99d0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20   OP_String,     
99e0: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
99f0: 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 1 */.      {
9a00: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20   OP_MemStore,   
9a10: 31 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 1,        0},
9a20: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c  .      { OP_MemL
9a30: 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20  oad,    1, 0,   
9a40: 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f       0}, /* 3 */
9a50: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
9a60: 6d 6e 2c 20 20 20 20 20 30 2c 20 32 2c 20 20 20  mn,     0, 2,   
9a70: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
9a80: 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20   OP_Ne,         
9a90: 30 2c 20 41 44 44 52 28 39 29 2c 20 20 30 7d 2c  0, ADDR(9),  0},
9aa0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65  .      { OP_Dele
9ab0: 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  te,     0, 0,   
9ac0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
9ad0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20   OP_Rewind,     
9ae0: 30 2c 20 41 44 44 52 28 31 30 29 2c 20 30 7d 2c  0, ADDR(10), 0},
9af0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f  .      { OP_Goto
9b00: 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28  ,       0, ADDR(
9b10: 33 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b  3),  0},.      {
9b20: 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20   OP_Next,       
9b30: 30 2c 20 41 44 44 52 28 33 29 2c 20 20 30 7d 2c  0, ADDR(3),  0},
9b40: 20 2f 2a 20 39 20 2a 2f 0a 20 20 20 20 7d 3b 0a   /* 9 */.    };.
9b50: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
9b60: 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54  .    Trigger *pT
9b70: 72 69 67 67 65 72 3b 0a 20 20 20 20 73 71 6c 69  rigger;.    sqli
9b80: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
9b90: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
9ba0: 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a  , pTable->iDb);.
9bb0: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  .    /* Drop all
9bc0: 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69   triggers associ
9bd0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
9be0: 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
9bf0: 64 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65  d */.    pTrigge
9c00: 72 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54 72 69  r = pTable->pTri
9c10: 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28  gger;.    while(
9c20: 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
9c30: 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
9c40: 67 65 72 2d 3e 69 44 62 3d 3d 70 54 61 62 6c 65  ger->iDb==pTable
9c50: 2d 3e 69 44 62 20 7c 7c 20 70 54 72 69 67 67 65  ->iDb || pTrigge
9c60: 72 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20  r->iDb==1 );.   
9c70: 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72     sqlite3DropTr
9c80: 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c  iggerPtr(pParse,
9c90: 20 70 54 72 69 67 67 65 72 2c 20 31 29 3b 0a 20   pTrigger, 1);. 
9ca0: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
9cb0: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
9cc0: 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
9cd0: 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a  Trigger->pNext;.
9ce0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9cf0: 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20       pTrigger = 
9d00: 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72  pTable->pTrigger
9d10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9d20: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  .    /* Drop all
9d30: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 65   SQLITE_MASTER e
9d40: 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65  ntries that refe
9d50: 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a  r to the table *
9d60: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  /.    sqlite3Ope
9d70: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20  nMasterTable(v, 
9d80: 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 20 20  pTable->iDb);.  
9d90: 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33    base = sqlite3
9da0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
9db0: 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70 54   ArraySize(dropT
9dc0: 61 62 6c 65 29 2c 20 64 72 6f 70 54 61 62 6c 65  able), dropTable
9dd0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
9de0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61  beChangeP3(v, ba
9df0: 73 65 2b 31 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  se+1, pTable->zN
9e00: 61 6d 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  ame, 0);..    /*
9e10: 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45   Drop all SQLITE
9e20: 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20 65 6e 74  _TEMP_MASTER ent
9e30: 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20  ries that refer 
9e40: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  to the table */.
9e50: 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e      if( pTable->
9e60: 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb!=1 ){.      
9e70: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
9e80: 72 54 61 62 6c 65 28 76 2c 20 31 29 3b 0a 20 20  rTable(v, 1);.  
9e90: 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74      base = sqlit
9ea0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
9eb0: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f  v, ArraySize(dro
9ec0: 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54 61 62  pTable), dropTab
9ed0: 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  le);.      sqlit
9ee0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
9ef0: 2c 20 62 61 73 65 2b 31 2c 20 70 54 61 62 6c 65  , base+1, pTable
9f00: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
9f10: 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 54 61 62   }..    if( pTab
9f20: 6c 65 2d 3e 69 44 62 3d 3d 30 20 29 7b 0a 20 20  le->iDb==0 ){.  
9f30: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
9f40: 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a  eCookie(db, v);.
9f50: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
9f60: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
9f70: 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20  _Close, 0, 0);. 
9f80: 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29     if( !isView )
9f90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
9fa0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
9fb0: 65 73 74 72 6f 79 2c 20 70 54 61 62 6c 65 2d 3e  estroy, pTable->
9fc0: 74 6e 75 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 44  tnum, pTable->iD
9fd0: 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49  b);.      for(pI
9fe0: 64 78 3d 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  dx=pTable->pInde
9ff0: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
a000: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
a010: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a020: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72  ddOp(v, OP_Destr
a030: 6f 79 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  oy, pIdx->tnum, 
a040: 70 49 64 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20  pIdx->iDb);.    
a050: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
a060: 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65  lite3EndWriteOpe
a070: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a  ration(pParse);.
a080: 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
a090: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   the in-memory d
a0a0: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
a0b0: 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  e table..  **.  
a0c0: 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 69 66  ** Exception: if
a0d0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
a0e0: 6e 74 20 62 65 67 61 6e 20 77 69 74 68 20 74 68  nt began with th
a0f0: 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72  e EXPLAIN keywor
a100: 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6e 6f 20  d,.  ** then no 
a110: 63 68 61 6e 67 65 73 20 73 68 6f 75 6c 64 20 62  changes should b
a120: 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69  e made..  */.  i
a130: 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  f( !pParse->expl
a140: 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ain ){.    sqlit
a150: 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  eUnlinkAndDelete
a160: 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 6c 65  Table(db, pTable
a170: 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  );.    db->flags
a180: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
a190: 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 20 20  nChanges;.  }.  
a1a0: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
a1b0: 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a  ll(db, iDb);.}..
a1c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
a1d0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
a1e0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72  create a new for
a1f0: 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  eign key on the 
a200: 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74  table.** current
a210: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
a220: 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c  ction.  pFromCol
a230: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
a240: 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  h columns.** in 
a250: 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
a260: 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  e point to the f
a270: 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20  oreign key.  If 
a280: 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e  pFromCol==0 then
a290: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20  .** connect the 
a2a0: 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20  key to the last 
a2b0: 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e  column inserted.
a2c0: 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d    pTo is the nam
a2d0: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  e of.** the tabl
a2e0: 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20  e referred to.  
a2f0: 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74  pToCol is a list
a300: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
a310: 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74  e other.** pTo t
a320: 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f  able that the fo
a330: 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73  reign key points
a340: 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74   to.  flags cont
a350: 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f  ains all.** info
a360: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
a370: 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  e conflict resol
a380: 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
a390: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e   specified.** in
a3a0: 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20   the ON DELETE, 
a3b0: 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e  ON UPDATE and ON
a3c0: 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e   INSERT clauses.
a3d0: 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73  .**.** An FKey s
a3e0: 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
a3f0: 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f  ted and added to
a400: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
a410: 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f  ntly.** under co
a420: 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
a430: 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
a440: 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65 20  ble field.  The 
a450: 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e  new FKey.** is n
a460: 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64  ot linked into d
a470: 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69 73  b->aFKey at this
a480: 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64 6f   point - that do
a490: 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a  es not happen.**
a4a0: 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 45 6e   until sqlite3En
a4b0: 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  dTable()..**.** 
a4c0: 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  The foreign key 
a4d0: 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44  is set for IMMED
a4e0: 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e  IATE processing.
a4f0: 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63    A subsequent c
a500: 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  all.** to sqlite
a510: 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
a520: 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  () might change 
a530: 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44  this to DEFERRED
a540: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a550: 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65  3CreateForeignKe
a560: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
a570: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
a580: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
a590: 20 20 49 64 4c 69 73 74 20 2a 70 46 72 6f 6d 43    IdList *pFromC
a5a0: 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol,    /* Column
a5b0: 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20  s in this table 
a5c0: 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74  that point to ot
a5d0: 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54  her table */.  T
a5e0: 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20  oken *pTo,      
a5f0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
a600: 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
a610: 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 54 6f 43  /.  IdList *pToC
a620: 6f 6c 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75  ol,      /* Colu
a630: 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  mns in the other
a640: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
a650: 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
a660: 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73   /* Conflict res
a670: 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
a680: 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ms. */.){.  Tabl
a690: 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *p = pParse->p
a6a0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20  NewTable;.  int 
a6b0: 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  nByte;.  int i;.
a6c0: 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68    int nCol;.  ch
a6d0: 61 72 20 2a 7a 3b 0a 20 20 46 4b 65 79 20 2a 70  ar *z;.  FKey *p
a6e0: 46 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 61 73 73  FKey = 0;..  ass
a6f0: 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20  ert( pTo!=0 );. 
a700: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
a710: 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
a720: 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70   fk_end;.  if( p
a730: 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
a740: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
a750: 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  nCol-1;.    if( 
a760: 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b  iCol<0 ) goto fk
a770: 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54  _end;.    if( pT
a780: 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
a790: 6e 49 64 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  nId!=1 ){.      
a7a0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
a7b0: 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e  pParse, "foreign
a7c0: 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20   key on %s".    
a7d0: 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65       " should re
a7e0: 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65  ference only one
a7f0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
a800: 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70   %T",.         p
a810: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
a820: 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20  me, pTo);.      
a830: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
a840: 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b   }.    nCol = 1;
a850: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f  .  }else if( pTo
a860: 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
a870: 49 64 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 49  Id!=pFromCol->nI
a880: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
a890: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
a8a0: 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72  .        "number
a8b0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66   of columns in f
a8c0: 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20  oreign key does 
a8d0: 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75  not match the nu
a8e0: 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20  mber of ".      
a8f0: 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68    "columns in th
a900: 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
a910: 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66  le");.    goto f
a920: 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  k_end;.  }else{.
a930: 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d      nCol = pFrom
a940: 43 6f 6c 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 20 20  Col->nId;.  }.  
a950: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
a960: 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69  pFKey) + nCol*si
a970: 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
a980: 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
a990: 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
a9a0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
a9b0: 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 49 64 3b 20 69  i<pToCol->nId; i
a9c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  ++){.      nByte
a9d0: 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f   += strlen(pToCo
a9e0: 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b  l->a[i].zName) +
a9f0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
aa00: 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d 61  pFKey = sqliteMa
aa10: 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20  lloc( nByte );. 
aa20: 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 20   if( pFKey==0 ) 
aa30: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 70  goto fk_end;.  p
aa40: 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b  FKey->pFrom = p;
aa50: 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  .  pFKey->pNextF
aa60: 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a  rom = p->pFKey;.
aa70: 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46    z = (char*)&pF
aa80: 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d  Key[1];.  pFKey-
aa90: 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75 63 74 20  >aCol = (struct 
aaa0: 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20  sColMap*)z;.  z 
aab0: 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  += sizeof(struct
aac0: 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a   sColMap)*nCol;.
aad0: 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a    pFKey->zTo = z
aae0: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54  ;.  memcpy(z, pT
aaf0: 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20  o->z, pTo->n);. 
ab00: 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a   z[pTo->n] = 0;.
ab10: 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b    z += pTo->n+1;
ab20: 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54  .  pFKey->pNextT
ab30: 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e  o = 0;.  pFKey->
ab40: 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69  nCol = nCol;.  i
ab50: 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
ab60: 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f  {.    pFKey->aCo
ab70: 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e  l[0].iFrom = p->
ab80: 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  nCol-1;.  }else{
ab90: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
aba0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
abb0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
abc0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f  or(j=0; j<p->nCo
abd0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
abe0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
abf0: 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  Cmp(p->aCol[j].z
ac00: 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Name, pFromCol->
ac10: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  a[i].zName)==0 )
ac20: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65  {.          pFKe
ac30: 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d  y->aCol[i].iFrom
ac40: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
ac50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
ac60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
ac70: 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b  f( j>=p->nCol ){
ac80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ac90: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
aca0: 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b   .          "unk
acb0: 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73  nown column \"%s
acc0: 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  \" in foreign ke
acd0: 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a  y definition", .
ace0: 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43            pFromC
acf0: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
ad00: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  .        goto fk
ad10: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
ad20: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54    }.  }.  if( pT
ad30: 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28  oCol ){.    for(
ad40: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
ad50: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
ad60: 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e   strlen(pToCol->
ad70: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
ad80: 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69     pFKey->aCol[i
ad90: 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20  ].zCol = z;.    
ada0: 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43    memcpy(z, pToC
adb0: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  ol->a[i].zName, 
adc0: 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d  n);.      z[n] =
add0: 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e   0;.      z += n
ade0: 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  +1;.    }.  }.  
adf0: 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
ae00: 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e  d = 0;.  pFKey->
ae10: 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61  deleteConf = fla
ae20: 67 73 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b  gs & 0xff;.  pFK
ae30: 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d  ey->updateConf =
ae40: 20 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26   (flags >> 8 ) &
ae50: 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e   0xff;.  pFKey->
ae60: 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c  insertConf = (fl
ae70: 61 67 73 20 3e 3e 20 31 36 20 29 20 26 20 30 78  ags >> 16 ) & 0x
ae80: 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74  ff;..  /* Link t
ae90: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74  he foreign key t
aea0: 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74  o the table as t
aeb0: 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20  he last step..  
aec0: 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20  */.  p->pFKey = 
aed0: 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d  pFKey;.  pFKey =
aee0: 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73   0;..fk_end:.  s
aef0: 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79 29  qliteFree(pFKey)
af00: 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73  ;.  sqlite3IdLis
af10: 74 44 65 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c  tDelete(pFromCol
af20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69  );.  sqlite3IdLi
af30: 73 74 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29  stDelete(pToCol)
af40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
af50: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
af60: 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41  d when an INITIA
af70: 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72  LLY IMMEDIATE or
af80: 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
af90: 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73  RED.** clause is
afa0: 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66   seen as part of
afb0: 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64   a foreign key d
afc0: 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20  efinition.  The 
afd0: 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61  isDeferred.** pa
afe0: 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72  rameter is 1 for
aff0: 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
b000: 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e  RED and 0 for IN
b010: 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
b020: 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69  E..** The behavi
b030: 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  or of the most r
b040: 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20  ecently created 
b050: 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61  foreign key is a
b060: 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72  djusted.** accor
b070: 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  dingly..*/.void 
b080: 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
b090: 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50  ignKey(Parse *pP
b0a0: 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65  arse, int isDefe
b0b0: 72 72 65 64 29 7b 0a 20 20 54 61 62 6c 65 20 2a  rred){.  Table *
b0c0: 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46  pTab;.  FKey *pF
b0d0: 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62  Key;.  if( (pTab
b0e0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
b0f0: 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b  able)==0 || (pFK
b100: 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79  ey = pTab->pFKey
b110: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
b120: 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
b130: 65 64 20 3d 20 69 73 44 65 66 65 72 72 65 64 3b  ed = isDeferred;
b140: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
b150: 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72   a new index for
b160: 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20   an SQL table.  
b170: 70 49 6e 64 65 78 20 69 73 20 74 68 65 20 6e 61  pIndex is the na
b180: 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
b190: 0a 2a 2a 20 61 6e 64 20 70 54 61 62 6c 65 20 69  .** and pTable i
b1a0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
b1b0: 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
b1c0: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
b1d0: 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65  Both will .** be
b1e0: 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d   NULL for a prim
b1f0: 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e  ary key or an in
b200: 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61  dex that is crea
b210: 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61  ted to satisfy a
b220: 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  .** UNIQUE const
b230: 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c  raint.  If pTabl
b240: 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65  e and pIndex are
b250: 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73   NULL, use pPars
b260: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20  e->pNewTable.** 
b270: 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  as the table to 
b280: 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61  be indexed.  pPa
b290: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
b2a0: 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  s a table that i
b2b0: 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62  s.** currently b
b2c0: 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
b2d0: 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42   by a CREATE TAB
b2e0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
b2f0: 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c  .** pList is a l
b300: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
b310: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
b320: 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  List will be NUL
b330: 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  L if this.** is 
b340: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
b350: 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69   unique-constrai
b360: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
b370: 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64  ecent column add
b380: 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62  ed.** to the tab
b390: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
b3a0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
b3b0: 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74    .*/.void sqlit
b3c0: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20  e3CreateIndex(. 
b3d0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
b3e0: 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61    /* All informa
b3f0: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20  tion about this 
b400: 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  parse */.  Token
b410: 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e   *pName,    /* N
b420: 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
b430: 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
b440: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
b450: 62 6c 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ble, /* Name of 
b460: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 69 6e 64  the table to ind
b470: 65 78 2e 20 20 55 73 65 20 70 50 61 72 73 65 2d  ex.  Use pParse-
b480: 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20  >pNewTable if 0 
b490: 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 4c 69  */.  IdList *pLi
b4a0: 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20  st,   /* A list 
b4b0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
b4c0: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
b4d0: 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 2f  t onError,     /
b4e0: 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49  * OE_Abort, OE_I
b4f0: 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63  gnore, OE_Replac
b500: 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f  e, or OE_None */
b510: 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  .  Token *pStart
b520: 2c 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54  ,   /* The CREAT
b530: 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
b540: 69 6e 73 20 61 20 43 52 45 41 54 45 20 54 41 42  ins a CREATE TAB
b550: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  LE statement */.
b560: 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20    Token *pEnd   
b570: 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68     /* The ")" th
b580: 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52  at closes the CR
b590: 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
b5a0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ment */.){.  Tab
b5b0: 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a  le *pTab;     /*
b5c0: 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   Table to be ind
b5d0: 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  exed */.  Index 
b5e0: 2a 70 49 6e 64 65 78 3b 20 20 20 2f 2a 20 54 68  *pIndex;   /* Th
b5f0: 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72  e index to be cr
b600: 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  eated */.  char 
b610: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e  *zName = 0;.  in
b620: 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20  t i, j;.  Token 
b630: 6e 75 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61  nullId;    /* Fa
b640: 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20  ke token for an 
b650: 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f  empty ID list */
b660: 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b  .  DbFixer sFix;
b670: 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67      /* For assig
b680: 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61  ning database na
b690: 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f  mes to pTable */
b6a0: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 3b 20 20  .  int isTemp;  
b6b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
b6c0: 61 20 74 65 6d 70 6f 72 61 72 79 20 69 6e 64 65  a temporary inde
b6d0: 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64  x */.  sqlite *d
b6e0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
b6f0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
b700: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
b710: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67  alloc_failed ) g
b720: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
b730: 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 64 62 2d  index;.  if( db-
b740: 3e 69 6e 69 74 2e 62 75 73 79 20 0a 20 20 20 20  >init.busy .    
b750: 20 26 26 20 73 71 6c 69 74 65 33 46 69 78 49 6e   && sqlite3FixIn
b760: 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
b770: 2c 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 2c 20  , db->init.iDb, 
b780: 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 0a  "index", pName).
b790: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 46       && sqlite3F
b7a0: 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c  ixSrcList(&sFix,
b7b0: 20 70 54 61 62 6c 65 29 0a 20 20 29 7b 0a 20 20   pTable).  ){.  
b7c0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
b7d0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20  te_index;.  }.. 
b7e0: 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
b7f0: 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
b800: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
b810: 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20  Return early if 
b820: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a  not found..  */.
b830: 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20    if( pTable!=0 
b840: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
b850: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 61  Name!=0 );.    a
b860: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e  ssert( pTable->n
b870: 53 72 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54  Src==1 );.    pT
b880: 61 62 20 3d 20 20 73 71 6c 69 74 65 33 53 72 63  ab =  sqlite3Src
b890: 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73  ListLookup(pPars
b8a0: 65 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65  e, pTable);.  }e
b8b0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
b8c0: 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20   pName==0 );.   
b8d0: 20 70 54 61 62 20 3d 20 20 70 50 61 72 73 65 2d   pTab =  pParse-
b8e0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a  >pNewTable;.  }.
b8f0: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c    if( pTab==0 ||
b900: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
b910: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
b920: 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54  _index;.  if( pT
b930: 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  ab->readOnly ){.
b940: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
b950: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
b960: 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65  le %s may not be
b970: 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d   indexed", pTab-
b980: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
b990: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
b9a0: 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dex;.  }.  if( p
b9b0: 54 61 62 2d 3e 69 44 62 3e 3d 32 20 26 26 20 64  Tab->iDb>=2 && d
b9c0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
b9d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
b9e0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
b9f0: 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
ba00: 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 64   have indices ad
ba10: 64 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ded", pTab->zNam
ba20: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
ba30: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
ba40: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e    }.  if( pTab->
ba50: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
ba60: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
ba70: 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61  Parse, "views ma
ba80: 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
ba90: 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ");.    goto exi
baa0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
bab0: 20 20 7d 0a 20 20 69 73 54 65 6d 70 20 3d 20 70    }.  isTemp = p
bac0: 54 61 62 2d 3e 69 44 62 3d 3d 31 3b 0a 0a 20 20  Tab->iDb==1;..  
bad0: 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
bae0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
baf0: 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  ex.  Make sure t
bb00: 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  here is not alre
bb10: 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a  ady another.  **
bb20: 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
bb30: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
bb40: 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  me.  .  **.  ** 
bb50: 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77  Exception:  If w
bb60: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
bb70: 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61  e names of perma
bb80: 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f  nent indices fro
bb90: 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  m the.  ** sqlit
bba0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28  e_master table (
bbb0: 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68  because some oth
bbc0: 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67  er process chang
bbd0: 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61  ed the schema) a
bbe0: 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74  nd.  ** one of t
bbf0: 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63  he index names c
bc00: 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65  ollides with the
bc10: 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f   name of a tempo
bc20: 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20  rary table or.  
bc30: 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77  ** index, then w
bc40: 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
bc50: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20  to process this 
bc60: 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
bc70: 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20   If pName==0 it 
bc80: 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72  means that we ar
bc90: 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77  e.  ** dealing w
bca0: 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65  ith a primary ke
bcb0: 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  y or UNIQUE cons
bcc0: 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65  traint.  We have
bcd0: 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20   to invent our. 
bce0: 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20   ** own name..  
bcf0: 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 26  */.  if( pName &
bd00: 26 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  & !db->init.busy
bd10: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
bd20: 49 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a  ISameName;    /*
bd30: 20 41 6e 6f 74 68 65 72 20 69 6e 64 65 78 20 77   Another index w
bd40: 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
bd50: 65 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a  e */.    Table *
bd60: 70 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f  pTSameName;    /
bd70: 2a 20 41 20 74 61 62 6c 65 20 77 69 74 68 20 73  * A table with s
bd80: 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
bd90: 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7a 4e 61  index */.    zNa
bda0: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  me = sqliteStrND
bdb0: 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  up(pName->z, pNa
bdc0: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20  me->n);.    if( 
bdd0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
bde0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
bdf0: 78 3b 0a 20 20 20 20 69 66 28 20 28 70 49 53 61  x;.    if( (pISa
be00: 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  meName = sqlite3
be10: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
be20: 61 6d 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20  ame, 0))!=0 ){. 
be30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
be40: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
be50: 64 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65  dex %s already e
be60: 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  xists", zName);.
be70: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
be80: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
be90: 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 54 53    }.    if( (pTS
bea0: 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ameName = sqlite
beb0: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
bec0: 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a  Name, 0))!=0 ){.
bed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
bee0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
bef0: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
bf00: 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73  a table named %s
bf10: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
bf20: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
bf30: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
bf40: 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65   }else if( pName
bf50: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
bf60: 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e  zBuf[30];.    in
bf70: 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  t n;.    Index *
bf80: 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70  pLoop;.    for(p
bf90: 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65  Loop=pTab->pInde
bfa0: 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70  x, n=1; pLoop; p
bfb0: 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78  Loop=pLoop->pNex
bfc0: 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70  t, n++){}.    sp
bfd0: 72 69 6e 74 66 28 7a 42 75 66 2c 22 25 64 29 22  rintf(zBuf,"%d)"
bfe0: 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  ,n);.    zName =
bff0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   0;.    sqlite3S
c000: 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c  etString(&zName,
c010: 20 22 28 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   "(", pTab->zNam
c020: 65 2c 20 22 20 61 75 74 6f 69 6e 64 65 78 20 22  e, " autoindex "
c030: 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30  , zBuf, (char*)0
c040: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
c050: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
c060: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
c070: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65  }else{.    zName
c080: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
c090: 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65  (pName->z, pName
c0a0: 2d 3e 6e 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ->n);.  }..  /* 
c0b0: 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72  Check for author
c0c0: 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74  ization to creat
c0d0: 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f  e an index..  */
c0e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c0f0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
c100: 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ON.  {.    const
c110: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
c120: 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e  >aDb[pTab->iDb].
c130: 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 61 73 73 65  zName;..    asse
c140: 72 74 28 20 70 54 61 62 2d 3e 69 44 62 3d 3d 64  rt( pTab->iDb==d
c150: 62 2d 3e 69 6e 69 74 2e 69 44 62 20 7c 7c 20 69  b->init.iDb || i
c160: 73 54 65 6d 70 20 29 3b 0a 20 20 20 20 69 66 28  sTemp );.    if(
c170: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
c180: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
c190: 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f  _INSERT, SCHEMA_
c1a0: 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30  TABLE(isTemp), 0
c1b0: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
c1c0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
c1d0: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
c1e0: 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45    i = SQLITE_CRE
c1f0: 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  ATE_INDEX;.    i
c200: 66 28 20 69 73 54 65 6d 70 20 29 20 69 20 3d 20  f( isTemp ) i = 
c210: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
c220: 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  MP_INDEX;.    if
c230: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
c240: 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e  ck(pParse, i, zN
c250: 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
c260: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
c270: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
c280: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
c290: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
c2a0: 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d  f pList==0, it m
c2b0: 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e  eans this routin
c2c0: 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  e was called to 
c2d0: 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20  make a primary. 
c2e0: 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74   ** key out of t
c2f0: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61  he last column a
c300: 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
c310: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
c320: 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72  tion..  ** So cr
c330: 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74  eate a fake list
c340: 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69   to simulate thi
c350: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  s..  */.  if( pL
c360: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75  ist==0 ){.    nu
c370: 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d 3e 61  llId.z = pTab->a
c380: 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31  Col[pTab->nCol-1
c390: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c  ].zName;.    nul
c3a0: 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 6e  lId.n = strlen(n
c3b0: 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c  ullId.z);.    pL
c3c0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  ist = sqlite3IdL
c3d0: 69 73 74 41 70 70 65 6e 64 28 30 2c 20 26 6e 75  istAppend(0, &nu
c3e0: 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20 70  llId);.    if( p
c3f0: 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65  List==0 ) goto e
c400: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
c410: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ;.  }..  /* .  *
c420: 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  * Allocate the i
c430: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
c440: 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20 3d  .  */.  pIndex =
c450: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
c460: 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 73  izeof(Index) + s
c470: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31  trlen(zName) + 1
c480: 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   +.             
c490: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
c4a0: 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d 3e 6e 49  f(int)*pList->nI
c4b0: 64 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  d );.  if( pInde
c4c0: 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  x==0 ) goto exit
c4d0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
c4e0: 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
c4f0: 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64 65  n = (int*)&pInde
c500: 78 5b 31 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  x[1];.  pIndex->
c510: 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  zName = (char*)&
c520: 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
c530: 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b 0a 20 20  [pList->nId];.  
c540: 73 74 72 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a  strcpy(pIndex->z
c550: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Name, zName);.  
c560: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d  pIndex->pTable =
c570: 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d   pTab;.  pIndex-
c580: 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74  >nColumn = pList
c590: 2d 3e 6e 49 64 3b 0a 20 20 70 49 6e 64 65 78 2d  ->nId;.  pIndex-
c5a0: 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72  >onError = onErr
c5b0: 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75  or;.  pIndex->au
c5c0: 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d  toIndex = pName=
c5d0: 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44  =0;.  pIndex->iD
c5e0: 62 20 3d 20 69 73 54 65 6d 70 20 3f 20 31 20 3a  b = isTemp ? 1 :
c5f0: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 0a   db->init.iDb;..
c600: 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61    /* Scan the na
c610: 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  mes of the colum
c620: 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ns of the table 
c630: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e  to be indexed an
c640: 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20  d.  ** load the 
c650: 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69  column indices i
c660: 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74  nto the Index st
c670: 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74  ructure.  Report
c680: 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69   an error.  ** i
c690: 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20  f any column is 
c6a0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a  not found..  */.
c6b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
c6c0: 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
c6d0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
c6e0: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
c6f0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
c700: 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
c710: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62  a[i].zName, pTab
c720: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  ->aCol[j].zName)
c730: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
c740: 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54   }.    if( j>=pT
c750: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
c760: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
c770: 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
c780: 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d   %s has no colum
c790: 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20  n named %s",.   
c7a0: 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
c7b0: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  , pList->a[i].zN
c7c0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
c7d0: 74 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a  teFree(pIndex);.
c7e0: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
c7f0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
c800: 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
c810: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b  aiColumn[i] = j;
c820: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  .  }..  /* Link 
c830: 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74  the new Index st
c840: 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74  ructure to its t
c850: 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20  able and to the 
c860: 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65  other.  ** in-me
c870: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74  mory database st
c880: 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a  ructures. .  */.
c890: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65    if( !pParse->e
c8a0: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 49 6e  xplain ){.    In
c8b0: 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20  dex *p;.    p = 
c8c0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
c8d0: 74 28 26 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65  t(&db->aDb[pInde
c8e0: 78 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c  x->iDb].idxHash,
c8f0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
c900: 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65             pInde
c910: 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  x->zName, strlen
c920: 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b  (pIndex->zName)+
c930: 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  1, pIndex);.    
c940: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61  if( p ){.      a
c950: 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78  ssert( p==pIndex
c960: 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
c970: 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
c980: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  */.      sqliteF
c990: 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20  ree(pIndex);.   
c9a0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
c9b0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
c9c0: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
c9d0: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
c9e0: 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f  hanges;.  }..  /
c9f0: 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e  * When adding an
ca00: 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69   index to the li
ca10: 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f  st of indices fo
ca20: 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a  r a table, make.
ca30: 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e    ** sure all in
ca40: 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45  dices labeled OE
ca50: 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66  _Replace come af
ca60: 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61  ter all those la
ca70: 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67  beled.  ** OE_Ig
ca80: 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e  nore.  This is n
ca90: 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65  ecessary for the
caa0: 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69   correct operati
cab0: 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a  on of UPDATE.  *
cac0: 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20  * and INSERT..  
cad0: 2a 2f 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72  */.  if( onError
cae0: 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20  !=OE_Replace || 
caf0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a  pTab->pIndex==0.
cb00: 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e         || pTab->
cb10: 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d  pIndex->onError=
cb20: 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20  =OE_Replace){.  
cb30: 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
cb40: 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
cb50: 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78      pTab->pIndex
cb60: 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c   = pIndex;.  }el
cb70: 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  se{.    Index *p
cb80: 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49  Other = pTab->pI
cb90: 6e 64 65 78 3b 0a 20 20 20 20 77 68 69 6c 65 28  ndex;.    while(
cba0: 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26   pOther->pNext &
cbb0: 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d  & pOther->pNext-
cbc0: 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70  >onError!=OE_Rep
cbd0: 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 70 4f  lace ){.      pO
cbe0: 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70  ther = pOther->p
cbf0: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
cc00: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
cc10: 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
cc20: 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74     pOther->pNext
cc30: 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a   = pIndex;.  }..
cc40: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
cc50: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69  init.busy is 1 i
cc60: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
cc70: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
cc80: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
cc90: 69 74 65 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  ite_master" tabl
cca0: 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 20 20  e on the disk.  
ccb0: 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  So do not write 
ccc0: 74 6f 20 74 68 65 20 64 69 73 6b 0a 20 20 2a 2a  to the disk.  **
ccd0: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
cce0: 20 74 68 65 20 74 61 62 6c 65 20 6e 75 6d 62 65   the table numbe
ccf0: 72 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69  r from the db->i
cd00: 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c  nit.newTnum fiel
cd10: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  d..  */.  if( db
cd20: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
cd30: 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20  Table!=0 ){.    
cd40: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64  pIndex->tnum = d
cd50: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
cd60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
cd70: 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
cd80: 69 73 20 30 20 74 68 65 6e 20 63 72 65 61 74 65  is 0 then create
cd90: 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69   the index on di
cda0: 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69  sk.  This.  ** i
cdb0: 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20  nvolves writing 
cdc0: 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74  the index into t
cdd0: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
cde0: 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  and filling in t
cdf0: 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69  he.  ** index wi
ce00: 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  th the current t
ce10: 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20  able contents.. 
ce20: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d   **.  ** The db-
ce30: 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20  >init.busy is 0 
ce40: 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 66 69  when the user fi
ce50: 72 73 74 20 65 6e 74 65 72 73 20 61 20 43 52 45  rst enters a CRE
ce60: 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20  ATE INDEX .  ** 
ce70: 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e  command.  db->in
ce80: 69 74 2e 62 75 73 79 20 69 73 20 31 20 77 68 65  it.busy is 1 whe
ce90: 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20  n a database is 
cea0: 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a  opened and .  **
ceb0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
cec0: 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61  atements are rea
ced0: 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73  d out of the mas
cee0: 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20  ter table.  In. 
cef0: 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63   ** the latter c
cf00: 61 73 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c  ase the index al
cf10: 72 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20  ready exists on 
cf20: 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77  disk, which is w
cf30: 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74  hy.  ** we don't
cf40: 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74   want to recreat
cf50: 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  e it..  **.  ** 
cf60: 49 66 20 70 54 61 62 6c 65 3d 3d 30 20 69 74 20  If pTable==0 it 
cf70: 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78  means this index
cf80: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73   is generated as
cf90: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20   a primary key. 
cfa0: 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f   ** or UNIQUE co
cfb0: 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52  nstraint of a CR
cfc0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
cfd0: 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65  ment.  Since the
cfe0: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20   table.  ** has 
cff0: 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65  just been create
d000: 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e  d, it contains n
d010: 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69  o data and the i
d020: 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74  ndex initializat
d030: 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61  ion.  ** step ca
d040: 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20  n be skipped..  
d050: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62  */.  else if( db
d060: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
d070: 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
d080: 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 69 6e   Vdbe *v;.    in
d090: 74 20 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a 20 20  t lbl1, lbl2;.  
d0a0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
d0b0: 20 61 64 64 72 3b 0a 0a 20 20 20 20 76 20 3d 20   addr;..    v = 
d0c0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
d0d0: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
d0e0: 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  v==0 ) goto exit
d0f0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
d100: 20 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30     if( pTable!=0
d110: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d120: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
d130: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
d140: 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73  isTemp);.      s
d150: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
d160: 54 61 62 6c 65 28 76 2c 20 69 73 54 65 6d 70 29  Table(v, isTemp)
d170: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
d180: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d190: 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20  OP_NewRecno, 0, 
d1a0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
d1b0: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72  dbeOp3(v, OP_Str
d1c0: 69 6e 67 2c 20 30 2c 20 30 2c 20 22 69 6e 64 65  ing, 0, 0, "inde
d1d0: 78 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  x", P3_STATIC);.
d1e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
d1f0: 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  p3(v, OP_String,
d200: 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a   0, 0, pIndex->z
d210: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  Name, 0);.    sq
d220: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
d230: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c  OP_String, 0, 0,
d240: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
d250: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
d260: 65 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65 61 74  eOp3(v, OP_Creat
d270: 65 49 6e 64 65 78 2c 20 30 2c 20 69 73 54 65 6d  eIndex, 0, isTem
d280: 70 2c 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78  p,(char*)&pIndex
d290: 2d 3e 74 6e 75 6d 2c 50 33 5f 50 4f 49 4e 54 45  ->tnum,P3_POINTE
d2a0: 52 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  R);.    pIndex->
d2b0: 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69 66  tnum = 0;.    if
d2c0: 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
d2d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 64    sqlite3VdbeCod
d2e0: 65 28 76 2c 0a 20 20 20 20 20 20 20 20 20 20 4f  e(v,.          O
d2f0: 50 5f 44 75 70 2c 20 20 20 20 20 20 20 30 2c 20  P_Dup,       0, 
d300: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
d310: 20 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20    OP_Integer,   
d320: 69 73 54 65 6d 70 2c 20 30 2c 0a 20 20 20 20 20  isTemp, 0,.     
d330: 20 20 20 20 20 4f 50 5f 4f 70 65 6e 57 72 69 74       OP_OpenWrit
d340: 65 2c 20 31 2c 20 20 20 20 20 20 30 2c 0a 20 20  e, 1,      0,.  
d350: 20 20 20 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20      0);.    }.  
d360: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
d370: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d380: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
d390: 20 20 20 69 66 28 20 70 53 74 61 72 74 20 26 26     if( pStart &&
d3a0: 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 6e   pEnd ){.      n
d3b0: 20 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29   = Addr(pEnd->z)
d3c0: 20 2d 20 41 64 64 72 28 70 53 74 61 72 74 2d 3e   - Addr(pStart->
d3d0: 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71  z) + 1;.      sq
d3e0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
d3f0: 33 28 76 2c 20 61 64 64 72 2c 20 70 53 74 61 72  3(v, addr, pStar
d400: 74 2d 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  t->z, n);.    }.
d410: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d420: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
d430: 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a 20 20  ecord, 5, 0);.  
d440: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d450: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b  Op(v, OP_PutIntK
d460: 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  ey, 0, 0);.    i
d470: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
d480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d490: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
d4a0: 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20 30 29  r, pTab->iDb, 0)
d4b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d4c0: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  dbeOp3(v, OP_Ope
d4d0: 6e 52 65 61 64 2c 20 32 2c 20 70 54 61 62 2d 3e  nRead, 2, pTab->
d4e0: 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  tnum, pTab->zNam
d4f0: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 6c 62 6c  e, 0);.      lbl
d500: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
d510: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
d520: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d530: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
d540: 2c 20 32 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20  , 2, lbl2);.    
d550: 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 33    lbl1 = sqlite3
d560: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d570: 52 65 63 6e 6f 2c 20 32 2c 20 30 29 3b 0a 20 20  Recno, 2, 0);.  
d580: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
d590: 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Index->nColumn; 
d5a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
d5b0: 74 20 69 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d  t iCol = pIndex-
d5c0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
d5d0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
d5e0: 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 29 7b 0a 20  iPKey==iCol ){. 
d5f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d600: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d610: 44 75 70 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20  Dup, i, 0);.    
d620: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d630: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d640: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
d650: 6d 6e 2c 20 32 2c 20 69 43 6f 6c 29 3b 0a 20 20  mn, 2, iCol);.  
d660: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d670: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d680: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
d690: 65 49 64 78 4b 65 79 2c 20 70 49 6e 64 65 78 2d  eIdxKey, pIndex-
d6a0: 3e 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20  >nColumn, 0);.  
d6b0: 20 20 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78      sqlite3Index
d6c0: 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70  AffinityStr(v, p
d6d0: 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 73 71  Index);.      sq
d6e0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
d6f0: 4f 50 5f 49 64 78 50 75 74 2c 20 31 2c 20 70 49  OP_IdxPut, 1, pI
d700: 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
d710: 45 5f 4e 6f 6e 65 2c 0a 20 20 20 20 20 20 20 20  E_None,.        
d720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 69                "i
d730: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61  ndexed columns a
d740: 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20  re not unique", 
d750: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
d760: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d770: 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 32  Op(v, OP_Next, 2
d780: 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 73  , lbl1);.      s
d790: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
d7a0: 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 32 29 3b  eLabel(v, lbl2);
d7b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d7c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
d7d0: 6f 73 65 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  ose, 2, 0);.    
d7e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d7f0: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
d800: 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 0);.    }.   
d810: 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29   if( pTable!=0 )
d820: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 54  {.      if( !isT
d830: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73  emp ){.        s
d840: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
d850: 69 65 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 20  ie(db, v);.     
d860: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
d870: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d880: 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Close, 0, 0);.  
d890: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 57 72      sqlite3EndWr
d8a0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
d8b0: 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rse);.    }.  }.
d8c0: 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62  .  /* Clean up b
d8d0: 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
d8e0: 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64  .exit_create_ind
d8f0: 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 49 64 4c  ex:.  sqlite3IdL
d900: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
d910: 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  ;.  sqlite3SrcLi
d920: 73 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65 29  stDelete(pTable)
d930: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
d940: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Name);.  return;
d950: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
d960: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70  outine will drop
d970: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d   an existing nam
d980: 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20  ed index.  This 
d990: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65  routine.** imple
d9a0: 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49  ments the DROP I
d9b0: 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a  NDEX statement..
d9c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
d9d0: 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a  ropIndex(Parse *
d9e0: 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
d9f0: 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78  *pName){.  Index
da00: 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65   *pIndex;.  Vdbe
da10: 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64   *v;.  sqlite *d
da20: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
da30: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
da40: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
da50: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
da60: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
da70: 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
da80: 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  );.  pIndex = sq
da90: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
daa0: 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  b, pName->a[0].z
dab0: 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
dac0: 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
dad0: 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b  if( pIndex==0 ){
dae0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
daf0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
db00: 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22   such index: %S"
db10: 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , pName, 0);.   
db20: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
db30: 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
db40: 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
db50: 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
db60: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
db70: 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61  , "index associa
db80: 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20  ted with UNIQUE 
db90: 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d  ".      "or PRIM
dba0: 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
dbb0: 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f  nt cannot be dro
dbc0: 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67  pped", 0);.    g
dbd0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
dbe0: 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dex;.  }.  if( p
dbf0: 49 6e 64 65 78 2d 3e 69 44 62 3e 31 20 29 7b 0a  Index->iDb>1 ){.
dc00: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
dc10: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
dc20: 6e 6f 74 20 61 6c 74 65 72 20 73 63 68 65 6d 61  not alter schema
dc30: 20 6f 66 20 61 74 74 61 63 68 65 64 20 22 0a 20   of attached ". 
dc40: 20 20 20 20 20 20 22 64 61 74 61 62 61 73 65 73        "databases
dc50: 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ", 0);.    goto 
dc60: 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
dc70: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
dc80: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
dc90: 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
dca0: 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45  nt code = SQLITE
dcb0: 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _DROP_INDEX;.   
dcc0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
dcd0: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20  Index->pTable;. 
dce0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
dcf0: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e  Db = db->aDb[pIn
dd00: 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b  dex->iDb].zName;
dd10: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
dd20: 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
dd30: 41 42 4c 45 28 70 49 6e 64 65 78 2d 3e 69 44 62  ABLE(pIndex->iDb
dd40: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
dd50: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
dd60: 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
dd70: 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
dd80: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
dd90: 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
dda0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
ddb0: 6e 64 65 78 2d 3e 69 44 62 20 29 20 63 6f 64 65  ndex->iDb ) code
ddc0: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
ddd0: 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
dde0: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
ddf0: 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
de00: 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
de10: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
de20: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
de30: 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
de40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
de50: 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
de60: 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
de70: 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66   the index and f
de80: 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
de90: 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71  able */.  v = sq
dea0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
deb0: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
dec0: 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
ded0: 4f 70 4c 69 73 74 20 64 72 6f 70 49 6e 64 65 78  OpList dropIndex
dee0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f  [] = {.      { O
def0: 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c  P_Rewind,     0,
df00: 20 41 44 44 52 28 39 29 2c 20 30 7d 2c 20 0a 20   ADDR(9), 0}, . 
df10: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
df20: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
df30: 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20    0}, /* 1 */.  
df40: 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72      { OP_MemStor
df50: 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20  e,   1, 1,      
df60: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
df70: 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30  MemLoad,    1, 0
df80: 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33  ,       0}, /* 3
df90: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43   */.      { OP_C
dfa0: 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c  olumn,     0, 1,
dfb0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
dfc0: 20 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20 20 20   { OP_Eq,       
dfd0: 20 20 30 2c 20 41 44 44 52 28 38 29 2c 20 30 7d    0, ADDR(8), 0}
dfe0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78  ,.      { OP_Nex
dff0: 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52  t,       0, ADDR
e000: 28 33 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b  (3), 0},.      {
e010: 20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20   OP_Goto,       
e020: 30 2c 20 41 44 44 52 28 39 29 2c 20 30 7d 2c 0a  0, ADDR(9), 0},.
e030: 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74        { OP_Delet
e040: 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  e,     0, 0,    
e050: 20 20 20 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20     0}, /* 8 */. 
e060: 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 62 61     };.    int ba
e070: 73 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  se;..    sqlite3
e080: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
e090: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ion(pParse, 0, p
e0a0: 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20  Index->iDb);.   
e0b0: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
e0c0: 65 72 54 61 62 6c 65 28 76 2c 20 70 49 6e 64 65  erTable(v, pInde
e0d0: 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 62 61 73  x->iDb);.    bas
e0e0: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  e = sqlite3VdbeA
e0f0: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
e100: 79 53 69 7a 65 28 64 72 6f 70 49 6e 64 65 78 29  ySize(dropIndex)
e110: 2c 20 64 72 6f 70 49 6e 64 65 78 29 3b 0a 20 20  , dropIndex);.  
e120: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
e130: 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31 2c  ngeP3(v, base+1,
e140: 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
e150: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64  0);.    if( pInd
e160: 65 78 2d 3e 69 44 62 3d 3d 30 20 29 7b 0a 20 20  ex->iDb==0 ){.  
e170: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
e180: 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a  eCookie(db, v);.
e190: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e1a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
e1b0: 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20  _Close, 0, 0);. 
e1c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e1d0: 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  dOp(v, OP_Destro
e1e0: 79 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  y, pIndex->tnum,
e1f0: 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20   pIndex->iDb);. 
e200: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 57 72 69     sqlite3EndWri
e210: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
e220: 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  se);.  }..  /* D
e230: 65 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  elete the in-mem
e240: 6f 72 79 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ory description 
e250: 6f 66 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  of this index.. 
e260: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
e270: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
e280: 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41    sqlite3UnlinkA
e290: 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62  ndDeleteIndex(db
e2a0: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 64  , pIndex);.    d
e2b0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
e2c0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
e2d0: 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70  ;.  }..exit_drop
e2e0: 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65  _index:.  sqlite
e2f0: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
e300: 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
e310: 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65  Append a new ele
e320: 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65  ment to the give
e330: 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74  n IdList.  Creat
e340: 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69  e a new IdList i
e350: 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a  f.** need be..**
e360: 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74  .** A new IdList
e370: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
e380: 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
e390: 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69  ) fails..*/.IdLi
e3a0: 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
e3b0: 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a  tAppend(IdList *
e3c0: 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
e3d0: 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69  oken){.  if( pLi
e3e0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
e3f0: 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  st = sqliteMallo
e400: 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74  c( sizeof(IdList
e410: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
e420: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
e430: 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
e440: 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  loc = 0;.  }.  i
e450: 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3e 3d 70  f( pList->nId>=p
e460: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  List->nAlloc ){.
e470: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
e480: 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 70  t_item *a;.    p
e490: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  List->nAlloc = p
e4a0: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b  List->nAlloc*2 +
e4b0: 20 35 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69   5;.    a = sqli
e4c0: 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d  teRealloc(pList-
e4d0: 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  >a, pList->nAllo
e4e0: 63 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  c*sizeof(pList->
e4f0: 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
e500: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   a==0 ){.      s
e510: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
e520: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  te(pList);.     
e530: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
e540: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
e550: 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  a;.  }.  memset(
e560: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
e570: 3e 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >nId], 0, sizeof
e580: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
e590: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
e5a0: 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20      char **pz = 
e5b0: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
e5c0: 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >nId].zName;.   
e5d0: 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69   sqlite3SetNStri
e5e0: 6e 67 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a  ng(pz, pToken->z
e5f0: 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b  , pToken->n, 0);
e600: 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20  .    if( *pz==0 
e610: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e620: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  IdListDelete(pLi
e630: 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
e640: 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n 0;.    }else{.
e650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
e660: 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d  uote(*pz);.    }
e670: 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e 49  .  }.  pList->nI
e680: 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  d++;.  return pL
e690: 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  ist;.}../*.** Ap
e6a0: 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65  pend a new table
e6b0: 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76   name to the giv
e6c0: 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65  en SrcList.  Cre
e6d0: 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73  ate a new SrcLis
e6e0: 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
e6f0: 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
e700: 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
e710: 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20  SrcList even if 
e720: 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a  pToken is NULL..
e730: 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c  **.** A new SrcL
e740: 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
e750: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c   or NULL if mall
e760: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a  oc() fails..**.*
e770: 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69  * If pDatabase i
e780: 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d  s not null, it m
e790: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61  eans that the ta
e7a0: 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f  ble has an optio
e7b0: 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  nal.** database 
e7c0: 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69  name prefix.  Li
e7d0: 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62  ke this:  "datab
e7e0: 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65  ase.table".  The
e7f0: 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f   pDatabase.** po
e800: 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c  ints to the tabl
e810: 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70  e name and the p
e820: 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  Table points to 
e830: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
e840: 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73  e..** The SrcLis
e850: 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c  t.a[].zName fiel
e860: 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  d is filled with
e870: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
e880: 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63  which might.** c
e890: 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20  ome from pTable 
e8a0: 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73  (if pDatabase is
e8b0: 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70   NULL) or from p
e8c0: 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53  Database.  .** S
e8d0: 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61  rcList.a[].zData
e8e0: 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77  base is filled w
e8f0: 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
e900: 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   name from pTabl
e910: 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55  e,.** or with NU
e920: 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73  LL if no databas
e930: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a  e is specified..
e940: 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
e950: 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69  ords, if call li
e960: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
e970: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
e980: 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c  cListAppend(A,B,
e990: 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42  0);.**.** Then B
e9a0: 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   is a table name
e9b0: 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
e9c0: 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63  e name is unspec
e9d0: 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65  ified.  If calle
e9e0: 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a  d.** like this:.
e9f0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
ea00: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
ea10: 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a  nd(A,B,C);.**.**
ea20: 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74   Then C is the t
ea30: 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20  able name and B 
ea40: 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
ea50: 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  name..*/.SrcList
ea60: 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
ea70: 41 70 70 65 6e 64 28 53 72 63 4c 69 73 74 20 2a  Append(SrcList *
ea80: 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
ea90: 61 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70 44 61  able, Token *pDa
eaa0: 74 61 62 61 73 65 29 7b 0a 20 20 69 66 28 20 70  tabase){.  if( p
eab0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
eac0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  List = sqliteMal
ead0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53 72 63 4c  loc( sizeof(SrcL
eae0: 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
eaf0: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
eb00: 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  n 0;.    pList->
eb10: 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a  nAlloc = 1;.  }.
eb20: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 53 72    if( pList->nSr
eb30: 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  c>=pList->nAlloc
eb40: 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
eb50: 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73 74  *pNew;.    pList
eb60: 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20  ->nAlloc *= 2;. 
eb70: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
eb80: 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a 20  Realloc(pList,. 
eb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
eba0: 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20 28  zeof(*pList) + (
ebb0: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29  pList->nAlloc-1)
ebc0: 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61  *sizeof(pList->a
ebd0: 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
ebe0: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
ebf0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
ec00: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
ec10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ec20: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20    }.    pList = 
ec30: 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  pNew;.  }.  mems
ec40: 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69  et(&pList->a[pLi
ec50: 73 74 2d 3e 6e 53 72 63 5d 2c 20 30 2c 20 73 69  st->nSrc], 0, si
ec60: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
ec70: 29 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62  ));.  if( pDatab
ec80: 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65  ase && pDatabase
ec90: 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  ->z==0 ){.    pD
eca0: 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
ecb0: 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
ecc0: 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a 20 20   && pTable ){.  
ecd0: 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d    Token *pTemp =
ece0: 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20   pDatabase;.    
ecf0: 70 44 61 74 61 62 61 73 65 20 3d 20 70 54 61 62  pDatabase = pTab
ed00: 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d  le;.    pTable =
ed10: 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 69 66   pTemp;.  }.  if
ed20: 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
ed30: 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69  char **pz = &pLi
ed40: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
ed50: 63 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71  c].zName;.    sq
ed60: 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28  lite3SetNString(
ed70: 70 7a 2c 20 70 54 61 62 6c 65 2d 3e 7a 2c 20 70  pz, pTable->z, p
ed80: 54 61 62 6c 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20  Table->n, 0);.  
ed90: 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a    if( *pz==0 ){.
eda0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
edb0: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
edc0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
edd0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
ede0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
edf0: 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20  te(*pz);.    }. 
ee00: 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61   }.  if( pDataba
ee10: 73 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  se ){.    char *
ee20: 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  *pz = &pList->a[
ee30: 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a 44 61  pList->nSrc].zDa
ee40: 74 61 62 61 73 65 3b 0a 20 20 20 20 73 71 6c 69  tabase;.    sqli
ee50: 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a  te3SetNString(pz
ee60: 2c 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 2c 20  , pDatabase->z, 
ee70: 70 44 61 74 61 62 61 73 65 2d 3e 6e 2c 20 30 29  pDatabase->n, 0)
ee80: 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30  ;.    if( *pz==0
ee90: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
eea0: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
eeb0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
eec0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
eed0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
eee0: 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20  equote(*pz);.   
eef0: 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e   }.  }.  pList->
ef00: 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 69  a[pList->nSrc].i
ef10: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70  Cursor = -1;.  p
ef20: 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20  List->nSrc++;.  
ef30: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
ef40: 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75  ./*.** Assign cu
ef50: 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61 62  rsors to all tab
ef60: 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74  les in a SrcList
ef70: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
ef80: 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
ef90: 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  sors(Parse *pPar
efa0: 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  se, SrcList *pLi
efb0: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
efc0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
efd0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
efe0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
eff0: 5d 2e 69 43 75 72 73 6f 72 3c 30 20 29 7b 0a 20  ].iCursor<0 ){. 
f000: 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d       pList->a[i]
f010: 2e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  .iCursor = pPars
f020: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d  e->nTab++;.    }
f030: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
f040: 64 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68  d an alias to th
f050: 65 20 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65  e last identifie
f060: 72 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69  r on the given i
f070: 64 65 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a  dentifier list..
f080: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
f090: 72 63 4c 69 73 74 41 64 64 41 6c 69 61 73 28 53  rcListAddAlias(S
f0a0: 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  rcList *pList, T
f0b0: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
f0c0: 20 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c   if( pList && pL
f0d0: 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20  ist->nSrc>0 ){. 
f0e0: 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74     int i = pList
f0f0: 2d 3e 6e 53 72 63 20 2d 20 31 3b 0a 20 20 20 20  ->nSrc - 1;.    
f100: 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e  sqlite3SetNStrin
f110: 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  g(&pList->a[i].z
f120: 41 6c 69 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a  Alias, pToken->z
f130: 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b  , pToken->n, 0);
f140: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
f150: 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ote(pList->a[i].
f160: 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a  zAlias);.  }.}..
f170: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
f180: 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  IdList..*/.void 
f190: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
f1a0: 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  ete(IdList *pLis
f1b0: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
f1c0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
f1d0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
f1e0: 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
f1f0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ++){.    sqliteF
f200: 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
f210: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zName);.  }.  sq
f220: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
f230: 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  a);.  sqliteFree
f240: 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pList);.}../*.*
f250: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
f260: 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74  ex in pList of t
f270: 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61  he identifier na
f280: 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e  med zId.  Return
f290: 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f   -1.** if not fo
f2a0: 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
f2b0: 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49  te3IdListIndex(I
f2c0: 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f  dList *pList, co
f2d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
f2e0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
f2f0: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
f300: 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30  rn -1;.  for(i=0
f310: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
f320: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
f330: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
f340: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
f350: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
f360: 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
f370: 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
f380: 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
f390: 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69   SrcList includi
f3a0: 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74  ng all its subst
f3b0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64  ructure..*/.void
f3c0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
f3d0: 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20 2a 70  elete(SrcList *p
f3e0: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
f3f0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
f400: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
f410: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  =0; i<pList->nSr
f420: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  c; i++){.    sql
f430: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
f440: 5b 69 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [i].zDatabase);.
f450: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
f460: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
f470: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
f480: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  e(pList->a[i].zA
f490: 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lias);.    if( p
f4a0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20  List->a[i].pTab 
f4b0: 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  && pList->a[i].p
f4c0: 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74  Tab->isTransient
f4d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f4e0: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  3DeleteTable(0, 
f4f0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  pList->a[i].pTab
f500: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
f510: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
f520: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  (pList->a[i].pSe
f530: 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  lect);.    sqlit
f540: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 4c 69  e3ExprDelete(pLi
f550: 73 74 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20  st->a[i].pOn);. 
f560: 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
f570: 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b  Delete(pList->a[
f580: 69 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a  i].pUsing);.  }.
f590: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
f5a0: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  st);.}../*.** Be
f5b0: 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  gin a transactio
f5c0: 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
f5d0: 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  3BeginTransactio
f5e0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
f5f0: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20   int onError){. 
f600: 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20   sqlite *db;..  
f610: 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
f620: 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
f630: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
f640: 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
f650: 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
f660: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
f670: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
f680: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
f690: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
f6a0: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
f6b0: 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47  RANSACTION, "BEG
f6c0: 49 4e 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  IN", 0, 0) ) ret
f6d0: 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66  urn;.  if( db->f
f6e0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
f6f0: 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 73 71 6c  Trans ){.    sql
f700: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
f710: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 73 74 61  rse, "cannot sta
f720: 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
f730: 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
f740: 63 74 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74  ction");.    ret
f750: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
f760: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
f770: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
f780: 20 30 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72   0);.  if( !pPar
f790: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
f7a0: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
f7b0: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a  SQLITE_InTrans;.
f7c0: 20 20 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20      db->onError 
f7d0: 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 7d  = onError;.  }.}
f7e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
f7f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
f800: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d  void sqlite3Comm
f810: 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  itTransaction(Pa
f820: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
f830: 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69  sqlite *db;..  i
f840: 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
f850: 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
f860: 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d  =0 || db->aDb[0]
f870: 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
f880: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
f890: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f  nErr || sqlite3_
f8a0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
f8b0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71  return;.  if( sq
f8c0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
f8d0: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
f8e0: 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d  ANSACTION, "COMM
f8f0: 49 54 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  IT", 0, 0) ) ret
f900: 75 72 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e  urn;.  if( (db->
f910: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
f920: 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20  nTrans)==0 ){.  
f930: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
f940: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
f950: 74 20 63 6f 6d 6d 69 74 20 2d 20 6e 6f 20 74 72  t commit - no tr
f960: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
f970: 69 76 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ive");.    retur
f980: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  n;.  }.  if( !pP
f990: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
f9a0: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  .    db->flags &
f9b0: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e  = ~SQLITE_InTran
f9c0: 73 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  s;.  }.  sqlite3
f9d0: 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
f9e0: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  n(pParse);.  if(
f9f0: 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
fa00: 6e 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6f 6e 45  n ){.    db->onE
fa10: 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c  rror = OE_Defaul
fa20: 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t;.  }.}../*.** 
fa30: 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  Rollback a trans
fa40: 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
fa50: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72  qlite3RollbackTr
fa60: 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
fa70: 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
fa80: 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  te *db;.  Vdbe *
fa90: 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  v;..  if( pParse
faa0: 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
fab0: 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
fac0: 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
fad0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
fae0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
faf0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
fb00: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
fb10: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
fb20: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
fb30: 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
fb40: 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c  , "ROLLBACK", 0,
fb50: 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   0) ) return;.  
fb60: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
fb70: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29   SQLITE_InTrans)
fb80: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
fb90: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
fba0: 65 2c 20 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62  e, "cannot rollb
fbb0: 61 63 6b 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63  ack - no transac
fbc0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 29  tion is active")
fbd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 0a 20  ;.    return; . 
fbe0: 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
fbf0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
fc00: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
fc10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fc20: 28 76 2c 20 4f 50 5f 52 6f 6c 6c 62 61 63 6b 2c  (v, OP_Rollback,
fc30: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   0, 0);.  }.  if
fc40: 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  ( !pParse->expla
fc50: 69 6e 20 29 7b 0a 20 20 20 20 64 62 2d 3e 66 6c  in ){.    db->fl
fc60: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
fc70: 6e 54 72 61 6e 73 3b 0a 20 20 20 20 64 62 2d 3e  nTrans;.    db->
fc80: 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66  onError = OE_Def
fc90: 61 75 6c 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ault;.  }.}../*.
fca0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
fcb0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
fcc0: 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d  verify the schem
fcd0: 61 20 63 6f 6f 6b 69 65 20 66 6f 72 20 61 6c 6c  a cookie for all
fce0: 0a 2a 2a 20 6e 61 6d 65 64 20 64 61 74 61 62 61  .** named databa
fcf0: 73 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 76 6f 69  se files..*/.voi
fd00: 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  d sqlite3CodeVer
fd10: 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20  ifySchema(Parse 
fd20: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
fd30: 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  ){.  sqlite *db 
fd40: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
fd50: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
fd60: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
fd70: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
fd80: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
fd90: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  b );.  assert( d
fda0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21  b->aDb[iDb].pBt!
fdb0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 44 62 21  =0 );.  if( iDb!
fdc0: 3d 31 20 26 26 20 21 44 62 48 61 73 50 72 6f 70  =1 && !DbHasProp
fdd0: 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42  erty(db, iDb, DB
fde0: 5f 43 6f 6f 6b 69 65 29 20 29 7b 0a 20 20 20 20  _Cookie) ){.    
fdf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fe00: 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f  (v, OP_VerifyCoo
fe10: 6b 69 65 2c 20 69 44 62 2c 20 64 62 2d 3e 61 44  kie, iDb, db->aD
fe20: 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f  b[iDb].schema_co
fe30: 6f 6b 69 65 29 3b 0a 20 20 20 20 44 62 53 65 74  okie);.    DbSet
fe40: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62  Property(db, iDb
fe50: 2c 20 44 42 5f 43 6f 6f 6b 69 65 29 3b 0a 20 20  , DB_Cookie);.  
fe60: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
fe70: 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68  ate VDBE code th
fe80: 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20  at prepares for 
fe90: 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69  doing an operati
fea0: 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74  on that.** might
feb0: 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61   change the data
fec0: 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  base..**.** This
fed0: 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20   routine starts 
fee0: 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
fef0: 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  n if we are not 
ff00: 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a  already within.*
ff10: 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  * a transaction.
ff20: 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65    If we are alre
ff30: 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61  ady within a tra
ff40: 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61  nsaction, then a
ff50: 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69   checkpoint.** i
ff60: 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74  s set if the set
ff70: 43 68 65 63 6b 70 6f 69 6e 74 20 70 61 72 61 6d  Checkpoint param
ff80: 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41  eter is true.  A
ff90: 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
ffa0: 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72  ld.** be set for
ffb0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74   operations that
ffc0: 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65   might fail (due
ffd0: 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   to a constraint
ffe0: 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  ) part of.** the
fff0: 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64   way through and
10000 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64   which will need
10010 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72   to undo some wr
10020 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76  ites without hav
10030 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61  ing to.** rollba
10040 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  ck the whole tra
10050 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f  nsaction.  For o
10060 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20  perations where 
10070 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
10080 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65  ** can be checke
10090 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  d before any cha
100a0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
100b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
100c0 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65  t is never.** ne
100d0 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
100e0 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20  a write and the 
100f0 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
10100 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a  d not be set..**
10110 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73  .** Only databas
10120 65 20 69 44 62 20 61 6e 64 20 74 68 65 20 74 65  e iDb and the te
10130 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20  mp database are 
10140 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 62 79  made writable by
10150 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49   this call..** I
10160 66 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74  f iDb==0, then t
10170 68 65 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70  he main and temp
10180 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 6d   databases are m
10190 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20  ade writable.   
101a0 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65  If.** iDb==1 the
101b0 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20  n only the temp 
101c0 64 61 74 61 62 61 73 65 20 69 73 20 6d 61 64 65  database is made
101d0 20 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69   writable.  If i
101e0 44 62 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a  Db>1 then the.**
101f0 20 73 70 65 63 69 66 69 65 64 20 61 75 78 69 6c   specified auxil
10200 69 61 72 79 20 64 61 74 61 62 61 73 65 20 61 6e  iary database an
10210 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  d the temp datab
10220 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69  ase are made wri
10230 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
10240 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
10250 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
10260 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74  *pParse, int set
10270 43 68 65 63 6b 70 6f 69 6e 74 2c 20 69 6e 74 20  Checkpoint, int 
10280 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  iDb){.  Vdbe *v;
10290 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
102a0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
102b0 28 20 44 62 48 61 73 50 72 6f 70 65 72 74 79 28  ( DbHasProperty(
102c0 64 62 2c 20 69 44 62 2c 20 44 42 5f 4c 6f 63 6b  db, iDb, DB_Lock
102d0 65 64 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ed) ) return;.  
102e0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
102f0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
10300 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
10310 0a 20 20 69 66 28 20 21 64 62 2d 3e 61 44 62 5b  .  if( !db->aDb[
10320 69 44 62 5d 2e 69 6e 54 72 61 6e 73 20 29 7b 0a  iDb].inTrans ){.
10330 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10340 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73  ddOp(v, OP_Trans
10350 61 63 74 69 6f 6e 2c 20 69 44 62 2c 20 30 29 3b  action, iDb, 0);
10360 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72  .    DbSetProper
10370 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 4c  ty(db, iDb, DB_L
10380 6f 63 6b 65 64 29 3b 0a 20 20 20 20 73 71 6c 69  ocked);.    sqli
10390 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
103a0 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
103b0 3b 0a 20 20 20 20 69 66 28 20 69 44 62 21 3d 31  ;.    if( iDb!=1
103c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
103d0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
103e0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 73 65 74  tion(pParse, set
103f0 43 68 65 63 6b 70 6f 69 6e 74 2c 20 31 29 3b 0a  Checkpoint, 1);.
10400 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
10410 28 20 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 20  ( setCheckpoint 
10420 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
10430 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 68  beAddOp(v, OP_Ch
10440 65 63 6b 70 6f 69 6e 74 2c 20 69 44 62 2c 20 30  eckpoint, iDb, 0
10450 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70  );.    DbSetProp
10460 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42  erty(db, iDb, DB
10470 5f 4c 6f 63 6b 65 64 29 3b 0a 20 20 7d 0a 7d 0a  _Locked);.  }.}.
10480 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
10490 63 6f 64 65 20 74 68 61 74 20 63 6f 6e 63 6c 75  code that conclu
104a0 64 65 73 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  des an operation
104b0 20 74 68 61 74 20 6d 61 79 20 68 61 76 65 20 63   that may have c
104c0 68 61 6e 67 65 64 0a 2a 2a 20 74 68 65 20 64 61  hanged.** the da
104d0 74 61 62 61 73 65 2e 20 20 49 66 20 61 20 73 74  tabase.  If a st
104e0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
104f0 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2c  ion was started,
10500 20 74 68 65 6e 20 65 6d 69 74 0a 2a 2a 20 61 6e   then emit.** an
10510 20 4f 50 5f 43 6f 6d 6d 69 74 20 74 68 61 74 20   OP_Commit that 
10520 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 63  will cause the c
10530 68 61 6e 67 65 73 20 74 6f 20 62 65 20 63 6f 6d  hanges to be com
10540 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a  mitted to disk..
10550 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
10560 63 68 65 63 6b 70 6f 69 6e 74 73 20 61 72 65 20  checkpoints are 
10570 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f  automatically co
10580 6d 6d 69 74 74 65 64 20 61 74 20 74 68 65 20 65  mmitted at the e
10590 6e 64 20 6f 66 0a 2a 2a 20 61 20 73 74 61 74 65  nd of.** a state
105a0 6d 65 6e 74 2e 20 20 4e 6f 74 65 20 61 6c 73 6f  ment.  Note also
105b0 20 74 68 61 74 20 74 68 65 72 65 20 63 61 6e 20   that there can 
105c0 62 65 20 6d 75 6c 74 69 70 6c 65 20 63 61 6c 6c  be multiple call
105d0 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33  s to .** sqlite3
105e0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
105f0 69 6f 6e 28 29 20 62 75 74 20 74 68 65 72 65 20  ion() but there 
10600 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 61  should only be a
10610 20 73 69 6e 67 6c 65 0a 2a 2a 20 63 61 6c 6c 20   single.** call 
10620 74 6f 20 73 71 6c 69 74 65 33 45 6e 64 57 72 69  to sqlite3EndWri
10630 74 65 4f 70 65 72 61 74 69 6f 6e 28 29 20 61 74  teOperation() at
10640 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
10650 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
10660 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10670 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  3EndWriteOperati
10680 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
10690 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
106a0 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
106b0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
106c0 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
106d0 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 69 66   ) return; /* if
106e0 20 74 68 69 73 20 69 73 20 69 6e 20 61 20 74 72   this is in a tr
106f0 69 67 67 65 72 20 2a 2f 0a 20 20 76 20 3d 20 73  igger */.  v = s
10700 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
10710 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
10720 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
10730 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
10740 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a  LITE_InTrans ){.
10750 20 20 20 20 2f 2a 20 41 20 42 45 47 49 4e 20 68      /* A BEGIN h
10760 61 73 20 65 78 65 63 75 74 65 64 2e 20 20 44 6f  as executed.  Do
10770 20 6e 6f 74 20 63 6f 6d 6d 69 74 20 75 6e 74 69   not commit unti
10780 6c 20 77 65 20 73 65 65 20 61 6e 20 65 78 70 6c  l we see an expl
10790 69 63 69 74 0a 20 20 20 20 2a 2a 20 43 4f 4d 4d  icit.    ** COMM
107a0 49 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f  IT statement. */
107b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
107c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
107d0 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20  , OP_Commit, 0, 
107e0 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a           0);.  }.}....