/ Hex Artifact Content
Login

Artifact 35cbeb439b49cca5eb5e8a1de010a5194f4523e8:


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 39 33 20 32 30 30 34 2f 30 35 2f 32 32 20 30  193 2004/05/22 0
0300: 38 3a 30 39 3a 31 31 20 64 61 6e 69 65 6c 6b 31  8:09:11 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 20 20 73 71  STER_ROOT);.  sq
31a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
31b0: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
31c0: 6e 73 2c 20 30 2c 20 35 29 3b 20 2f 2a 20 73 71  ns, 0, 5); /* sq
31d0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 68 61 73 20  lite_master has 
31e0: 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a  5 columns */.}..
31f0: 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73  /*.** Begin cons
3200: 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74  tructing a new t
3210: 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74  able representat
3220: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  ion in memory.  
3230: 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66  This is.** the f
3240: 69 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20  irst of several 
3250: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
3260: 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20  that get called 
3270: 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74  in response.** t
3280: 6f 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  o a CREATE TABLE
3290: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20   statement.  In 
32a0: 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73  particular, this
32b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
32c0: 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69  ed.** after seei
32d0: 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54  ng tokens "CREAT
32e0: 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61  E" and "TABLE" a
32f0: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  nd the table nam
3300: 65 2e 20 20 54 68 65 0a 2a 2a 20 70 53 74 61 72  e.  The.** pStar
3310: 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 43  t token is the C
3320: 52 45 41 54 45 20 61 6e 64 20 70 4e 61 6d 65 20  REATE and pName 
3330: 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  is the table nam
3340: 65 2e 20 20 54 68 65 20 69 73 54 65 6d 70 0a 2a  e.  The isTemp.*
3350: 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69  * flag is true i
3360: 66 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75  f the table shou
3370: 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ld be stored in 
3380: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
3390: 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69  tabase.** file i
33a0: 6e 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65  nstead of in the
33b0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
33c0: 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ile.  This is no
33d0: 72 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a  rmally the case.
33e0: 2a 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d  ** when the "TEM
33f0: 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59  P" or "TEMPORARY
3400: 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73  " keyword occurs
3410: 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43   in between.** C
3420: 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e  REATE and TABLE.
3430: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74  .**.** The new t
3440: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69  able record is i
3450: 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70  nitialized and p
3460: 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e  ut in pParse->pN
3470: 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d  ewTable..** As m
3480: 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54  ore of the CREAT
3490: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
34a0: 74 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64  t is parsed, add
34b0: 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a  itional action.*
34c0: 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20  * routines will 
34d0: 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64  be called to add
34e0: 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f   more informatio
34f0: 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64  n to this record
3500: 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
3510: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
3520: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  BLE statement, t
3530: 68 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  he sqlite3EndTab
3540: 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  le() routine.** 
3550: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d  is called to com
3560: 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72  plete the constr
3570: 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65  uction of the ne
3580: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a  w table record..
3590: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
35a0: 74 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72  tartTable(.  Par
35b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
35c0: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
35d0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61  */.  Token *pSta
35e0: 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 22 43 52  rt,   /* The "CR
35f0: 45 41 54 45 22 20 74 6f 6b 65 6e 20 2a 2f 0a 20  EATE" token */. 
3600: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20   Token *pName,  
3610: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62    /* Name of tab
3620: 6c 65 20 6f 72 20 76 69 65 77 20 74 6f 20 63 72  le or view to cr
3630: 65 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  eate */.  int is
3640: 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72  Temp,      /* Tr
3650: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
3660: 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TEMP table */.  
3670: 69 6e 74 20 69 73 56 69 65 77 20 20 20 20 20 20  int isView      
3680: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
3690: 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 29 7b   is a VIEW */.){
36a0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
36b0: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
36c0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
36d0: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
36e0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
36f0: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b  e *v;.  int iDb;
3700: 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 46 69 72  ..  pParse->sFir
3710: 73 74 54 6f 6b 65 6e 20 3d 20 2a 70 53 74 61 72  stToken = *pStar
3720: 74 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  t;.  zName = sql
3730: 69 74 65 33 54 61 62 6c 65 4e 61 6d 65 46 72 6f  ite3TableNameFro
3740: 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
3750: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
3760: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 64 62  return;.  if( db
3770: 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20  ->init.iDb==1 ) 
3780: 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e  isTemp = 1;.#ifn
3790: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
37a0: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
37b0: 61 73 73 65 72 74 28 20 28 69 73 54 65 6d 70 20  assert( (isTemp 
37c0: 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a  & 1)==isTemp );.
37d0: 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
37e0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20  ;.    char *zDb 
37f0: 3d 20 69 73 54 65 6d 70 20 3f 20 22 74 65 6d 70  = isTemp ? "temp
3800: 22 20 3a 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20  " : "main";.    
3810: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
3820: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
3830: 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45  ITE_INSERT, SCHE
3840: 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29  MA_TABLE(isTemp)
3850: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
3860: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
3870: 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
3880: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rn;.    }.    if
3890: 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20  ( isView ){.    
38a0: 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a    if( isTemp ){.
38b0: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
38c0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
38d0: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65  P_VIEW;.      }e
38e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
38f0: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
3900: 45 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a  E_VIEW;.      }.
3910: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3920: 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20   if( isTemp ){. 
3930: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
3940: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
3950: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65  _TABLE;.      }e
3960: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
3970: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
3980: 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  E_TABLE;.      }
3990: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
39a0: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
39b0: 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e  pParse, code, zN
39c0: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
39d0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
39e0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  (zName);.      r
39f0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
3a00: 0a 23 65 6e 64 69 66 0a 20 0a 0a 20 20 2f 2a 20  .#endif. ..  /* 
3a10: 42 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 6f  Before trying to
3a20: 20 63 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72   create a tempor
3a30: 61 72 79 20 74 61 62 6c 65 2c 20 6d 61 6b 65 20  ary table, make 
3a40: 73 75 72 65 20 74 68 65 20 42 74 72 65 65 20 66  sure the Btree f
3a50: 6f 72 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20  or.  ** holding 
3a60: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
3a70: 20 69 73 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20   is open..  */. 
3a80: 20 69 66 28 20 69 73 54 65 6d 70 20 26 26 20 64   if( isTemp && d
3a90: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30  b->aDb[1].pBt==0
3aa0: 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70   && !pParse->exp
3ab0: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  lain ){.    int 
3ac0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
3ad0: 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30 2c 20  eFactory(db, 0, 
3ae0: 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 26 64  0, MAX_PAGES, &d
3af0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a  b->aDb[1].pBt);.
3b00: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
3b10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
3b20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3b30: 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
3b40: 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
3b50: 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20  ry database ".  
3b60: 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20        "file for 
3b70: 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72  storing temporar
3b80: 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20  y tables");.    
3b90: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
3ba0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
3bb0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
3bc0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
3bd0: 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20  _InTrans ){.    
3be0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
3bf0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 64 62  reeBeginTrans(db
3c00: 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20  ->aDb[1].pBt);. 
3c10: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
3c20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
3c30: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3c40: 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
3c50: 65 20 74 6f 20 67 65 74 20 61 20 77 72 69 74 65  e to get a write
3c60: 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20   lock on ".     
3c70: 20 20 20 20 20 22 74 68 65 20 74 65 6d 70 6f 72       "the tempor
3c80: 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  ary database fil
3c90: 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  e");.        ret
3ca0: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
3cb0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
3cc0: 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74  e sure the new t
3cd0: 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e  able name does n
3ce0: 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20  ot collide with 
3cf0: 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a  an existing.  **
3d00: 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
3d10: 6e 61 6d 65 2e 20 20 49 73 73 75 65 20 61 6e 20  name.  Issue an 
3d20: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66  error message if
3d30: 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2a 0a 20   it does..  **. 
3d40: 20 2a 2a 20 49 66 20 77 65 20 61 72 65 20 72 65   ** If we are re
3d50: 2d 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c  -reading the sql
3d60: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
3d70: 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 73 63   because of a sc
3d80: 68 65 6d 61 0a 20 20 2a 2a 20 63 68 61 6e 67 65  hema.  ** change
3d90: 20 61 6e 64 20 61 20 6e 65 77 20 70 65 72 6d 61   and a new perma
3da0: 6e 65 6e 74 20 74 61 62 6c 65 20 69 73 20 66 6f  nent table is fo
3db0: 75 6e 64 20 77 68 6f 73 65 20 6e 61 6d 65 20 63  und whose name c
3dc0: 6f 6c 6c 69 64 65 73 20 77 69 74 68 0a 20 20 2a  ollides with.  *
3dd0: 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 65  * an existing te
3de0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74  mporary table, t
3df0: 68 61 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 72  hat is not an er
3e00: 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62  ror..  */.  pTab
3e10: 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  le = sqlite3Find
3e20: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
3e30: 20 30 29 3b 0a 20 20 69 44 62 20 3d 20 69 73 54   0);.  iDb = isT
3e40: 65 6d 70 20 3f 20 31 20 3a 20 64 62 2d 3e 69 6e  emp ? 1 : db->in
3e50: 69 74 2e 69 44 62 3b 0a 20 20 69 66 28 20 70 54  it.iDb;.  if( pT
3e60: 61 62 6c 65 21 3d 30 20 26 26 20 28 70 54 61 62  able!=0 && (pTab
3e70: 6c 65 2d 3e 69 44 62 3d 3d 69 44 62 20 7c 7c 20  le->iDb==iDb || 
3e80: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20  !db->init.busy) 
3e90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
3ea0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3eb0: 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79  table %T already
3ec0: 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29   exists", pName)
3ed0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
3ee0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  (zName);.    ret
3ef0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  urn;.  }.  if( (
3f00: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 46 69  pIdx = sqlite3Fi
3f10: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
3f20: 65 2c 20 30 29 29 21 3d 30 20 26 26 0a 20 20 20  e, 0))!=0 &&.   
3f30: 20 20 20 20 20 20 20 28 70 49 64 78 2d 3e 69 44         (pIdx->iD
3f40: 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69  b==0 || !db->ini
3f50: 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 73  t.busy) ){.    s
3f60: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3f70: 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73  Parse, "there is
3f80: 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65   already an inde
3f90: 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61  x named %s", zNa
3fa0: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
3fb0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
3fc0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54  return;.  }.  pT
3fd0: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c  able = sqliteMal
3fe0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c  loc( sizeof(Tabl
3ff0: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
4000: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  le==0 ){.    sql
4010: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
4020: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
4030: 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20    pTable->zName 
4040: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c  = zName;.  pTabl
4050: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  e->nCol = 0;.  p
4060: 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b  Table->aCol = 0;
4070: 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79  .  pTable->iPKey
4080: 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d   = -1;.  pTable-
4090: 3e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70  >pIndex = 0;.  p
40a0: 54 61 62 6c 65 2d 3e 69 44 62 20 3d 20 69 44 62  Table->iDb = iDb
40b0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
40c0: 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c 69  pNewTable ) sqli
40d0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
40e0: 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  b, pParse->pNewT
40f0: 61 62 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d  able);.  pParse-
4100: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61  >pNewTable = pTa
4110: 62 6c 65 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  ble;..  /* Begin
4120: 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
4130: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
4140: 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20  nsert the table 
4150: 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a  record into.  **
4160: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
4170: 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20  ER table.  Note 
4180: 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68  in particular th
4190: 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68  at we must go ah
41a0: 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c  ead.  ** and all
41b0: 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64  ocate the record
41c0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
41d0: 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e  table entry now.
41e0: 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a    Before any.  *
41f0: 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  * PRIMARY KEY or
4200: 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73   UNIQUE keywords
4210: 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68   are parsed.  Th
4220: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c  ose keywords wil
4230: 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64  l cause.  ** ind
4240: 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74  ices to be creat
4250: 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  ed and the table
4260: 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d   record must com
4270: 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20  e before the .  
4280: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e  ** indices.  Hen
4290: 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ce, the record n
42a0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
42b0: 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  ble must be allo
42c0: 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a  cated.  ** now..
42d0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
42e0: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20  init.busy && (v 
42f0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
4300: 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a  (pParse))!=0 ){.
4310: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
4320: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
4330: 50 61 72 73 65 2c 20 30 2c 20 69 73 54 65 6d 70  Parse, 0, isTemp
4340: 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 54 65  );.    if( !isTe
4350: 6d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  mp ){.      sqli
4360: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4370: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e  OP_Integer, db->
4380: 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 30 29 3b  file_format, 0);
4390: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
43a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
43b0: 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 31 29 3b 0a  tCookie, 0, 1);.
43c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
43d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
43e0: 65 67 65 72 2c 20 64 62 2d 3e 65 6e 63 2c 20 30  eger, db->enc, 0
43f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4400: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4410: 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 34 29  SetCookie, 0, 4)
4420: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
4430: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
4440: 6c 65 28 76 2c 20 69 73 54 65 6d 70 29 3b 0a 20  le(v, isTemp);. 
4450: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4460: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63  dOp(v, OP_NewRec
4470: 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  no, 0, 0);.    s
4480: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4490: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
44a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
44b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
44c0: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
44d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
44e0: 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79  (v, OP_PutIntKey
44f0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 0, 0);.  }.}..
4500: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
4510: 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61  column to the ta
4520: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65  ble currently be
4530: 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e  ing constructed.
4540: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  .**.** The parse
4550: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
4560: 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61  tine once for ea
4570: 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72  ch column declar
4580: 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52  ation.** in a CR
4590: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
45a0: 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74  ment.  sqlite3St
45b0: 61 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20  artTable() gets 
45c0: 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20  called.** first 
45d0: 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f  to get things go
45e0: 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20  ing.  Then this 
45f0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
4600: 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f  d for each.** co
4610: 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lumn..*/.void sq
4620: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50  lite3AddColumn(P
4630: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
4640: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54  ken *pName){.  T
4650: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
4660: 3b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  ;.  char *z = 0;
4670: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
4680: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
4690: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
46a0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
46b0: 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28  lite3SetNString(
46c0: 26 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  &z, pName->z, pN
46d0: 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 69 66  ame->n, 0);.  if
46e0: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
46f0: 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74  .  sqlite3Dequot
4700: 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  e(z);.  for(i=0;
4710: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
4720: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
4730: 33 53 74 72 49 43 6d 70 28 7a 2c 20 70 2d 3e 61  3StrICmp(z, p->a
4740: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  Col[i].zName)==0
4750: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4760: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4770: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
4780: 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  umn name: %s", z
4790: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
47a0: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65  ree(z);.      re
47b0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
47c0: 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26    if( (p->nCol &
47d0: 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   0x7)==0 ){.    
47e0: 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20  Column *aNew;.  
47f0: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    aNew = sqliteR
4800: 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c  ealloc( p->aCol,
4810: 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a   (p->nCol+8)*siz
4820: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
4830: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d  ;.    if( aNew==
4840: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
4850: 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a  p->aCol = aNew;.
4860: 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d    }.  pCol = &p-
4870: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a  >aCol[p->nCol];.
4880: 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30    memset(pCol, 0
4890: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  , sizeof(p->aCol
48a0: 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a  [0]));.  pCol->z
48b0: 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a  Name = z;. .  /*
48c0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
48d0: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
48e0: 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65  columns have the
48f0: 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74   default affinit
4900: 79 0a 20 20 2a 2a 20 27 4e 55 4d 45 52 49 43 27  y.  ** 'NUMERIC'
4910: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
4920: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
4930: 74 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43  then sqlite3AddC
4940: 6f 6c 75 6d 6e 54 79 70 65 28 29 0a 20 20 2a 2a  olumnType().  **
4950: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
4960: 6e 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c  next to set pCol
4970: 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65  ->affinity corre
4980: 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f  ctly..  */.  pCo
4990: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
49a0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
49b0: 3b 0a 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20  ;.  pCol->pColl 
49c0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44  = pParse->db->pD
49d0: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 70 2d 3e 6e 43  fltColl;.  p->nC
49e0: 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ol++;.}../*.** T
49f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
4a00: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
4a10: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
4a20: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
4a30: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
4a40: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
4a50: 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f   A "NOT NULL" co
4a60: 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20  nstraint has.** 
4a70: 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63  been seen on a c
4a80: 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75  olumn.  This rou
4a90: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f  tine sets the no
4aa0: 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a  tNull flag on.**
4ab0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72   the column curr
4ac0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
4ad0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
4ae0: 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e  d sqlite3AddNotN
4af0: 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73  ull(Parse *pPars
4b00: 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b  e, int onError){
4b10: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
4b20: 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d  nt i;.  if( (p =
4b30: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
4b40: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
4b50: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
4b60: 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70  ;.  if( i>=0 ) p
4b70: 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c  ->aCol[i].notNul
4b80: 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a  l = onError;.}..
4b90: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4ba0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
4bb0: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
4bc0: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
4bd0: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
4be0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
4bf0: 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72  ement.  The pFir
4c00: 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20  st token is the 
4c10: 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69  first.** token i
4c20: 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f  n the sequence o
4c30: 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65  f tokens that de
4c40: 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20  scribe the type 
4c50: 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e  of the.** column
4c60: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
4c70: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
4c80: 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61   pLast is the la
4c90: 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74  st token.** in t
4ca0: 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73  he sequence.  Us
4cb0: 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  e this informati
4cc0: 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  on to construct 
4cd0: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74  a string.** that
4ce0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79   contains the ty
4cf0: 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  pename of the co
4d00: 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74  lumn and store t
4d10: 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e  hat string.** in
4d20: 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64   zType..*/ .void
4d30: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
4d40: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
4d50: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 46 69 72  rse, Token *pFir
4d60: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74  st, Token *pLast
4d70: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
4d80: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
4d90: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a   n;.  char *z, *
4da0: 2a 70 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  *pz;.  Column *p
4db0: 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  Col;.  if( (p = 
4dc0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4dd0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
4de0: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
4df0: 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74  .  if( i<0 ) ret
4e00: 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70  urn;.  pCol = &p
4e10: 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 70 7a 20  ->aCol[i];.  pz 
4e20: 3d 20 26 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a  = &pCol->zType;.
4e30: 20 20 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b    n = pLast->n +
4e40: 20 41 64 64 72 28 70 4c 61 73 74 2d 3e 7a 29 20   Addr(pLast->z) 
4e50: 2d 20 41 64 64 72 28 70 46 69 72 73 74 2d 3e 7a  - Addr(pFirst->z
4e60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 74 4e  );.  sqlite3SetN
4e70: 53 74 72 69 6e 67 28 70 7a 2c 20 70 46 69 72 73  String(pz, pFirs
4e80: 74 2d 3e 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 7a  t->z, n, 0);.  z
4e90: 20 3d 20 2a 70 7a 3b 0a 20 20 69 66 28 20 7a 3d   = *pz;.  if( z=
4ea0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
4eb0: 6f 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20  or(i=j=0; z[i]; 
4ec0: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 20  i++){.    int c 
4ed0: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  = z[i];.    if( 
4ee0: 69 73 73 70 61 63 65 28 63 29 20 29 20 63 6f 6e  isspace(c) ) con
4ef0: 74 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b  tinue;.    z[j++
4f00: 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a  ] = c;.  }.  z[j
4f10: 5d 20 3d 20 30 3b 0a 2f 2f 20 20 70 43 6f 6c 2d  ] = 0;.//  pCol-
4f20: 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 73 71 6c  >sortOrder = sql
4f30: 69 74 65 33 43 6f 6c 6c 61 74 65 54 79 70 65 28  ite3CollateType(
4f40: 7a 2c 20 6e 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61  z, n);.  pCol->a
4f50: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
4f60: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a 2c  3AffinityType(z,
4f70: 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   n);.}../*.** Th
4f80: 65 20 67 69 76 65 6e 20 74 6f 6b 65 6e 20 69 73  e given token is
4f90: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
4fa0: 75 65 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20  ue for the last 
4fb0: 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 0a  column added to.
4fc0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  ** the table cur
4fd0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
4fe0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 22  struction.  If "
4ff0: 6d 69 6e 75 73 46 6c 61 67 22 20 69 73 20 74 72  minusFlag" is tr
5000: 75 65 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20  ue, it.** means 
5010: 74 68 65 20 76 61 6c 75 65 20 74 6f 6b 65 6e 20  the value token 
5020: 77 61 73 20 70 72 65 63 65 64 65 64 20 62 79 20  was preceded by 
5030: 61 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a  a minus sign..**
5040: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5050: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
5060: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
5070: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
5080: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
5090: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
50a0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
50b0: 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61  ite3AddDefaultVa
50c0: 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lue(Parse *pPars
50d0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20  e, Token *pVal, 
50e0: 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a  int minusFlag){.
50f0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
5100: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a  t i;.  char **pz
5110: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
5120: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
5130: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
5140: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
5150: 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
5160: 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f  ;.  pz = &p->aCo
5170: 6c 5b 69 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69 66  l[i].zDflt;.  if
5180: 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20  ( minusFlag ){. 
5190: 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74     sqlite3SetNSt
51a0: 72 69 6e 67 28 70 7a 2c 20 22 2d 22 2c 20 31 2c  ring(pz, "-", 1,
51b0: 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e   pVal->z, pVal->
51c0: 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n, 0);.  }else{.
51d0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53      sqlite3SetNS
51e0: 74 72 69 6e 67 28 70 7a 2c 20 70 56 61 6c 2d 3e  tring(pz, pVal->
51f0: 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a  z, pVal->n, 0);.
5200: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 71    }.  sqlite3Deq
5210: 75 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a  uote(*pz);.}../*
5220: 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68  .** Designate th
5230: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f  e PRIMARY KEY fo
5240: 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c  r the table.  pL
5250: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
5260: 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f   names .** of co
5270: 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20  lumns that form 
5280: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
5290: 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55    If pList is NU
52a0: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  LL, then the.** 
52b0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
52c0: 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ded column of th
52d0: 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70  e table is the p
52e0: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a  rimary key..**.*
52f0: 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61  * A table can ha
5300: 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70  ve at most one p
5310: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
5320: 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
5330: 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61  y has.** a prima
5340: 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73  ry key (and this
5350: 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   is the second p
5360: 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e  rimary key) then
5370: 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72   create an.** er
5380: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ror..**.** If th
5390: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
53a0: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   on a single col
53b0: 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79  umn whose dataty
53c0: 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a  pe is INTEGER,.*
53d0: 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74  * then we will t
53e0: 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ry to use that c
53f0: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77  olumn as the row
5400: 20 69 64 2e 20 20 28 45 78 63 65 70 74 69 6f 6e   id.  (Exception
5410: 3a 0a 2a 2a 20 46 6f 72 20 62 61 63 6b 77 61 72  :.** For backwar
5420: 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
5430: 20 77 69 74 68 20 6f 6c 64 65 72 20 64 61 74 61   with older data
5440: 62 61 73 65 73 2c 20 64 6f 20 6e 6f 74 20 64 6f  bases, do not do
5450: 20 74 68 69 73 0a 2a 2a 20 69 66 20 74 68 65 20   this.** if the 
5460: 66 69 6c 65 20 66 6f 72 6d 61 74 20 76 65 72 73  file format vers
5470: 69 6f 6e 20 6e 75 6d 62 65 72 20 69 73 20 6c 65  ion number is le
5480: 73 73 20 74 68 61 6e 20 31 2e 29 20 20 53 65 74  ss than 1.)  Set
5490: 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79   the Table.iPKey
54a0: 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
54b0: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
54c0: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
54d0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
54e0: 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d  .** INTEGER PRIM
54f0: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20  ARY KEY column. 
5500: 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20   Table.iPKey is 
5510: 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65  set to -1 if the
5520: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45  re is.** no INTE
5530: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
5540: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65  .**.** If the ke
5550: 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45  y is not an INTE
5560: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
5570: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75   then create a u
5580: 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66  nique.** index f
5590: 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20  or the key.  No 
55a0: 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
55b0: 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49   for INTEGER PRI
55c0: 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f  MARY KEYs..*/.vo
55d0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69  id sqlite3AddPri
55e0: 6d 61 72 79 4b 65 79 28 50 61 72 73 65 20 2a 70  maryKey(Parse *p
55f0: 50 61 72 73 65 2c 20 49 64 4c 69 73 74 20 2a 70  Parse, IdList *p
5600: 4c 69 73 74 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  List, int onErro
5610: 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  r){.  Table *pTa
5620: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
5630: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
5640: 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Type = 0;.  int 
5650: 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20  iCol = -1, i;.  
5660: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f  if( pTab==0 ) go
5670: 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  to primary_key_e
5680: 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  xit;.  if( pTab-
5690: 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a 20  >hasPrimKey ){. 
56a0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
56b0: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
56c0: 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20    "table \"%s\" 
56d0: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
56e0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20  e primary key", 
56f0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
5700: 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b    goto primary_k
5710: 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70  ey_exit;.  }.  p
5720: 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20  Tab->hasPrimKey 
5730: 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  = 1;.  if( pList
5740: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20  ==0 ){.    iCol 
5750: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31  = pTab->nCol - 1
5760: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c  ;.    pTab->aCol
5770: 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79  [iCol].isPrimKey
5780: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
5790: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
57a0: 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
57b0: 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30        for(iCol=0
57c0: 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ; iCol<pTab->nCo
57d0: 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
57e0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
57f0: 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
5800: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i].zName, pTab->
5810: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
5820: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
5830: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
5840: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
5850: 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e   if( iCol<pTab->
5860: 6e 43 6f 6c 20 29 20 70 54 61 62 2d 3e 61 43 6f  nCol ) pTab->aCo
5870: 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65  l[iCol].isPrimKe
5880: 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 1;.    }.   
5890: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3e   if( pList->nId>
58a0: 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20  1 ) iCol = -1;. 
58b0: 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30   }.  if( iCol>=0
58c0: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
58d0: 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  Col ){.    zType
58e0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
58f0: 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20  ol].zType;.  }. 
5900: 20 69 66 28 20 7a 54 79 70 65 20 26 26 20 73 71   if( zType && sq
5910: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79  lite3StrICmp(zTy
5920: 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d  pe, "INTEGER")==
5930: 30 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69  0 ){.    pTab->i
5940: 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  PKey = iCol;.   
5950: 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d   pTab->keyConf =
5960: 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 7d 65 6c 73   onError;.  }els
5970: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72  e{.    sqlite3Cr
5980: 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  eateIndex(pParse
5990: 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f  , 0, 0, pList, o
59a0: 6e 45 72 72 6f 72 2c 20 30 2c 20 30 29 3b 0a 20  nError, 0, 0);. 
59b0: 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20     pList = 0;.  
59c0: 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  }..primary_key_e
59d0: 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 49 64  xit:.  sqlite3Id
59e0: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
59f0: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
5a00: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
5a10: 6f 69 6e 74 65 72 20 74 6f 20 43 6f 6c 6c 53 65  ointer to CollSe
5a20: 71 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  q given the name
5a30: 20 6f 66 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20   of a collating 
5a40: 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 20 49 66 20  sequence..** If 
5a50: 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
5a60: 71 75 65 6e 63 65 20 64 69 64 20 6e 6f 74 20 70  quence did not p
5a70: 72 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74 2c  reviously exist,
5a80: 20 63 72 65 61 74 65 20 69 74 20 62 75 74 0a 2a   create it but.*
5a90: 2a 20 61 73 73 69 67 6e 20 69 74 20 61 6e 20 4e  * assign it an N
5aa0: 55 4c 4c 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  ULL comparison f
5ab0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 43 6f 6c 6c  unction..*/.Coll
5ac0: 53 65 71 20 2a 73 71 6c 69 74 65 33 43 6f 6c 6c  Seq *sqlite3Coll
5ad0: 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70  ateType(Parse *p
5ae0: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
5af0: 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54  r *zType, int nT
5b00: 79 70 65 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  ype){.  CollSeq 
5b10: 2a 70 43 6f 6c 6c 3b 0a 20 20 73 71 6c 69 74 65  *pColl;.  sqlite
5b20: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
5b30: 62 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71  b;..  pColl = sq
5b40: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
5b50: 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 54 79  b->aCollSeq, zTy
5b60: 70 65 2c 20 6e 54 79 70 65 29 3b 0a 20 20 69 66  pe, nType);.  if
5b70: 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ( pColl==0 ){.  
5b80: 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
5b90: 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 74 69 6f 6e  ollatingFunction
5ba0: 28 64 62 2c 20 7a 54 79 70 65 2c 20 6e 54 79 70  (db, zType, nTyp
5bb0: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 43  e, 0, 0);.    pC
5bc0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73  oll = sqlite3Has
5bd0: 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c  hFind(&db->aColl
5be0: 53 65 71 2c 20 7a 54 79 70 65 2c 20 6e 54 79 70  Seq, zType, nTyp
5bf0: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
5c00: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pColl;.}../*.**
5c10: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
5c20: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74  on function of t
5c30: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
5c40: 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f   parsed table co
5c50: 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43  lumn.** to the C
5c60: 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f  ollSeq given..*/
5c70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
5c80: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
5c90: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
5ca0: 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e   char *zType, in
5cb0: 74 20 6e 54 79 70 65 29 7b 0a 20 20 54 61 62 6c  t nType){.  Tabl
5cc0: 65 20 2a 70 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  e *p;.  CollSeq 
5cd0: 2a 70 43 6f 6c 6c 3b 0a 20 20 73 71 6c 69 74 65  *pColl;.  sqlite
5ce0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
5cf0: 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70  b;..  if( (p = p
5d00: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
5d10: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
5d20: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
5d30: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43  HashFind(&db->aC
5d40: 6f 6c 6c 53 65 71 2c 20 7a 54 79 70 65 2c 20 6e  ollSeq, zType, n
5d50: 54 79 70 65 29 3b 0a 20 20 69 66 28 20 70 43 6f  Type);.  if( pCo
5d60: 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f  ll==0 ){.    pCo
5d70: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43 68 61 6e  ll = sqlite3Chan
5d80: 67 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 74  geCollatingFunct
5d90: 69 6f 6e 28 64 62 2c 20 7a 54 79 70 65 2c 20 6e  ion(db, zType, n
5da0: 54 79 70 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  Type, 0, 0);.  }
5db0: 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a  .  if( pColl ){.
5dc0: 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e      p->aCol[p->n
5dd0: 43 6f 6c 2d 31 5d 2e 70 43 6f 6c 6c 20 3d 20 70  Col-1].pColl = p
5de0: 43 6f 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Coll;.  }.}../*.
5df0: 2a 2a 20 43 72 65 61 74 65 20 6f 72 20 6d 6f 64  ** Create or mod
5e00: 69 66 79 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  ify a collating 
5e10: 73 65 71 75 65 6e 63 65 20 65 6e 74 72 79 20 69  sequence entry i
5e20: 6e 20 74 68 65 20 73 71 6c 69 74 65 2e 61 43 6f  n the sqlite.aCo
5e30: 6c 6c 53 65 71 0a 2a 2a 20 74 61 62 6c 65 2e 0a  llSeq.** table..
5e40: 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 65 6e  **.** Once an en
5e50: 74 72 79 20 69 73 20 61 64 64 65 64 20 74 6f 20  try is added to 
5e60: 74 68 65 20 73 71 6c 69 74 65 2e 61 43 6f 6c 6c  the sqlite.aColl
5e70: 53 65 71 20 74 61 62 6c 65 2c 20 69 74 20 63 61  Seq table, it ca
5e80: 6e 20 6e 65 76 65 72 0a 2a 2a 20 62 65 20 72 65  n never.** be re
5e90: 6d 6f 76 65 64 2c 20 74 68 6f 75 67 68 20 69 73  moved, though is
5ea0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
5eb0: 74 69 6f 6e 20 6f 72 20 75 73 65 72 20 64 61 74  tion or user dat
5ec0: 61 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64  a can be changed
5ed0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
5ee0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
5ef0: 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
5f00: 6f 6e 20 74 68 61 74 20 77 61 73 20 63 72 65 61  on that was crea
5f10: 74 65 64 20 6f 72 20 6d 6f 64 69 66 69 65 64 2e  ted or modified.
5f20: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
5f30: 69 74 65 33 43 68 61 6e 67 65 43 6f 6c 6c 61 74  ite3ChangeCollat
5f40: 69 6e 67 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73  ingFunction(.  s
5f50: 71 6c 69 74 65 20 2a 64 62 2c 20 20 20 20 20 20  qlite *db,      
5f60: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
5f70: 73 65 20 69 6e 74 6f 20 77 68 69 63 68 20 74 6f  se into which to
5f80: 20 69 6e 73 65 72 74 20 74 68 65 20 63 6f 6c 6c   insert the coll
5f90: 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ation */.  const
5fa0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
5fb0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
5fc0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 2a 2f 0a 20  e collation */. 
5fd0: 20 69 6e 74 20 6e 4e 61 6d 65 2c 20 20 20 20 20   int nName,     
5fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5ff0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
6000: 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 76   in zName */.  v
6010: 6f 69 64 20 2a 70 55 73 65 72 2c 20 20 20 20 20  oid *pUser,     
6020: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
6030: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6d 70  argument to xCmp
6040: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70   */.  int (*xCmp
6050: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
6060: 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
6070: 74 20 76 6f 69 64 2a 29 20 2f 2a 20 43 6f 6d 70  t void*) /* Comp
6080: 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
6090: 2a 2f 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  */.){.  CollSeq 
60a0: 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c  *pColl;..  pColl
60b0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
60c0: 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  nd(&db->aCollSeq
60d0: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  , zName, nName);
60e0: 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20  .  if( pColl==0 
60f0: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  ){.    pColl = s
6100: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
6110: 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 29 20 2b  sizeof(*pColl) +
6120: 20 6e 4e 61 6d 65 20 2b 20 31 20 29 3b 0a 20 20   nName + 1 );.  
6130: 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29    if( pColl==0 )
6140: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
6150: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c  ;.    }.    pCol
6160: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  l->zName = (char
6170: 2a 29 26 70 43 6f 6c 6c 5b 31 5d 3b 0a 20 20 20  *)&pColl[1];.   
6180: 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 2d 3e 7a   memcpy(pColl->z
6190: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Name, zName, nNa
61a0: 6d 65 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  me+1);.    sqlit
61b0: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  e3HashInsert(&db
61c0: 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 70 43 6f 6c  ->aCollSeq, pCol
61d0: 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  l->zName, nName,
61e0: 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 70   pColl);.  }.  p
61f0: 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 55  Coll->pUser = pU
6200: 73 65 72 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43  ser;.  pColl->xC
6210: 6d 70 20 3d 20 78 43 6d 70 3b 0a 20 20 72 65 74  mp = xCmp;.  ret
6220: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a  urn pColl;.}../*
6230: 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c  .** Scan the col
6240: 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54  umn type name zT
6250: 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70  ype (length nTyp
6260: 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  e) and return th
6270: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
6280: 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a  affinity type..*
6290: 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66  /.char sqlite3Af
62a0: 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74  finityType(const
62b0: 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e   char *zType, in
62c0: 74 20 6e 54 79 70 65 29 7b 0a 20 20 69 6e 74 20  t nType){.  int 
62d0: 6e 2c 20 69 3b 0a 20 20 73 74 72 75 63 74 20 7b  n, i;.  struct {
62e0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
62f0: 2a 7a 53 75 62 3b 20 20 2f 2a 20 4b 65 79 77 6f  *zSub;  /* Keywo
6300: 72 64 73 20 73 75 62 73 74 72 69 6e 67 20 74 6f  rds substring to
6310: 20 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a 20   search for */. 
6320: 20 20 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20     int nSub;    
6330: 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20        /* length 
6340: 6f 66 20 7a 53 75 62 20 2a 2f 0a 20 20 20 20 63  of zSub */.    c
6350: 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20  har affinity;   
6360: 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 74 6f    /* Affinity to
6370: 20 72 65 74 75 72 6e 20 69 66 20 69 74 20 6d 61   return if it ma
6380: 74 63 68 65 73 20 2a 2f 0a 20 20 7d 20 73 75 62  tches */.  } sub
6390: 73 74 72 69 6e 67 73 5b 5d 20 3d 20 7b 0a 20 20  strings[] = {.  
63a0: 20 20 7b 22 49 4e 54 22 2c 20 20 33 2c 20 53 51    {"INT",  3, SQ
63b0: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
63c0: 7d 2c 0a 20 20 20 20 7b 22 43 48 41 52 22 2c 20  },.    {"CHAR", 
63d0: 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  4, SQLITE_AFF_TE
63e0: 58 54 7d 2c 0a 20 20 20 20 7b 22 43 4c 4f 42 22  XT},.    {"CLOB"
63f0: 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  , 4, SQLITE_AFF_
6400: 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22 54 45 58  TEXT},.    {"TEX
6410: 54 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46  T", 4, SQLITE_AF
6420: 46 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22 42  F_TEXT},.    {"B
6430: 4c 4f 42 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f  LOB", 4, SQLITE_
6440: 41 46 46 5f 4e 4f 4e 45 7d 2c 0a 20 20 7d 3b 0a  AFF_NONE},.  };.
6450: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
6460: 7a 65 6f 66 28 73 75 62 73 74 72 69 6e 67 73 29  zeof(substrings)
6470: 2f 73 69 7a 65 6f 66 28 73 75 62 73 74 72 69 6e  /sizeof(substrin
6480: 67 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  gs[0]); i++){.  
6490: 20 20 69 6e 74 20 63 31 20 3d 20 73 75 62 73 74    int c1 = subst
64a0: 72 69 6e 67 73 5b 69 5d 2e 7a 53 75 62 5b 30 5d  rings[i].zSub[0]
64b0: 3b 0a 20 20 20 20 69 6e 74 20 63 32 20 3d 20 74  ;.    int c2 = t
64c0: 6f 6c 6f 77 65 72 28 63 31 29 3b 0a 20 20 20 20  olower(c1);.    
64d0: 69 6e 74 20 6c 69 6d 69 74 20 3d 20 6e 54 79 70  int limit = nTyp
64e0: 65 20 2d 20 73 75 62 73 74 72 69 6e 67 73 5b 69  e - substrings[i
64f0: 5d 2e 6e 53 75 62 3b 0a 20 20 20 20 63 6f 6e 73  ].nSub;.    cons
6500: 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 75 62 73  t char *z = subs
6510: 74 72 69 6e 67 73 5b 69 5d 2e 7a 53 75 62 3b 0a  trings[i].zSub;.
6520: 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 3d      for(n=0; n<=
6530: 6c 69 6d 69 74 3b 20 6e 2b 2b 29 7b 0a 20 20 20  limit; n++){.   
6540: 20 20 20 69 6e 74 20 63 20 3d 20 7a 54 79 70 65     int c = zType
6550: 5b 6e 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28  [n];.      if( (
6560: 63 3d 3d 63 31 20 7c 7c 20 63 3d 3d 63 32 29 0a  c==c1 || c==c2).
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
6580: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43  0==sqlite3StrNIC
6590: 6d 70 28 26 7a 54 79 70 65 5b 6e 5d 2c 20 7a 2c  mp(&zType[n], z,
65a0: 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 6e   substrings[i].n
65b0: 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Sub) ){.        
65c0: 72 65 74 75 72 6e 20 73 75 62 73 74 72 69 6e 67  return substring
65d0: 73 5b 69 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  s[i].affinity;. 
65e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
65f0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6600: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 7d 0a  _AFF_NUMERIC;.}.
6610: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 65 20 75 70 20 77  ./*.** Come up w
6620: 69 74 68 20 61 20 6e 65 77 20 72 61 6e 64 6f 6d  ith a new random
6630: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
6640: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 20 20 4d  chema cookie.  M
6650: 61 6b 65 20 73 75 72 65 0a 2a 2a 20 74 68 65 20  ake sure.** the 
6660: 6e 65 77 20 76 61 6c 75 65 20 69 73 20 64 69 66  new value is dif
6670: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
6680: 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  old..**.** The s
6690: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20  chema cookie is 
66a0: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
66b0: 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d  e when the schem
66c0: 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74  a for the.** dat
66d0: 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20  abase changes.  
66e0: 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d  After each schem
66f0: 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f  a change, the co
6700: 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68  okie value.** ch
6710: 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70  anges.  When a p
6720: 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61  rocess first rea
6730: 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74  ds the schema it
6740: 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20   records the.** 
6750: 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66  cookie.  Thereaf
6760: 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74  ter, whenever it
6770: 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20   goes to access 
6780: 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a  the database,.**
6790: 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63   it checks the c
67a0: 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75  ookie to make su
67b0: 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61  re the schema ha
67c0: 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a  s not changed.**
67d0: 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61   since it was la
67e0: 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54  st read..**.** T
67f0: 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20  his plan is not 
6800: 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65  completely bulle
6810: 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20  t-proof.  It is 
6820: 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20  possible for.** 
6830: 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68  the schema to ch
6840: 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69  ange multiple ti
6850: 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20  mes and for the 
6860: 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20  cookie to be.** 
6870: 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f  set back to prio
6880: 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63  r value.  But sc
6890: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65  hema changes are
68a0: 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61   infrequent.** a
68b0: 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  nd the probabili
68c0: 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68  ty of hitting th
68d0: 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61  e same cookie va
68e0: 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31  lue is only.** 1
68f0: 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e   chance in 2^32.
6900: 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20    So we're safe 
6910: 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20  enough..*/.void 
6920: 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
6930: 6b 69 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20  kie(sqlite *db, 
6940: 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20  Vdbe *v){.  if( 
6950: 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 3d  db->next_cookie=
6960: 3d 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 63 68 65  =db->aDb[0].sche
6970: 6d 61 5f 63 6f 6f 6b 69 65 20 29 7b 0a 20 20 20  ma_cookie ){.   
6980: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 72   unsigned char r
6990: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e  ;.    sqlite3Ran
69a0: 64 6f 6d 6e 65 73 73 28 31 2c 20 26 72 29 3b 0a  domness(1, &r);.
69b0: 20 20 20 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f      db->next_coo
69c0: 6b 69 65 20 3d 20 64 62 2d 3e 61 44 62 5b 30 5d  kie = db->aDb[0]
69d0: 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 2b  .schema_cookie +
69e0: 20 72 20 2b 20 31 3b 0a 20 20 20 20 64 62 2d 3e   r + 1;.    db->
69f0: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
6a00: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
6a10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6a20: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
6a30: 72 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b  r, db->next_cook
6a40: 69 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  ie, 0);.    sqli
6a50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6a60: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c  OP_SetCookie, 0,
6a70: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
6a80: 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75  * Measure the nu
6a90: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
6aa0: 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74  rs needed to out
6ab0: 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  put the given.**
6ac0: 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68   identifier.  Th
6ad0: 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
6ae0: 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71  d includes any q
6af0: 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75  uotes used.** bu
6b00: 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75  t does not inclu
6b10: 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d  de the null term
6b20: 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  inator..*/.stati
6b30: 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74  c int identLengt
6b40: 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  h(const char *z)
6b50: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  {.  int n;.  int
6b60: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 30 3b 0a   needQuote = 0;.
6b70: 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e    for(n=0; *z; n
6b80: 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, z++){.    if
6b90: 28 20 2a 7a 3d 3d 27 5c 27 27 20 29 7b 20 6e 2b  ( *z=='\'' ){ n+
6ba0: 2b 3b 20 6e 65 65 64 51 75 6f 74 65 3d 31 3b 20  +; needQuote=1; 
6bb0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
6bc0: 20 2b 20 6e 65 65 64 51 75 6f 74 65 2a 32 3b 0a   + needQuote*2;.
6bd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
6be0: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74  n identifier ont
6bf0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
6c00: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20   given string.  
6c10: 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61  Add.** quote cha
6c20: 72 61 63 74 65 72 73 20 61 73 20 6e 65 65 64 65  racters as neede
6c30: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
6c40: 64 20 69 64 65 6e 74 50 75 74 28 63 68 61 72 20  d identPut(char 
6c50: 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63  *z, int *pIdx, c
6c60: 68 61 72 20 2a 7a 49 64 65 6e 74 29 7b 0a 20 20  har *zIdent){.  
6c70: 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75  int i, j, needQu
6c80: 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78  ote;.  i = *pIdx
6c90: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
6ca0: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
6cb0: 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a    if( !isalnum(z
6cc0: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
6cd0: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
6ce0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
6cf0: 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a  uote =  zIdent[j
6d00: 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28  ]!=0 || isdigit(
6d10: 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20  zIdent[0]).     
6d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
6d30: 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f  sqlite3KeywordCo
6d40: 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54  de(zIdent, j)!=T
6d50: 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64  K_ID;.  if( need
6d60: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
6d70: 20 27 5c 27 27 3b 0a 20 20 66 6f 72 28 6a 3d 30   '\'';.  for(j=0
6d80: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
6d90: 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20  ){.    z[i++] = 
6da0: 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69  zIdent[j];.    i
6db0: 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 5c  f( zIdent[j]=='\
6dc0: 27 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c  '' ) z[i++] = '\
6dd0: 27 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65  '';.  }.  if( ne
6de0: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
6df0: 20 3d 20 27 5c 27 27 3b 0a 20 20 7a 5b 69 5d 20   = '\'';.  z[i] 
6e00: 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69  = 0;.  *pIdx = i
6e10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
6e20: 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42  ate a CREATE TAB
6e30: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70  LE statement app
6e40: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
6e50: 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e   given.** table.
6e60: 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64    Memory to hold
6e70: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
6e80: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62   statement is ob
6e90: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73  tained.** from s
6ea0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
6eb0: 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
6ec0: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
6ed0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
6ee0: 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54  ic char *createT
6ef0: 61 62 6c 65 53 74 6d 74 28 54 61 62 6c 65 20 2a  ableStmt(Table *
6f00: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20  p){.  int i, k, 
6f10: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  n;.  char *zStmt
6f20: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20  ;.  char *zSep, 
6f30: 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20  *zSep2, *zEnd;. 
6f40: 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d   n = 0;.  for(i=
6f50: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
6f60: 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65  +){.    n += ide
6f70: 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 61 43 6f 6c  ntLength(p->aCol
6f80: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
6f90: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
6fa0: 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  th(p->zName);.  
6fb0: 69 66 28 20 6e 3c 34 30 20 29 7b 0a 20 20 20 20  if( n<40 ){.    
6fc0: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a  zSep = "";.    z
6fd0: 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20  Sep2 = ",";.    
6fe0: 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65  zEnd = ")";.  }e
6ff0: 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20  lse{.    zSep = 
7000: 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70  "\n  ";.    zSep
7010: 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20  2 = ",\n  ";.   
7020: 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20   zEnd = "\n)";. 
7030: 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36   }.  n += 35 + 6
7040: 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d  *p->nCol;.  zStm
7050: 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
7060: 52 61 77 28 20 6e 20 29 3b 0a 20 20 69 66 28 20  Raw( n );.  if( 
7070: 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72  zStmt==0 ) retur
7080: 6e 20 30 3b 0a 20 20 73 74 72 63 70 79 28 7a 53  n 0;.  strcpy(zS
7090: 74 6d 74 2c 20 70 2d 3e 69 44 62 3d 3d 31 20 3f  tmt, p->iDb==1 ?
70a0: 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41   "CREATE TEMP TA
70b0: 42 4c 45 20 22 20 3a 20 22 43 52 45 41 54 45 20  BLE " : "CREATE 
70c0: 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20  TABLE ");.  k = 
70d0: 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20  strlen(zStmt);. 
70e0: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
70f0: 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a   &k, p->zName);.
7100: 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27    zStmt[k++] = '
7110: 28 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  (';.  for(i=0; i
7120: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  <p->nCol; i++){.
7130: 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d      strcpy(&zStm
7140: 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20  t[k], zSep);.   
7150: 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53   k += strlen(&zS
7160: 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65  tmt[k]);.    zSe
7170: 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69  p = zSep2;.    i
7180: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
7190: 6b 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  k, p->aCol[i].zN
71a0: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 74 72 63  ame);.  }.  strc
71b0: 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45  py(&zStmt[k], zE
71c0: 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  nd);.  return zS
71d0: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  tmt;.}../*.** Th
71e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
71f0: 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  lled to report t
7200: 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61  he final ")" tha
7210: 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20  t terminates.** 
7220: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
7230: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
7240: 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74  The table struct
7250: 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61  ure that other a
7260: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68  ction routines h
7270: 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e  ave been buildin
7280: 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  g.** is added to
7290: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61   the internal ha
72a0: 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d  sh tables, assum
72b0: 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61  ing no errors ha
72c0: 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a  ve.** occurred..
72d0: 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66  **.** An entry f
72e0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  or the table is 
72f0: 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74  made in the mast
7300: 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b  er table on disk
7310: 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73  , unless.** this
7320: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
7330: 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69  table or db->ini
7340: 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e  t.busy==1.  When
7350: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
7360: 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65  1.** it means we
7370: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
7380: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
7390: 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20  able because we 
73a0: 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65  just.** connecte
73b0: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
73c0: 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  e or because the
73d0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
73e0: 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65  able has.** rece
73f0: 6e 74 6c 79 20 63 68 61 6e 67 65 73 2c 20 73 6f  ntly changes, so
7400: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
7410: 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64  his table alread
7420: 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74  y exists in.** t
7430: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
7440: 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e   table.  We do n
7450: 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74  ot want to creat
7460: 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  e it again..**.*
7470: 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74  * If the pSelect
7480: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
7490: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
74a0: 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
74b0: 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20  e.** was called 
74c0: 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c  to create a tabl
74d0: 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  e generated from
74e0: 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54   a .** "CREATE T
74f0: 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45  ABLE ... AS SELE
7500: 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e  CT ..." statemen
7510: 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e  t.  The column n
7520: 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ames of.** the n
7530: 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61  ew table will ma
7540: 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73  tch the result s
7550: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
7560: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7570: 33 45 6e 64 54 61 62 6c 65 28 50 61 72 73 65 20  3EndTable(Parse 
7580: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
7590: 70 45 6e 64 2c 20 53 65 6c 65 63 74 20 2a 70 53  pEnd, Select *pS
75a0: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
75b0: 2a 70 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  *p;.  sqlite *db
75c0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
75d0: 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26    if( (pEnd==0 &
75e0: 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c  & pSelect==0) ||
75f0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
7600: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
7610: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
7620: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
7630: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
7640: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  p==0 ) return;..
7650: 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c    /* If the tabl
7660: 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66  e is generated f
7670: 72 6f 6d 20 61 20 53 45 4c 45 43 54 2c 20 74 68  rom a SELECT, th
7680: 65 6e 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65  en construct the
7690: 0a 20 20 2a 2a 20 6c 69 73 74 20 6f 66 20 63 6f  .  ** list of co
76a0: 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 74 65  lumns and the te
76b0: 78 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  xt of the table.
76c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c  .  */.  if( pSel
76d0: 65 63 74 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  ect ){.    Table
76e0: 20 2a 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69   *pSelTab = sqli
76f0: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
7700: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20  lect(pParse, 0, 
7710: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66  pSelect);.    if
7720: 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72  ( pSelTab==0 ) r
7730: 65 74 75 72 6e 3b 0a 20 20 20 20 61 73 73 65 72  eturn;.    asser
7740: 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  t( p->aCol==0 );
7750: 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70  .    p->nCol = p
7760: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
7770: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c    p->aCol = pSel
7780: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70  Tab->aCol;.    p
7790: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30  SelTab->nCol = 0
77a0: 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61  ;.    pSelTab->a
77b0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  Col = 0;.    sql
77c0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
77d0: 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 7d  0, pSelTab);.  }
77e0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
77f0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31  ->init.busy is 1
7800: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
7810: 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
7820: 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
7830: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72  qlite_master" or
7840: 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61   "sqlite_temp_ma
7850: 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74  ster" table on t
7860: 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f  he disk..  ** So
7870: 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f   do not write to
7880: 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e   the disk again.
7890: 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f    Extract the ro
78a0: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  ot page number. 
78b0: 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c   ** for the tabl
78c0: 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69  e from the db->i
78d0: 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c  nit.newTnum fiel
78e0: 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75  d.  (The page nu
78f0: 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  mber.  ** should
7900: 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74   have been put t
7910: 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69  here by the sqli
7920: 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65  teOpenCb routine
7930: 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  .).  */.  if( db
7940: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
7950: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d     p->tnum = db-
7960: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
7970: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20   }..  /* If not 
7980: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68  initializing, th
7990: 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f  en create a reco
79a0: 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  rd for the new t
79b0: 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  able.  ** in the
79c0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
79d0: 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61  able of the data
79e0: 62 61 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72  base.  The recor
79f0: 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f  d number.  ** fo
7a00: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  r the new table 
7a10: 65 6e 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72  entry should alr
7a20: 65 61 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73  eady be on the s
7a30: 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tack..  **.  ** 
7a40: 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  If this is a TEM
7a50: 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72  PORARY table, wr
7a60: 69 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e  ite the entry in
7a70: 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  to the auxiliary
7a80: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65  .  ** file inste
7a90: 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d  ad of into the m
7aa0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
7ab0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  e..  */.  if( !d
7ac0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
7ad0: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56      int n;.    V
7ae0: 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20 76 20 3d  dbe *v;..    v =
7af0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
7b00: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
7b10: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
7b20: 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65      if( p->pSele
7b30: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ct==0 ){.      /
7b40: 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c  * A regular tabl
7b50: 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
7b60: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
7b70: 43 72 65 61 74 65 54 61 62 6c 65 2c 20 30 2c 20  CreateTable, 0, 
7b80: 70 2d 3e 69 44 62 2c 20 28 63 68 61 72 2a 29 26  p->iDb, (char*)&
7b90: 70 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e  p->tnum, P3_POIN
7ba0: 54 45 52 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  TER);.    }else{
7bb0: 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77  .      /* A view
7bc0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
7bd0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
7be0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
7bf0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e  .    }.    p->tn
7c00: 75 6d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  um = 0;.    sqli
7c10: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
7c20: 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a  OP_Pull, 1, 0);.
7c30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
7c40: 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  p3(v, OP_String,
7c50: 20 30 2c 20 30 2c 20 70 2d 3e 70 53 65 6c 65 63   0, 0, p->pSelec
7c60: 74 3d 3d 30 3f 22 74 61 62 6c 65 22 3a 22 76 69  t==0?"table":"vi
7c70: 65 77 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ew", P3_STATIC);
7c80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7c90: 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op3(v, OP_String
7ca0: 2c 20 30 2c 20 30 2c 20 70 2d 3e 7a 4e 61 6d 65  , 0, 0, p->zName
7cb0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
7cc0: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53  3VdbeOp3(v, OP_S
7cd0: 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20 70 2d 3e  tring, 0, 0, p->
7ce0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
7cf0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
7d00: 76 2c 20 4f 50 5f 44 75 70 2c 20 34 2c 20 30 29  v, OP_Dup, 4, 0)
7d10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7d20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
7d30: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
7d40: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
7d50: 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 63       char *z = c
7d60: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 70  reateTableStmt(p
7d70: 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 7a 20 3f  );.      n = z ?
7d80: 20 73 74 72 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a   strlen(z) : 0;.
7d90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7da0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
7db0: 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71   z, n);.      sq
7dc0: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
7dd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
7de0: 73 65 72 74 28 20 70 45 6e 64 21 3d 30 20 29 3b  sert( pEnd!=0 );
7df0: 0a 20 20 20 20 20 20 6e 20 3d 20 41 64 64 72 28  .      n = Addr(
7e00: 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28  pEnd->z) - Addr(
7e10: 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54 6f  pParse->sFirstTo
7e20: 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20 20 20  ken.z) + 1;.    
7e30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
7e40: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 50 61  ngeP3(v, -1, pPa
7e50: 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e  rse->sFirstToken
7e60: 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  .z, n);.    }.  
7e70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
7e80: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
7e90: 64 2c 20 35 2c 20 30 2c 20 22 74 74 74 69 74 22  d, 5, 0, "tttit"
7ea0: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
7eb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7ec0: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b  Op(v, OP_PutIntK
7ed0: 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  ey, 0, 0);.    i
7ee0: 66 28 20 21 70 2d 3e 69 44 62 20 29 7b 0a 20 20  f( !p->iDb ){.  
7ef0: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
7f00: 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a  eCookie(db, v);.
7f10: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7f20: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
7f30: 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20  _Close, 0, 0);. 
7f40: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
7f50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7f60: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
7f70: 6e 74 65 67 65 72 2c 20 70 2d 3e 69 44 62 2c 20  nteger, p->iDb, 
7f80: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
7f90: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
7fa0: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 30  _OpenWrite, 1, 0
7fb0: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
7fc0: 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20  >nTab = 2;.     
7fd0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
7fe0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
7ff0: 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30 2c  SRT_Table, 1, 0,
8000: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 0, 0);.    }
8010: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 57  .    sqlite3EndW
8020: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
8030: 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arse);.  }..  /*
8040: 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74   Add the table t
8050: 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o the in-memory 
8060: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
8070: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
8080: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
8090: 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 26 26  e->explain==0 &&
80a0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
80b0: 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
80c0: 4f 6c 64 3b 0a 20 20 20 20 46 4b 65 79 20 2a 70  Old;.    FKey *p
80d0: 46 4b 65 79 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  FKey;.    pOld =
80e0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
80f0: 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69  rt(&db->aDb[p->i
8100: 44 62 5d 2e 74 62 6c 48 61 73 68 2c 20 0a 20 20  Db].tblHash, .  
8110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8120: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 4e 61            p->zNa
8130: 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e  me, strlen(p->zN
8140: 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20  ame)+1, p);.    
8150: 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20  if( pOld ){.    
8160: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c    assert( p==pOl
8170: 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  d );  /* Malloc 
8180: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
8190: 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65   inside HashInse
81a0: 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 72 65  rt() */.      re
81b0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
81c0: 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70 46 4b  for(pFKey=p->pFK
81d0: 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79  ey; pFKey; pFKey
81e0: 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f  =pFKey->pNextFro
81f0: 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54  m){.      int nT
8200: 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b 65 79  o = strlen(pFKey
8210: 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20  ->zTo) + 1;.    
8220: 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f    pFKey->pNextTo
8230: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
8240: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69  nd(&db->aDb[p->i
8250: 44 62 5d 2e 61 46 4b 65 79 2c 20 70 46 4b 65 79  Db].aFKey, pFKey
8260: 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20  ->zTo, nTo);.   
8270: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
8280: 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d  sert(&db->aDb[p-
8290: 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 20 70 46 4b  >iDb].aFKey, pFK
82a0: 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46  ey->zTo, nTo, pF
82b0: 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Key);.    }.    
82c0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
82d0: 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e  e = 0;.    db->n
82e0: 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d  Table++;.    db-
82f0: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
8300: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
8310: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
8320: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
8330: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72  is routine in or
8340: 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20  der to create a 
8350: 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64  new VIEW.*/.void
8360: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69   sqlite3CreateVi
8370: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
8380: 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rse,     /* The 
8390: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
83a0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67  */.  Token *pBeg
83b0: 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43  in,     /* The C
83c0: 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74  REATE token that
83d0: 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74   begins the stat
83e0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ement */.  Token
83f0: 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 2f 2a   *pName,      /*
8400: 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
8410: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
8420: 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
8430: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
8440: 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73     /* A SELECT s
8450: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69  tatement that wi
8460: 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
8470: 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  w view */.  int 
8480: 69 73 54 65 6d 70 20 20 20 20 20 20 20 20 20 2f  isTemp         /
8490: 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d  * TRUE for a TEM
84a0: 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 29  PORARY view */.)
84b0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
84c0: 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63  int n;.  const c
84d0: 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20  har *z;.  Token 
84e0: 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20  sEnd;.  DbFixer 
84f0: 73 46 69 78 3b 0a 0a 20 20 73 71 6c 69 74 65 33  sFix;..  sqlite3
8500: 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73  StartTable(pPars
8510: 65 2c 20 70 42 65 67 69 6e 2c 20 70 4e 61 6d 65  e, pBegin, pName
8520: 2c 20 69 73 54 65 6d 70 2c 20 31 29 3b 0a 20 20  , isTemp, 1);.  
8530: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
8540: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
8550: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
8560: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
8570: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
8580: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
8590: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  n;.  }.  if( sql
85a0: 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
85b0: 78 2c 20 70 50 61 72 73 65 2c 20 70 2d 3e 69 44  x, pParse, p->iD
85c0: 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65  b, "view", pName
85d0: 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  ).    && sqlite3
85e0: 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c  FixSelect(&sFix,
85f0: 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20   pSelect).  ){. 
8600: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
8610: 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b  Delete(pSelect);
8620: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8630: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f  ..  /* Make a co
8640: 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  py of the entire
8650: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
8660: 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
8670: 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68  he view..  ** Th
8680: 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c  is will force al
8690: 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e  l the Expr.token
86a0: 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  .z values to be 
86b0: 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a  dynamically.  **
86c0: 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65   allocated rathe
86d0: 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20  r than point to 
86e0: 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67  the input string
86f0: 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74   - which means t
8700: 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69  hat.  ** they wi
8710: 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65 72  ll persist after
8720: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c   the current sql
8730: 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c  ite3_exec() call
8740: 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20   returns..  */. 
8750: 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71   p->pSelect = sq
8760: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
8770: 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74  Select);.  sqlit
8780: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
8790: 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 21  Select);.  if( !
87a0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74  pParse->db->init
87b0: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c  .busy ){.    sql
87c0: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
87d0: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
87e0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  );.  }..  /* Loc
87f0: 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
8800: 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73  he CREATE VIEW s
8810: 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20  tatement.  Make 
8820: 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20  sEnd point to.  
8830: 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f  ** the end..  */
8840: 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65  .  sEnd = pParse
8850: 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20  ->sLastToken;.  
8860: 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30  if( sEnd.z[0]!=0
8870: 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27   && sEnd.z[0]!='
8880: 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a  ;' ){.    sEnd.z
8890: 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a   += sEnd.n;.  }.
88a0: 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20    sEnd.n = 0;.  
88b0: 6e 20 3d 20 28 28 69 6e 74 29 73 45 6e 64 2e 7a  n = ((int)sEnd.z
88c0: 29 20 2d 20 28 69 6e 74 29 70 42 65 67 69 6e 2d  ) - (int)pBegin-
88d0: 3e 7a 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e  >z;.  z = pBegin
88e0: 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e  ->z;.  while( n>
88f0: 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b  0 && (z[n-1]==';
8900: 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e  ' || isspace(z[n
8910: 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  -1])) ){ n--; }.
8920: 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d    sEnd.z = &z[n-
8930: 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31  1];.  sEnd.n = 1
8940: 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69  ;..  /* Use sqli
8950: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f  te3EndTable() to
8960: 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f   add the view to
8970: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
8980: 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ER table */.  sq
8990: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50  lite3EndTable(pP
89a0: 61 72 73 65 2c 20 26 73 45 6e 64 2c 20 30 29 3b  arse, &sEnd, 0);
89b0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
89c0: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74  .** The Table st
89d0: 72 75 63 74 75 72 65 20 70 54 61 62 6c 65 20 69  ructure pTable i
89e0: 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e  s really a VIEW.
89f0: 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61    Fill in the na
8a00: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f  mes of.** the co
8a10: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65  lumns of the vie
8a20: 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20  w in the pTable 
8a30: 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75  structure.  Retu
8a40: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  rn the number.**
8a50: 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
8a60: 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e  an error is seen
8a70: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
8a80: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
8a90: 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69  e->zErrMsg..*/.i
8aa0: 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  nt sqlite3ViewGe
8ab0: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72  tColumnNames(Par
8ac0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
8ad0: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 45 78  e *pTable){.  Ex
8ae0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
8af0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a    Select *pSel;.
8b00: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
8b10: 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  ;.  int nErr = 0
8b20: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
8b30: 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70  ble );..  /* A p
8b40: 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61  ositive nCol mea
8b50: 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e  ns the columns n
8b60: 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69  ames for this vi
8b70: 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65  ew are.  ** alre
8b80: 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a  ady known..  */.
8b90: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
8ba0: 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ol>0 ) return 0;
8bb0: 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76  ..  /* A negativ
8bc0: 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63  e nCol is a spec
8bd0: 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69  ial marker meani
8be0: 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63  ng that we are c
8bf0: 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72  urrently.  ** tr
8c00: 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20  ying to compute 
8c10: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
8c20: 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74  .  If we enter t
8c30: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
8c40: 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65  .  ** a negative
8c50: 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20   nCol, it means 
8c60: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77  two or more view
8c70: 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c  s form a loop, l
8c80: 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ike this:.  **. 
8c90: 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
8ca0: 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43  IEW one AS SELEC
8cb0: 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20  T * FROM two;.  
8cc0: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
8cd0: 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54  EW two AS SELECT
8ce0: 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a   * FROM one;.  *
8cf0: 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  *.  ** Actually,
8d00: 20 74 68 69 73 20 65 72 72 6f 72 20 69 73 20 63   this error is c
8d10: 61 75 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79  aught previously
8d20: 20 61 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c   and so the foll
8d30: 6f 77 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20  owing test.  ** 
8d40: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61  should always fa
8d50: 69 6c 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c  il.  But we will
8d60: 20 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61   leave it in pla
8d70: 63 65 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61  ce just to be sa
8d80: 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  fe..  */.  if( p
8d90: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b  Table->nCol<0 ){
8da0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
8db0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
8dc0: 65 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61  ew %s is circula
8dd0: 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54  rly defined", pT
8de0: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
8df0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
8e00: 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20  .  /* If we get 
8e10: 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
8e20: 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f  ns we need to co
8e30: 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20  mpute the table 
8e40: 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73  names..  */.  as
8e50: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53  sert( pTable->pS
8e60: 65 6c 65 63 74 20 29 3b 20 2f 2a 20 49 66 20 6e  elect ); /* If n
8e70: 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 70 54 61  Col==0, then pTa
8e80: 62 6c 65 20 6d 75 73 74 20 62 65 20 61 20 56 49  ble must be a VI
8e90: 45 57 20 2a 2f 0a 20 20 70 53 65 6c 20 3d 20 70  EW */.  pSel = p
8ea0: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3b 0a  Table->pSelect;.
8eb0: 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  /* Note that 
8ec0: 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
8ed0: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
8ee0: 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61  lect() will expa
8ef0: 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20  nd any.  ** "*" 
8f00: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 69 73  elements in this
8f10: 20 6c 69 73 74 2e 20 20 42 75 74 20 77 65 20 77   list.  But we w
8f20: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 72 65 73 74  ill need to rest
8f30: 6f 72 65 20 74 68 65 20 6c 69 73 74 0a 20 20 2a  ore the list.  *
8f40: 2a 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  * back to its or
8f50: 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61  iginal configura
8f60: 74 69 6f 6e 20 61 66 74 65 72 77 61 72 64 73 2c  tion afterwards,
8f70: 20 73 6f 20 77 65 20 73 61 76 65 20 61 20 63 6f   so we save a co
8f80: 70 79 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 6f  py of.  ** the o
8f90: 72 69 67 69 6e 61 6c 20 69 6e 20 70 45 4c 69 73  riginal in pELis
8fa0: 74 2e 0a 20 20 2a 2f 0a 20 20 70 45 4c 69 73 74  t..  */.  pEList
8fb0: 20 3d 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3b   = pSel->pEList;
8fc0: 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20  .  pSel->pEList 
8fd0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
8fe0: 74 44 75 70 28 70 45 4c 69 73 74 29 3b 0a 20 20  tDup(pEList);.  
8ff0: 69 66 28 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  if( pSel->pEList
9000: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 53 65 6c 2d  ==0 ){.    pSel-
9010: 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74  >pEList = pEList
9020: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20  ;.    return 1; 
9030: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65   /* Malloc faile
9040: 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 61 62 6c  d */.  }.  pTabl
9050: 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20  e->nCol = -1;.  
9060: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
9070: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
9080: 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53  ct(pParse, 0, pS
9090: 65 6c 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 54  el);.  if( pSelT
90a0: 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
90b0: 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d  ( pTable->aCol==
90c0: 30 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  0 );.    pTable-
90d0: 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
90e0: 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 6c  >nCol;.    pTabl
90f0: 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->aCol = pSelTa
9100: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65  b->aCol;.    pSe
9110: 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  lTab->nCol = 0;.
9120: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
9130: 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  l = 0;.    sqlit
9140: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  e3DeleteTable(0,
9150: 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 44   pSelTab);.    D
9160: 62 53 65 74 50 72 6f 70 65 72 74 79 28 70 50 61  bSetProperty(pPa
9170: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 6c 65 2d  rse->db, pTable-
9180: 3e 69 44 62 2c 20 44 42 5f 55 6e 72 65 73 65 74  >iDb, DB_Unreset
9190: 56 69 65 77 73 29 3b 0a 20 20 7d 65 6c 73 65 7b  Views);.  }else{
91a0: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  .    pTable->nCo
91b0: 6c 20 3d 20 30 3b 0a 20 20 20 20 6e 45 72 72 2b  l = 0;.    nErr+
91c0: 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  +;.  }.  sqlite3
91d0: 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 70 53 65  SelectUnbind(pSe
91e0: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  l);.  sqlite3Exp
91f0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 53 65 6c  rListDelete(pSel
9200: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 65  ->pEList);.  pSe
9210: 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69  l->pEList = pELi
9220: 73 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45 72  st;.  return nEr
9230: 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  r;  .}../*.** Cl
9240: 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
9250: 61 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 56 49  ames from the VI
9260: 45 57 20 70 54 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  EW pTable..**.**
9270: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
9280: 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72   called whenever
9290: 20 61 6e 79 20 6f 74 68 65 72 20 74 61 62 6c 65   any other table
92a0: 20 6f 72 20 76 69 65 77 20 69 73 20 6d 6f 64 69   or view is modi
92b0: 66 69 65 64 2e 0a 2a 2a 20 54 68 65 20 76 69 65  fied..** The vie
92c0: 77 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68  w passed into th
92d0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
92e0: 20 64 65 70 65 6e 64 20 64 69 72 65 63 74 6c 79   depend directly
92f0: 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 0a 2a   or indirectly.*
9300: 2a 20 6f 6e 20 74 68 65 20 6d 6f 64 69 66 69 65  * on the modifie
9310: 64 20 6f 72 20 64 65 6c 65 74 65 64 20 74 61 62  d or deleted tab
9320: 6c 65 20 73 6f 20 77 65 20 6e 65 65 64 20 74 6f  le so we need to
9330: 20 63 6c 65 61 72 20 74 68 65 20 6f 6c 64 20 63   clear the old c
9340: 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d 65 73 20 73  olumn.** names s
9350: 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c  o that they will
9360: 20 62 65 20 72 65 63 6f 6d 70 75 74 65 64 2e 0a   be recomputed..
9370: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
9380: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 43 6f  qliteViewResetCo
9390: 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20  lumnNames(Table 
93a0: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20  *pTable){.  int 
93b0: 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  i;.  Column *pCo
93c0: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  l;.  assert( pTa
93d0: 62 6c 65 21 3d 30 20 26 26 20 70 54 61 62 6c 65  ble!=0 && pTable
93e0: 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ->pSelect!=0 );.
93f0: 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
9400: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 20 69 3c  pTable->aCol; i<
9410: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b  pTable->nCol; i+
9420: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
9430: 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d  sqliteFree(pCol-
9440: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
9450: 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 44  iteFree(pCol->zD
9460: 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  flt);.    sqlite
9470: 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65  Free(pCol->zType
9480: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
9490: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
94a0: 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f  );.  pTable->aCo
94b0: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  l = 0;.  pTable-
94c0: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  >nCol = 0;.}../*
94d0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f  .** Clear the co
94e0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
94f0: 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61  every VIEW in da
9500: 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73  tabase idx..*/.s
9510: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
9520: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71  eViewResetAll(sq
9530: 6c 69 74 65 20 2a 64 62 2c 20 69 6e 74 20 69 64  lite *db, int id
9540: 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  x){.  HashElem *
9550: 69 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50  i;.  if( !DbHasP
9560: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
9570: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
9580: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  ) ) return;.  fo
9590: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
95a0: 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78  rst(&db->aDb[idx
95b0: 5d 2e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69  ].tblHash); i; i
95c0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
95d0: 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  i)){.    Table *
95e0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
95f0: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
9600: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
9610: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
9620: 69 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61  iewResetColumnNa
9630: 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d  mes(pTab);.    }
9640: 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72  .  }.  DbClearPr
9650: 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20  operty(db, idx, 
9660: 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
9670: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
9680: 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75   a token, look u
9690: 70 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  p a table with t
96a0: 68 61 74 20 6e 61 6d 65 2e 20 20 49 66 20 6e 6f  hat name.  If no
96b0: 74 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65 0a 2a  t found, leave.*
96c0: 2a 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 74  * an error for t
96d0: 68 65 20 70 61 72 73 65 72 20 74 6f 20 66 69 6e  he parser to fin
96e0: 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  d and return NUL
96f0: 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  L..*/.Table *sql
9700: 69 74 65 33 54 61 62 6c 65 46 72 6f 6d 54 6f 6b  ite3TableFromTok
9710: 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  en(Parse *pParse
9720: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a  , Token *pTok){.
9730: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
9740: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
9750: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 54  zName = sqlite3T
9760: 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ableNameFromToke
9770: 6e 28 70 54 6f 6b 29 3b 0a 20 20 69 66 28 20 7a  n(pTok);.  if( z
9780: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
9790: 20 30 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c   0;.  pTab = sql
97a0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50  ite3FindTable(pP
97b0: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  arse->db, zName,
97c0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65   0);.  sqliteFre
97d0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  e(zName);.  if( 
97e0: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pTab==0 ){.    s
97f0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9800: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
9810: 74 61 62 6c 65 3a 20 25 54 22 2c 20 70 54 6f 6b  table: %T", pTok
9820: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
9830: 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pTab;.}../*.** T
9840: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
9850: 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20  alled to do the 
9860: 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54  work of a DROP T
9870: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
9880: 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  ** pName is the 
9890: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
98a0: 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e  e to be dropped.
98b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
98c0: 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
98d0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
98e0: 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65  pName, int isVie
98f0: 77 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  w){.  Table *pTa
9900: 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  ble;.  Vdbe *v;.
9910: 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 73 71    int base;.  sq
9920: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
9930: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
9940: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
9950: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
9960: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
9970: 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 61 62 6c   return;.  pTabl
9980: 65 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65  e = sqlite3Table
9990: 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
99a0: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
99b0: 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75  pTable==0 ) retu
99c0: 72 6e 3b 0a 20 20 69 44 62 20 3d 20 70 54 61 62  rn;.  iDb = pTab
99d0: 6c 65 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65 72  le->iDb;.  asser
99e0: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
99f0: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 23 69 66 6e  <db->nDb );.#ifn
9a00: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9a10: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
9a20: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  {.    int code;.
9a30: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
9a40: 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
9a50: 42 4c 45 28 70 54 61 62 6c 65 2d 3e 69 44 62 29  BLE(pTable->iDb)
9a60: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
9a70: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
9a80: 70 54 61 62 6c 65 2d 3e 69 44 62 5d 2e 7a 4e 61  pTable->iDb].zNa
9a90: 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
9aa0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
9ab0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
9ac0: 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
9ad0: 29 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  )){.      return
9ae0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9af0: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
9b00: 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20  if( iDb==1 ){.  
9b10: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
9b20: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49  ITE_DROP_TEMP_VI
9b30: 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EW;.      }else{
9b40: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
9b50: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57  SQLITE_DROP_VIEW
9b60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
9b70: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69  lse{.      if( i
9b80: 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
9b90: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
9ba0: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ROP_TEMP_TABLE;.
9bb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9bc0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
9bd0: 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20  TE_DROP_TABLE;. 
9be0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9bf0: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
9c00: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
9c10: 64 65 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  de, pTable->zNam
9c20: 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
9c30: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
9c40: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
9c50: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
9c60: 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
9c70: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c  , pTable->zName,
9c80: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
9c90: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
9ca0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
9cb0: 20 70 54 61 62 6c 65 2d 3e 72 65 61 64 4f 6e 6c   pTable->readOnl
9cc0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
9cd0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9ce0: 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
9cf0: 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
9d00: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
9d10: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
9d20: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
9d30: 20 20 7d 0a 20 20 69 66 28 20 69 73 56 69 65 77    }.  if( isView
9d40: 20 26 26 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c   && pTable->pSel
9d50: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
9d60: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9d70: 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
9d80: 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20  TABLE to delete 
9d90: 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 6c  table %s", pTabl
9da0: 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  e->zName);.    r
9db0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
9dc0: 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62   !isView && pTab
9dd0: 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  le->pSelect ){. 
9de0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
9df0: 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
9e00: 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c  DROP VIEW to del
9e10: 65 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54  ete view %s", pT
9e20: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
9e30: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
9e40: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
9e50: 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
9e60: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d  table from the m
9e70: 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a  aster table.  **
9e80: 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
9e90: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
9ea0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
9eb0: 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74  f( v ){.    stat
9ec0: 69 63 20 56 64 62 65 4f 70 4c 69 73 74 20 64 72  ic VdbeOpList dr
9ed0: 6f 70 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20  opTable[] = {.  
9ee0: 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c      { OP_Rewind,
9ef0: 20 20 20 20 20 30 2c 20 41 44 44 52 28 31 30 29       0, ADDR(10)
9f00: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
9f10: 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20  _String,     0, 
9f20: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a  0,        0}, /*
9f30: 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   1 */.      { OP
9f40: 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20  _MemStore,   1, 
9f50: 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  1,        0},.  
9f60: 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64      { OP_MemLoad
9f70: 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
9f80: 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20    0}, /* 3 */.  
9f90: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
9fa0: 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20       0, 2,      
9fb0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
9fc0: 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 30 2c 20  _Ne,         0, 
9fd0: 41 44 44 52 28 39 29 2c 20 20 30 7d 2c 0a 20 20  ADDR(9),  0},.  
9fe0: 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c      { OP_Delete,
9ff0: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
a000: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
a010: 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20  _Rewind,     0, 
a020: 41 44 44 52 28 31 30 29 2c 20 30 7d 2c 0a 20 20  ADDR(10), 0},.  
a030: 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20      { OP_Goto,  
a040: 20 20 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c       0, ADDR(3),
a050: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
a060: 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20  _Next,       0, 
a070: 41 44 44 52 28 33 29 2c 20 20 30 7d 2c 20 2f 2a  ADDR(3),  0}, /*
a080: 20 39 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20   9 */.    };.   
a090: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
a0a0: 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
a0b0: 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ger;.    sqlite3
a0c0: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
a0d0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ion(pParse, 0, p
a0e0: 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 0a 20 20  Table->iDb);..  
a0f0: 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72    /* Drop all tr
a100: 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65  iggers associate
a110: 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
a120: 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 2a   being dropped *
a130: 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d  /.    pTrigger =
a140: 20 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65   pTable->pTrigge
a150: 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54  r;.    while( pT
a160: 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20  rigger ){.      
a170: 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
a180: 2d 3e 69 44 62 3d 3d 70 54 61 62 6c 65 2d 3e 69  ->iDb==pTable->i
a190: 44 62 20 7c 7c 20 70 54 72 69 67 67 65 72 2d 3e  Db || pTrigger->
a1a0: 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  iDb==1 );.      
a1b0: 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67  sqlite3DropTrigg
a1c0: 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70 54  erPtr(pParse, pT
a1d0: 72 69 67 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  rigger, 1);.    
a1e0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
a1f0: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20  plain ){.       
a200: 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69   pTrigger = pTri
a210: 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  gger->pNext;.   
a220: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a230: 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 61    pTrigger = pTa
a240: 62 6c 65 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20  ble->pTrigger;. 
a250: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
a260: 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51    /* Drop all SQ
a270: 4c 49 54 45 5f 4d 41 53 54 45 52 20 65 6e 74 72  LITE_MASTER entr
a280: 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74  ies that refer t
a290: 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  o the table */. 
a2a0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61     sqlite3OpenMa
a2b0: 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70 54 61  sterTable(v, pTa
a2c0: 62 6c 65 2d 3e 69 44 62 29 3b 0a 20 20 20 20 62  ble->iDb);.    b
a2d0: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ase = sqlite3Vdb
a2e0: 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
a2f0: 72 61 79 53 69 7a 65 28 64 72 6f 70 54 61 62 6c  raySize(dropTabl
a300: 65 29 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a  e), dropTable);.
a310: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
a320: 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b  hangeP3(v, base+
a330: 31 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  1, pTable->zName
a340: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72  , 0);..    /* Dr
a350: 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 54 45  op all SQLITE_TE
a360: 4d 50 5f 4d 41 53 54 45 52 20 65 6e 74 72 69 65  MP_MASTER entrie
a370: 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
a380: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
a390: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 69 44 62   if( pTable->iDb
a3a0: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=1 ){.      sql
a3b0: 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61  ite3OpenMasterTa
a3c0: 62 6c 65 28 76 2c 20 31 29 3b 0a 20 20 20 20 20  ble(v, 1);.     
a3d0: 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56   base = sqlite3V
a3e0: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
a3f0: 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70 54 61  ArraySize(dropTa
a400: 62 6c 65 29 2c 20 64 72 6f 70 54 61 62 6c 65 29  ble), dropTable)
a410: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a420: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62  dbeChangeP3(v, b
a430: 61 73 65 2b 31 2c 20 70 54 61 62 6c 65 2d 3e 7a  ase+1, pTable->z
a440: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Name, 0);.    }.
a450: 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d  .    if( pTable-
a460: 3e 69 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >iDb==0 ){.     
a470: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
a480: 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a 20 20 20  okie(db, v);.   
a490: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
a4a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
a4b0: 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ose, 0, 0);.    
a4c0: 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20  if( !isView ){. 
a4d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a4e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74  AddOp(v, OP_Dest
a4f0: 72 6f 79 2c 20 70 54 61 62 6c 65 2d 3e 74 6e 75  roy, pTable->tnu
a500: 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b  m, pTable->iDb);
a510: 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d  .      for(pIdx=
a520: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
a530: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
a540: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
a550: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a560: 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c  p(v, OP_Destroy,
a570: 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 49 64   pIdx->tnum, pId
a580: 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 7d  x->iDb);.      }
a590: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
a5a0: 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  e3EndWriteOperat
a5b0: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  ion(pParse);.  }
a5c0: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
a5d0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 63  e in-memory desc
a5e0: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  ription of the t
a5f0: 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
a600: 45 78 63 65 70 74 69 6f 6e 3a 20 69 66 20 74 68  Exception: if th
a610: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
a620: 62 65 67 61 6e 20 77 69 74 68 20 74 68 65 20 45  began with the E
a630: 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 2c 0a  XPLAIN keyword,.
a640: 20 20 2a 2a 20 74 68 65 6e 20 6e 6f 20 63 68 61    ** then no cha
a650: 6e 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 6d  nges should be m
a660: 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ade..  */.  if( 
a670: 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
a680: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e   ){.    sqliteUn
a690: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62  linkAndDeleteTab
a6a0: 6c 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  le(db, pTable);.
a6b0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
a6c0: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
a6d0: 61 6e 67 65 73 3b 0a 20 20 7d 0a 20 20 73 71 6c  anges;.  }.  sql
a6e0: 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
a6f0: 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  db, iDb);.}../*.
a700: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a710: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  is called to cre
a720: 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67  ate a new foreig
a730: 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62  n key on the tab
a740: 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  le.** currently 
a750: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
a760: 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65  on.  pFromCol de
a770: 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63  termines which c
a780: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
a790: 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70   current table p
a7a0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65  oint to the fore
a7b0: 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72  ign key.  If pFr
a7c0: 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a  omCol==0 then.**
a7d0: 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79   connect the key
a7e0: 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   to the last col
a7f0: 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70  umn inserted.  p
a800: 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  To is the name o
a810: 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72  f.** the table r
a820: 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f  eferred to.  pTo
a830: 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66  Col is a list of
a840: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f   tables in the o
a850: 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c  ther.** pTo tabl
a860: 65 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69  e that the forei
a870: 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f  gn key points to
a880: 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e  .  flags contain
a890: 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  s all.** informa
a8a0: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
a8b0: 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
a8c0: 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70  on algorithms sp
a8d0: 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68  ecified.** in th
a8e0: 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20  e ON DELETE, ON 
a8f0: 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e  UPDATE and ON IN
a900: 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SERT clauses..**
a910: 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75  .** An FKey stru
a920: 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64  cture is created
a930: 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
a940: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
a950: 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74  y.** under const
a960: 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ruction in the p
a970: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
a980: 20 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77   field.  The new
a990: 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20   FKey.** is not 
a9a0: 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e  linked into db->
a9b0: 61 46 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f  aFKey at this po
a9c0: 69 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20  int - that does 
a9d0: 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e  not happen.** un
a9e0: 74 69 6c 20 73 71 6c 69 74 65 33 45 6e 64 54 61  til sqlite3EndTa
a9f0: 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ble()..**.** The
aa00: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
aa10: 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
aa20: 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
aa30: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
aa40: 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
aa50: 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
aa60: 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
aa70: 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
aa80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
aa90: 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
aaa0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
aab0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
aac0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49  g context */.  I
aad0: 64 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c  dList *pFromCol,
aae0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69      /* Columns i
aaf0: 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
ab00: 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
ab10: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
ab20: 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
ab30: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
ab40: 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
ab50: 20 49 64 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c   IdList *pToCol,
ab60: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73        /* Columns
ab70: 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
ab80: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
ab90: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
aba0: 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
abb0: 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
abc0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
abd0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
abe0: 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
abf0: 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
ac00: 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
ac10: 2a 7a 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  *z;.  FKey *pFKe
ac20: 79 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  y = 0;..  assert
ac30: 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66  ( pTo!=0 );.  if
ac40: 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  ( p==0 || pParse
ac50: 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 66 6b  ->nErr ) goto fk
ac60: 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f  _end;.  if( pFro
ac70: 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mCol==0 ){.    i
ac80: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f  nt iCol = p->nCo
ac90: 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  l-1;.    if( iCo
aca0: 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  l<0 ) goto fk_en
acb0: 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f  d;.    if( pToCo
acc0: 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64  l && pToCol->nId
acd0: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=1 ){.      sql
ace0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
acf0: 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65  rse, "foreign ke
ad00: 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20  y on %s".       
ad10: 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72    " should refer
ad20: 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f  ence only one co
ad30: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54  lumn of table %T
ad40: 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61  ",.         p->a
ad50: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c  Col[iCol].zName,
ad60: 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74   pTo);.      got
ad70: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  o fk_end;.    }.
ad80: 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20      nCol = 1;.  
ad90: 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c  }else if( pToCol
ada0: 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21   && pToCol->nId!
adb0: 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 49 64 20 29  =pFromCol->nId )
adc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
add0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
ade0: 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66        "number of
adf0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65   columns in fore
ae00: 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  ign key does not
ae10: 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65   match the numbe
ae20: 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22  r of ".        "
ae30: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
ae40: 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22  eferenced table"
ae50: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  );.    goto fk_e
ae60: 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  nd;.  }else{.   
ae70: 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c   nCol = pFromCol
ae80: 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 20 20 6e 42 79  ->nId;.  }.  nBy
ae90: 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b  te = sizeof(*pFK
aea0: 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f  ey) + nCol*sizeo
aeb0: 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d  f(pFKey->aCol[0]
aec0: 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a  ) + pTo->n + 1;.
aed0: 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
aee0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
aef0: 54 6f 43 6f 6c 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ToCol->nId; i++)
af00: 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  {.      nByte +=
af10: 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e   strlen(pToCol->
af20: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b  a[i].zName) + 1;
af30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
af40: 65 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ey = sqliteMallo
af50: 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  c( nByte );.  if
af60: 28 20 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74  ( pFKey==0 ) got
af70: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65  o fk_end;.  pFKe
af80: 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20  y->pFrom = p;.  
af90: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
afa0: 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a   = p->pFKey;.  z
afb0: 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79   = (char*)&pFKey
afc0: 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43  [1];.  pFKey->aC
afd0: 6f 6c 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f  ol = (struct sCo
afe0: 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20  lMap*)z;.  z += 
aff0: 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43  sizeof(struct sC
b000: 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70  olMap)*nCol;.  p
b010: 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20  FKey->zTo = z;. 
b020: 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e   memcpy(z, pTo->
b030: 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b  z, pTo->n);.  z[
b040: 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a  pTo->n] = 0;.  z
b050: 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20   += pTo->n+1;.  
b060: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d  pFKey->pNextTo =
b070: 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f   0;.  pFKey->nCo
b080: 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20  l = nCol;.  if( 
b090: 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
b0a0: 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30     pFKey->aCol[0
b0b0: 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f  ].iFrom = p->nCo
b0c0: 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l-1;.  }else{.  
b0d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
b0e0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
b0f0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
b100: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20  j=0; j<p->nCol; 
b110: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
b120: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
b130: 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  (p->aCol[j].zNam
b140: 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69  e, pFromCol->a[i
b150: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
b160: 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e           pFKey->
b170: 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[i].iFrom = 
b180: 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  j;.          bre
b190: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
b1a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
b1b0: 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  j>=p->nCol ){.  
b1c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
b1d0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
b1e0: 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77           "unknow
b1f0: 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20  n column \"%s\" 
b200: 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
b210: 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20  efinition", .   
b220: 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d         pFromCol-
b230: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
b240: 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
b250: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
b260: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f  .  }.  if( pToCo
b270: 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
b280: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
b290: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
b2a0: 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  rlen(pToCol->a[i
b2b0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
b2c0: 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  pFKey->aCol[i].z
b2d0: 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d  Col = z;.      m
b2e0: 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d  emcpy(z, pToCol-
b2f0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b  >a[i].zName, n);
b300: 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b  .      z[n] = 0;
b310: 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b  .      z += n+1;
b320: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
b330: 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
b340: 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c   0;.  pFKey->del
b350: 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20  eteConf = flags 
b360: 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d  & 0xff;.  pFKey-
b370: 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66  >updateConf = (f
b380: 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78  lags >> 8 ) & 0x
b390: 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73  ff;.  pFKey->ins
b3a0: 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73  ertConf = (flags
b3b0: 20 3e 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b   >> 16 ) & 0xff;
b3c0: 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
b3d0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74  foreign key to t
b3e0: 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20  he table as the 
b3f0: 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a  last step..  */.
b400: 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b    p->pFKey = pFK
b410: 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b  ey;.  pFKey = 0;
b420: 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69  ..fk_end:.  sqli
b430: 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20  teFree(pFKey);. 
b440: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
b450: 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a  lete(pFromCol);.
b460: 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
b470: 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d  elete(pToCol);.}
b480: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
b490: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
b4a0: 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59  hen an INITIALLY
b4b0: 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e   IMMEDIATE or IN
b4c0: 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
b4d0: 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65  .** clause is se
b4e0: 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  en as part of a 
b4f0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
b500: 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44  nition.  The isD
b510: 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d  eferred.** param
b520: 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e  eter is 1 for IN
b530: 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
b540: 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49   and 0 for INITI
b550: 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a  ALLY IMMEDIATE..
b560: 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20  ** The behavior 
b570: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
b580: 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72  ntly created for
b590: 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75  eign key is adju
b5a0: 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  sted.** accordin
b5b0: 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gly..*/.void sql
b5c0: 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
b5d0: 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  Key(Parse *pPars
b5e0: 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65  e, int isDeferre
b5f0: 64 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  d){.  Table *pTa
b600: 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  b;.  FKey *pFKey
b610: 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20  ;.  if( (pTab = 
b620: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
b630: 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20  e)==0 || (pFKey 
b640: 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d  = pTab->pFKey)==
b650: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 46  0 ) return;.  pF
b660: 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
b670: 3d 20 69 73 44 65 66 65 72 72 65 64 3b 0a 7d 0a  = isDeferred;.}.
b680: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
b690: 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e  new index for an
b6a0: 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 49 6e   SQL table.  pIn
b6b0: 64 65 78 20 69 73 20 74 68 65 20 6e 61 6d 65 20  dex is the name 
b6c0: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a  of the index .**
b6d0: 20 61 6e 64 20 70 54 61 62 6c 65 20 69 73 20 74   and pTable is t
b6e0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
b6f0: 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
b700: 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74  be indexed.  Bot
b710: 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55  h will .** be NU
b720: 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79  LL for a primary
b730: 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78   key or an index
b740: 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
b750: 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a   to satisfy a.**
b760: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
b770: 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61  nt.  If pTable a
b780: 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55  nd pIndex are NU
b790: 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e  LL, use pParse->
b7a0: 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20  pNewTable.** as 
b7b0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
b7c0: 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65  indexed.  pParse
b7d0: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61  ->pNewTable is a
b7e0: 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a   table that is.*
b7f0: 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  * currently bein
b800: 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  g constructed by
b810: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
b820: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
b830: 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
b840: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
b850: 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73  e indexed.  pLis
b860: 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  t will be NULL i
b870: 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70  f this.** is a p
b880: 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e  rimary key or un
b890: 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20  ique-constraint 
b8a0: 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
b8b0: 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a  nt column added.
b8c0: 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ** to the table 
b8d0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
b8e0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a  construction.  .
b8f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
b900: 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61  reateIndex(.  Pa
b910: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
b920: 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * All informatio
b930: 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72  n about this par
b940: 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
b950: 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  Name,    /* Name
b960: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
b970: 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
b980: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 6c 65   SrcList *pTable
b990: 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  , /* Name of the
b9a0: 20 74 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e   table to index.
b9b0: 20 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e    Use pParse->pN
b9c0: 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a  ewTable if 0 */.
b9d0: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c    IdList *pList,
b9e0: 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20     /* A list of 
b9f0: 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
ba00: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
ba10: 6e 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f  nError,     /* O
ba20: 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f  E_Abort, OE_Igno
ba30: 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20  re, OE_Replace, 
ba40: 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20  or OE_None */.  
ba50: 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
ba60: 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
ba70: 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
ba80: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
ba90: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
baa0: 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20 20  oken *pEnd      
bab0: 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74 20  /* The ")" that 
bac0: 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41 54  closes the CREAT
bad0: 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
bae0: 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  t */.){.  Table 
baf0: 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61  *pTab;     /* Ta
bb00: 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
bb10: 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
bb20: 6e 64 65 78 3b 20 20 20 2f 2a 20 54 68 65 20 69  ndex;   /* The i
bb30: 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74  ndex to be creat
bb40: 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ed */.  char *zN
bb50: 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ame = 0;.  int i
bb60: 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c  , j;.  Token nul
bb70: 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b 65 20  lId;    /* Fake 
bb80: 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70  token for an emp
bb90: 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20  ty ID list */.  
bba0: 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20  DbFixer sFix;   
bbb0: 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e   /* For assignin
bbc0: 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73  g database names
bbd0: 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20   to pTable */.  
bbe0: 69 6e 74 20 69 73 54 65 6d 70 3b 20 20 20 20 20  int isTemp;     
bbf0: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 74   /* True for a t
bc00: 65 6d 70 6f 72 61 72 79 20 69 6e 64 65 78 20 2a  emporary index *
bc10: 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  /.  sqlite *db =
bc20: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
bc30: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
bc40: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
bc50: 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f  oc_failed ) goto
bc60: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
bc70: 65 78 3b 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e  ex;.  if( db->in
bc80: 69 74 2e 62 75 73 79 20 0a 20 20 20 20 20 26 26  it.busy .     &&
bc90: 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
bca0: 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 64  &sFix, pParse, d
bcb0: 62 2d 3e 69 6e 69 74 2e 69 44 62 2c 20 22 69 6e  b->init.iDb, "in
bcc0: 64 65 78 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20  dex", pName).   
bcd0: 20 20 26 26 20 73 71 6c 69 74 65 33 46 69 78 53    && sqlite3FixS
bce0: 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54  rcList(&sFix, pT
bcf0: 61 62 6c 65 29 0a 20 20 29 7b 0a 20 20 20 20 67  able).  ){.    g
bd00: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
bd10: 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
bd20: 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74  .  ** Find the t
bd30: 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
bd40: 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74  be indexed.  Ret
bd50: 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74  urn early if not
bd60: 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69   found..  */.  i
bd70: 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a  f( pTable!=0 ){.
bd80: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
bd90: 65 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e!=0 );.    asse
bda0: 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 53 72 63  rt( pTable->nSrc
bdb0: 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61 62 20  ==1 );.    pTab 
bdc0: 3d 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  =  sqlite3SrcLis
bdd0: 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  tLookup(pParse, 
bde0: 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65  pTable);.  }else
bdf0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
be00: 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  ame==0 );.    pT
be10: 61 62 20 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e  ab =  pParse->pN
be20: 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  ewTable;.  }.  i
be30: 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50  f( pTab==0 || pP
be40: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
be50: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
be60: 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  dex;.  if( pTab-
be70: 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
be80: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
be90: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
bea0: 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  %s may not be in
beb0: 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  dexed", pTab->zN
bec0: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
bed0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
bee0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62  ;.  }.  if( pTab
bef0: 2d 3e 69 44 62 3e 3d 32 20 26 26 20 64 62 2d 3e  ->iDb>=2 && db->
bf00: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
bf10: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
bf20: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
bf30: 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 68 61  le %s may not ha
bf40: 76 65 20 69 6e 64 69 63 65 73 20 61 64 64 65 64  ve indices added
bf50: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
bf60: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
bf70: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
bf80: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65  .  if( pTab->pSe
bf90: 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
bfa0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
bfb0: 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e  se, "views may n
bfc0: 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
bfd0: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
bfe0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
bff0: 0a 20 20 69 73 54 65 6d 70 20 3d 20 70 54 61 62  .  isTemp = pTab
c000: 2d 3e 69 44 62 3d 3d 31 3b 0a 0a 20 20 2f 2a 0a  ->iDb==1;..  /*.
c010: 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61    ** Find the na
c020: 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  me of the index.
c030: 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72    Make sure ther
c040: 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
c050: 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e   another.  ** in
c060: 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74  dex or table wit
c070: 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
c080: 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63    .  **.  ** Exc
c090: 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61  eption:  If we a
c0a0: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e  re reading the n
c0b0: 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e  ames of permanen
c0c0: 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74  t indices from t
c0d0: 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d  he.  ** sqlite_m
c0e0: 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63  aster table (bec
c0f0: 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  ause some other 
c100: 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20  process changed 
c110: 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a  the schema) and.
c120: 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20    ** one of the 
c130: 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c  index names coll
c140: 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61  ides with the na
c150: 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72  me of a temporar
c160: 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20  y table or.  ** 
c170: 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77  index, then we w
c180: 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
c190: 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64  process this ind
c1a0: 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ex..  **.  ** If
c1b0: 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61   pName==0 it mea
c1c0: 6e 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20  ns that we are. 
c1d0: 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68   ** dealing with
c1e0: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
c1f0: 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
c200: 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f  int.  We have to
c210: 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a   invent our.  **
c220: 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   own name..  */.
c230: 20 20 69 66 28 20 70 4e 61 6d 65 20 26 26 20 21    if( pName && !
c240: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
c250: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 53 61  .    Index *pISa
c260: 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 6e  meName;    /* An
c270: 6f 74 68 65 72 20 69 6e 64 65 78 20 77 69 74 68  other index with
c280: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 2a   the same name *
c290: 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 53  /.    Table *pTS
c2a0: 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41  ameName;    /* A
c2b0: 20 74 61 62 6c 65 20 77 69 74 68 20 73 61 6d 65   table with same
c2c0: 20 6e 61 6d 65 20 61 73 20 74 68 65 20 69 6e 64   name as the ind
c2d0: 65 78 20 2a 2f 0a 20 20 20 20 7a 4e 61 6d 65 20  ex */.    zName 
c2e0: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
c2f0: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
c300: 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  >n);.    if( zNa
c310: 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
c320: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
c330: 20 20 20 20 69 66 28 20 28 70 49 53 61 6d 65 4e      if( (pISameN
c340: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ame = sqlite3Fin
c350: 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
c360: 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 0))!=0 ){.    
c370: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
c380: 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
c390: 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73   %s already exis
c3a0: 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ts", zName);.   
c3b0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
c3c0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
c3d0: 0a 20 20 20 20 69 66 28 20 28 70 54 53 61 6d 65  .    if( (pTSame
c3e0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Name = sqlite3Fi
c3f0: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
c400: 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20  e, 0))!=0 ){.   
c410: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
c420: 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
c430: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74  e is already a t
c440: 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20  able named %s", 
c450: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
c460: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
c470: 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ndex;.    }.  }e
c480: 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30  lse if( pName==0
c490: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   ){.    char zBu
c4a0: 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e  f[30];.    int n
c4b0: 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f  ;.    Index *pLo
c4c0: 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f  op;.    for(pLoo
c4d0: 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20  p=pTab->pIndex, 
c4e0: 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  n=1; pLoop; pLoo
c4f0: 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20  p=pLoop->pNext, 
c500: 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e  n++){}.    sprin
c510: 74 66 28 7a 42 75 66 2c 22 25 64 29 22 2c 6e 29  tf(zBuf,"%d)",n)
c520: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  ;.    zName = 0;
c530: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
c540: 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 28  tring(&zName, "(
c550: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
c560: 22 20 61 75 74 6f 69 6e 64 65 78 20 22 2c 20 7a  " autoindex ", z
c570: 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Buf, (char*)0);.
c580: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
c590: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
c5a0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 65 6c  ate_index;.  }el
c5b0: 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  se{.    zName = 
c5c0: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e  sqliteStrNDup(pN
c5d0: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
c5e0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  );.  }..  /* Che
c5f0: 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61  ck for authoriza
c600: 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61  tion to create a
c610: 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69  n index..  */.#i
c620: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c630: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
c640: 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68    {.    const ch
c650: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
c660: 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61  b[pTab->iDb].zNa
c670: 6d 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  me;..    assert(
c680: 20 70 54 61 62 2d 3e 69 44 62 3d 3d 64 62 2d 3e   pTab->iDb==db->
c690: 69 6e 69 74 2e 69 44 62 20 7c 7c 20 69 73 54 65  init.iDb || isTe
c6a0: 6d 70 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71  mp );.    if( sq
c6b0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
c6c0: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
c6d0: 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
c6e0: 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a  LE(isTemp), 0, z
c6f0: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
c700: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
c710: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
c720: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
c730: 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
c740: 69 73 54 65 6d 70 20 29 20 69 20 3d 20 53 51 4c  isTemp ) i = SQL
c750: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
c760: 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
c770: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
c780: 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65  pParse, i, zName
c790: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
c7a0: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
c7b0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
c7c0: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dex;.    }.  }.#
c7d0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70  endif..  /* If p
c7e0: 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e  List==0, it mean
c7f0: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
c800: 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b  as called to mak
c810: 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a  e a primary.  **
c820: 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20   key out of the 
c830: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  last column adde
c840: 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75  d to the table u
c850: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
c860: 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74  n..  ** So creat
c870: 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f  e a fake list to
c880: 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a   simulate this..
c890: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74    */.  if( pList
c8a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49  ==0 ){.    nullI
c8b0: 64 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  d.z = pTab->aCol
c8c0: 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a  [pTab->nCol-1].z
c8d0: 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64  Name;.    nullId
c8e0: 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c 6c  .n = strlen(null
c8f0: 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74  Id.z);.    pList
c900: 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74   = sqlite3IdList
c910: 41 70 70 65 6e 64 28 30 2c 20 26 6e 75 6c 6c 49  Append(0, &nullI
c920: 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  d);.    if( pLis
c930: 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  t==0 ) goto exit
c940: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
c950: 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41   }..  /* .  ** A
c960: 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65  llocate the inde
c970: 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20  x structure. .  
c980: 2a 2f 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  */.  pIndex = sq
c990: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
c9a0: 6f 66 28 49 6e 64 65 78 29 20 2b 20 73 74 72 6c  of(Index) + strl
c9b0: 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a  en(zName) + 1 +.
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28          (sizeof(
c9e0: 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 43 6f  int) + sizeof(Co
c9f0: 6c 6c 53 65 71 2a 29 29 2a 70 4c 69 73 74 2d 3e  llSeq*))*pList->
ca00: 6e 49 64 20 29 3b 0a 20 20 69 66 28 20 70 49 6e  nId );.  if( pIn
ca10: 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  dex==0 ) goto ex
ca20: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
ca30: 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  .  pIndex->aiCol
ca40: 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e  umn = (int*)&pIn
ca50: 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  dex->keyInfo.aCo
ca60: 6c 6c 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b 0a  ll[pList->nId];.
ca70: 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20    pIndex->zName 
ca80: 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78  = (char*)&pIndex
ca90: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74  ->aiColumn[pList
caa0: 2d 3e 6e 49 64 5d 3b 0a 20 20 73 74 72 63 70 79  ->nId];.  strcpy
cab0: 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20  (pIndex->zName, 
cac0: 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78  zName);.  pIndex
cad0: 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b  ->pTable = pTab;
cae0: 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  .  pIndex->nColu
caf0: 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 49 64 3b  mn = pList->nId;
cb00: 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  .  pIndex->onErr
cb10: 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20  or = onError;.  
cb20: 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65  pIndex->autoInde
cb30: 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20 20  x = pName==0;.  
cb40: 70 49 6e 64 65 78 2d 3e 69 44 62 20 3d 20 69 73  pIndex->iDb = is
cb50: 54 65 6d 70 20 3f 20 31 20 3a 20 64 62 2d 3e 69  Temp ? 1 : db->i
cb60: 6e 69 74 2e 69 44 62 3b 0a 0a 20 20 2f 2a 20 53  nit.iDb;..  /* S
cb70: 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  can the names of
cb80: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
cb90: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
cba0: 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a  indexed and.  **
cbb0: 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e   load the column
cbc0: 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68   indices into th
cbd0: 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  e Index structur
cbe0: 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72  e.  Report an er
cbf0: 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  ror.  ** if any 
cc00: 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f  column is not fo
cc10: 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  und..  */.  for(
cc20: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
cc30: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  d; i++){.    for
cc40: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
cc50: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
cc60: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
cc70: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
cc80: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
cc90: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [j].zName)==0 ) 
cca0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ccb0: 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
ccc0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
ccd0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
cce0: 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
ccf0: 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s no column name
cd00: 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  d %s",.        p
cd10: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69 73  Tab->zName, pLis
cd20: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
cd30: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
cd40: 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  (pIndex);.      
cd50: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
cd60: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
cd70: 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
cd80: 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 70  mn[i] = j;.    p
cd90: 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
cda0: 43 6f 6c 6c 5b 69 5d 20 3d 20 70 54 61 62 2d 3e  Coll[i] = pTab->
cdb0: 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20  aCol[j].pColl;. 
cdc0: 20 7d 0a 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79   }.  pIndex->key
cdd0: 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 4c  Info.nField = pL
cde0: 69 73 74 2d 3e 6e 49 64 3b 0a 0a 20 20 2f 2a 20  ist->nId;..  /* 
cdf0: 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64  Link the new Ind
ce00: 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ex structure to 
ce10: 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f  its table and to
ce20: 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20   the other.  ** 
ce30: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
ce40: 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a  se structures. .
ce50: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72    */.  if( !pPar
ce60: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
ce70: 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
ce80: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
ce90: 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b  Insert(&db->aDb[
cea0: 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 69 64 78  pIndex->iDb].idx
ceb0: 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20  Hash, .         
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ced0: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73  pIndex->zName, s
cee0: 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e  trlen(pIndex->zN
cef0: 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b  ame)+1, pIndex);
cf00: 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
cf10: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
cf20: 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c  Index );  /* Mal
cf30: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
cf40: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71  iled */.      sq
cf50: 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65 78 29  liteFree(pIndex)
cf60: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
cf70: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
cf80: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c      }.    db->fl
cf90: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
cfa0: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d  ternChanges;.  }
cfb0: 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69  ..  /* When addi
cfc0: 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74  ng an index to t
cfd0: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63  he list of indic
cfe0: 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20  es for a table, 
cff0: 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61  make.  ** sure a
d000: 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c  ll indices label
d010: 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f  ed OE_Replace co
d020: 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f  me after all tho
d030: 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20  se labeled.  ** 
d040: 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73  OE_Ignore.  This
d050: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
d060: 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70  r the correct op
d070: 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54  eration of UPDAT
d080: 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52  E.  ** and INSER
d090: 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 6e  T..  */.  if( on
d0a0: 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
d0b0: 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
d0c0: 78 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 70  x==0.       || p
d0d0: 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45  Tab->pIndex->onE
d0e0: 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
d0f0: 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  ){.    pIndex->p
d100: 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e  Next = pTab->pIn
d110: 64 65 78 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70  dex;.    pTab->p
d120: 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
d130: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64    }else{.    Ind
d140: 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61  ex *pOther = pTa
d150: 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 77  b->pIndex;.    w
d160: 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e  hile( pOther->pN
d170: 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70  ext && pOther->p
d180: 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  Next->onError!=O
d190: 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20  E_Replace ){.   
d1a0: 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68     pOther = pOth
d1b0: 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  er->pNext;.    }
d1c0: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65  .    pIndex->pNe
d1d0: 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  xt = pOther->pNe
d1e0: 78 74 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d 3e  xt;.    pOther->
d1f0: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a  pNext = pIndex;.
d200: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
d210: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
d220: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
d230: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
d240: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
d250: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
d260: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
d270: 73 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77  sk.  So do not w
d280: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
d290: 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78  .  ** again.  Ex
d2a0: 74 72 61 63 74 20 74 68 65 20 74 61 62 6c 65 20  tract the table 
d2b0: 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20  number from the 
d2c0: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
d2d0: 20 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69   field..  */.  i
d2e0: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
d2f0: 20 26 26 20 70 54 61 62 6c 65 21 3d 30 20 29 7b   && pTable!=0 ){
d300: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75  .    pIndex->tnu
d310: 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
d320: 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Tnum;.  }..  /* 
d330: 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  If the db->init.
d340: 62 75 73 79 20 69 73 20 30 20 74 68 65 6e 20 63  busy is 0 then c
d350: 72 65 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  reate the index 
d360: 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20  on disk.  This. 
d370: 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69   ** involves wri
d380: 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69  ting the index i
d390: 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74  nto the master t
d3a0: 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67  able and filling
d3b0: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64   in the.  ** ind
d3c0: 65 78 20 77 69 74 68 20 74 68 65 20 63 75 72 72  ex with the curr
d3d0: 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e  ent table conten
d3e0: 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ts..  **.  ** Th
d3f0: 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
d400: 69 73 20 30 20 77 68 65 6e 20 74 68 65 20 75 73  is 0 when the us
d410: 65 72 20 66 69 72 73 74 20 65 6e 74 65 72 73 20  er first enters 
d420: 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a  a CREATE INDEX .
d430: 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64    ** command.  d
d440: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
d450: 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73  1 when a databas
d460: 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20  e is opened and 
d470: 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44  .  ** CREATE IND
d480: 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  EX statements ar
d490: 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68  e read out of th
d4a0: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e master table. 
d4b0: 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74   In.  ** the lat
d4c0: 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e 64  ter case the ind
d4d0: 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
d4e0: 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68  s on disk, which
d4f0: 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20   is why.  ** we 
d500: 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65  don't want to re
d510: 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a  create it..  **.
d520: 20 20 2a 2a 20 49 66 20 70 54 61 62 6c 65 3d 3d    ** If pTable==
d530: 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  0 it means this 
d540: 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74  index is generat
d550: 65 64 20 61 73 20 61 20 70 72 69 6d 61 72 79 20  ed as a primary 
d560: 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51  key.  ** or UNIQ
d570: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66  UE constraint of
d580: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
d590: 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63  statement.  Sinc
d5a0: 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a  e the table.  **
d5b0: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63   has just been c
d5c0: 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61  reated, it conta
d5d0: 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20  ins no data and 
d5e0: 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61  the index initia
d5f0: 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74  lization.  ** st
d600: 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65  ep can be skippe
d610: 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  d..  */.  else i
d620: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
d630: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ==0 ){.    int n
d640: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  ;.    Vdbe *v;. 
d650: 20 20 20 69 6e 74 20 6c 62 6c 31 2c 20 6c 62 6c     int lbl1, lbl
d660: 32 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  2;.    int i;.  
d670: 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20    int addr;..   
d680: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
d690: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
d6a0: 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
d6b0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
d6c0: 65 78 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ex;.    if( pTab
d6d0: 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  le!=0 ){.      s
d6e0: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
d6f0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
d700: 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20  , 0, isTemp);.  
d710: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d      sqlite3OpenM
d720: 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69 73  asterTable(v, is
d730: 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Temp);.    }.   
d740: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d750: 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f  p(v, OP_NewRecno
d760: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
d770: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
d780: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20  P_String, 0, 0, 
d790: 22 69 6e 64 65 78 22 2c 20 50 33 5f 53 54 41 54  "index", P3_STAT
d7a0: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
d7b0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74  VdbeOp3(v, OP_St
d7c0: 72 69 6e 67 2c 20 30 2c 20 30 2c 20 70 49 6e 64  ring, 0, 0, pInd
d7d0: 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ex->zName, 0);. 
d7e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
d7f0: 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  3(v, OP_String, 
d800: 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  0, 0, pTab->zNam
d810: 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
d820: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
d830: 43 72 65 61 74 65 49 6e 64 65 78 2c 20 30 2c 20  CreateIndex, 0, 
d840: 69 73 54 65 6d 70 2c 28 63 68 61 72 2a 29 26 70  isTemp,(char*)&p
d850: 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 50 33 5f 50  Index->tnum,P3_P
d860: 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 70 49 6e  OINTER);.    pIn
d870: 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20  dex->tnum = 0;. 
d880: 20 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b     if( pTable ){
d890: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d8a0: 62 65 43 6f 64 65 28 76 2c 0a 20 20 20 20 20 20  beCode(v,.      
d8b0: 20 20 20 20 4f 50 5f 44 75 70 2c 20 20 20 20 20      OP_Dup,     
d8c0: 20 20 30 2c 20 20 20 20 20 20 30 2c 0a 20 20 20    0,      0,.   
d8d0: 20 20 20 20 20 20 20 4f 50 5f 49 6e 74 65 67 65         OP_Intege
d8e0: 72 2c 20 20 20 69 73 54 65 6d 70 2c 20 30 2c 0a  r,   isTemp, 0,.
d8f0: 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 20 20        0);.      
d900: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
d910: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
d920: 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  1, 0,.          
d930: 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
d940: 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  *)&pIndex->keyIn
d950: 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P3_KEYINFO);
d960: 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20  .    }.    addr 
d970: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
d980: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
d990: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
d9a0: 70 53 74 61 72 74 20 26 26 20 70 45 6e 64 20 29  pStart && pEnd )
d9b0: 7b 0a 20 20 20 20 20 20 6e 20 3d 20 41 64 64 72  {.      n = Addr
d9c0: 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72  (pEnd->z) - Addr
d9d0: 28 70 53 74 61 72 74 2d 3e 7a 29 20 2b 20 31 3b  (pStart->z) + 1;
d9e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d9f0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
da00: 64 72 2c 20 70 53 74 61 72 74 2d 3e 7a 2c 20 6e  dr, pStart->z, n
da10: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
da20: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
da30: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c  P_MakeRecord, 5,
da40: 20 30 2c 20 22 74 74 74 69 74 22 2c 20 50 33 5f   0, "tttit", P3_
da50: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
da60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
da70: 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30   OP_PutIntKey, 0
da80: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54  , 0);.    if( pT
da90: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71  able ){.      sq
daa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
dab0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54  , OP_Integer, pT
dac0: 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20  ab->iDb, 0);.   
dad0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
dae0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  dOp(v, OP_OpenRe
daf0: 61 64 2c 20 32 2c 20 70 54 61 62 2d 3e 74 6e 75  ad, 2, pTab->tnu
db00: 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 56 64 62  m);.      /* Vdb
db10: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
db20: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  ", pTab->zName))
db30: 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ; */.      sqlit
db40: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
db50: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
db60: 20 32 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b   2, pTab->nCol);
db70: 0a 20 20 20 20 20 20 6c 62 6c 32 20 3d 20 73 71  .      lbl2 = sq
db80: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
db90: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
dba0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
dbb0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 32 2c 20 6c   OP_Rewind, 2, l
dbc0: 62 6c 32 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31  bl2);.      lbl1
dbd0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
dbe0: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c  dOp(v, OP_Recno,
dbf0: 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f   2, 0);.      fo
dc00: 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d  r(i=0; i<pIndex-
dc10: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
dc20: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
dc30: 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c   = pIndex->aiCol
dc40: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  umn[i];.        
dc50: 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d  if( pTab->iPKey=
dc60: 3d 69 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  =iCol ){.       
dc70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
dc80: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 69  dOp(v, OP_Dup, i
dc90: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 0);.        }e
dca0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
dcb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
dcc0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 32 2c  v, OP_Column, 2,
dcd0: 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   iCol);.        
dce0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
dcf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dd00: 28 76 2c 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65  (v, OP_MakeIdxKe
dd10: 79 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  y, pIndex->nColu
dd20: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  mn, 0);.      sq
dd30: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
dd40: 74 79 53 74 72 28 76 2c 20 70 49 6e 64 65 78 29  tyStr(v, pIndex)
dd50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
dd60: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  dbeOp3(v, OP_Idx
dd70: 50 75 74 2c 20 31 2c 20 70 49 6e 64 65 78 2d 3e  Put, 1, pIndex->
dd80: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
dd90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dda0: 20 20 20 20 20 20 20 20 22 69 6e 64 65 78 65 64          "indexed
ddb0: 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74   columns are not
ddc0: 20 75 6e 69 71 75 65 22 2c 20 50 33 5f 53 54 41   unique", P3_STA
ddd0: 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TIC);.      sqli
dde0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ddf0: 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c 62 6c 31  OP_Next, 2, lbl1
de00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
de10: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
de20: 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20  (v, lbl2);.     
de30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
de40: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 32  p(v, OP_Close, 2
de50: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
de60: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
de70: 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b  OP_Close, 1, 0);
de80: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
de90: 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20  Table!=0 ){.    
dea0: 20 20 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b    if( !isTemp ){
deb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dec0: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
ded0: 20 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   v);.      }.   
dee0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
def0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
df00: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
df10: 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65  lite3EndWriteOpe
df20: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a  ration(pParse);.
df30: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
df40: 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20  Clean up before 
df50: 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f  exiting */.exit_
df60: 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20  create_index:.  
df70: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
df80: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73 71  ete(pList);.  sq
df90: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
dfa0: 74 65 28 70 54 61 62 6c 65 29 3b 0a 20 20 73 71  te(pTable);.  sq
dfb0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
dfc0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
dfd0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
dfe0: 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78   will drop an ex
dff0: 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64  isting named ind
e000: 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ex.  This routin
e010: 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20  e.** implements 
e020: 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73  the DROP INDEX s
e030: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
e040: 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64  d sqlite3DropInd
e050: 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
e060: 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
e070: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
e080: 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ex;.  Vdbe *v;. 
e090: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
e0a0: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
e0b0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
e0c0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
e0d0: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
e0e0: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
e0f0: 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70  ->nSrc==1 );.  p
e100: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46  Index = sqlite3F
e110: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61  indIndex(db, pNa
e120: 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
e130: 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
e140: 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49  abase);.  if( pI
e150: 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ndex==0 ){.    s
e160: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
e170: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
e180: 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d  index: %S", pNam
e190: 65 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  e, 0);.    goto 
e1a0: 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
e1b0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65  .  }.  if( pInde
e1c0: 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a  x->autoIndex ){.
e1d0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
e1e0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
e1f0: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
e200: 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20  th UNIQUE ".    
e210: 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45    "or PRIMARY KE
e220: 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Y constraint can
e230: 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
e240: 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78   0);.    goto ex
e250: 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
e260: 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d   }.  if( pIndex-
e270: 3e 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 73 71  >iDb>1 ){.    sq
e280: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
e290: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 61 6c  arse, "cannot al
e2a0: 74 65 72 20 73 63 68 65 6d 61 20 6f 66 20 61 74  ter schema of at
e2b0: 74 61 63 68 65 64 20 22 0a 20 20 20 20 20 20 20  tached ".       
e2c0: 22 64 61 74 61 62 61 73 65 73 22 2c 20 30 29 3b  "databases", 0);
e2d0: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
e2e0: 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  rop_index;.  }.#
e2f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e300: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
e310: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
e320: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
e330: 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65  INDEX;.    Table
e340: 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
e350: 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e  >pTable;.    con
e360: 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
e370: 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69  b->aDb[pIndex->i
e380: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  Db].zName;.    c
e390: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
e3a0: 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70  = SCHEMA_TABLE(p
e3b0: 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20  Index->iDb);.   
e3c0: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
e3d0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
e3e0: 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
e3f0: 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  b, 0, zDb) ){.  
e400: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
e410: 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
e420: 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
e430: 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c  iDb ) code = SQL
e440: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
e450: 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
e460: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
e470: 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64  arse, code, pInd
e480: 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  ex->zName, pTab-
e490: 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
e4a0: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
e4b0: 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
e4c0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
e4d0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
e4e0: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69   to remove the i
e4f0: 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68  ndex and from th
e500: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e master table *
e510: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
e520: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
e530: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
e540: 74 61 74 69 63 20 56 64 62 65 4f 70 4c 69 73 74  tatic VdbeOpList
e550: 20 64 72 6f 70 49 6e 64 65 78 5b 5d 20 3d 20 7b   dropIndex[] = {
e560: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69  .      { OP_Rewi
e570: 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28  nd,     0, ADDR(
e580: 39 29 2c 20 30 7d 2c 20 0a 20 20 20 20 20 20 7b  9), 0}, .      {
e590: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20   OP_String,     
e5a0: 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  0, 0,       0}, 
e5b0: 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 1 */.      { 
e5c0: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31  OP_MemStore,   1
e5d0: 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 1,       0},. 
e5e0: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61       { OP_MemLoa
e5f0: 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  d,    1, 0,     
e600: 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20    0}, /* 3 */.  
e610: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
e620: 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20       0, 1,      
e630: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
e640: 45 71 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41  Eq,         0, A
e650: 44 44 52 28 38 29 2c 20 30 7d 2c 0a 20 20 20 20  DDR(8), 0},.    
e660: 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20    { OP_Next,    
e670: 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20 30     0, ADDR(3), 0
e680: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f  },.      { OP_Go
e690: 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44  to,       0, ADD
e6a0: 52 28 39 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20  R(9), 0},.      
e6b0: 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20  { OP_Delete,    
e6c0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   0, 0,       0},
e6d0: 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 7d 3b 0a   /* 8 */.    };.
e6e0: 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a 0a 20      int base;.. 
e6f0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
e700: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
e710: 61 72 73 65 2c 20 30 2c 20 70 49 6e 64 65 78 2d  arse, 0, pIndex-
e720: 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  >iDb);.    sqlit
e730: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
e740: 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62  e(v, pIndex->iDb
e750: 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71  );.    base = sq
e760: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
e770: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
e780: 64 72 6f 70 49 6e 64 65 78 29 2c 20 64 72 6f 70  dropIndex), drop
e790: 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  Index);.    sqli
e7a0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
e7b0: 76 2c 20 62 61 73 65 2b 31 2c 20 70 49 6e 64 65  v, base+1, pInde
e7c0: 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  x->zName, 0);.  
e7d0: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 44    if( pIndex->iD
e7e0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  b==0 ){.      sq
e7f0: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
e800: 65 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a  e(db, v);.    }.
e810: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e820: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
e830: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
e840: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
e850: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49 6e   OP_Destroy, pIn
e860: 64 65 78 2d 3e 74 6e 75 6d 2c 20 70 49 6e 64 65  dex->tnum, pInde
e870: 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  x->iDb);.    sql
e880: 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72  ite3EndWriteOper
e890: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
e8a0: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
e8b0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 65  the in-memory de
e8c0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 69  scription of thi
e8d0: 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20  s index..  */.  
e8e0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70  if( !pParse->exp
e8f0: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  lain ){.    sqli
e900: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
e910: 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  teIndex(db, pInd
e920: 65 78 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  ex);.    db->fla
e930: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
e940: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a  ernChanges;.  }.
e950: 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78  .exit_drop_index
e960: 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
e970: 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b  stDelete(pName);
e980: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
e990: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
e9a0: 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69  o the given IdLi
e9b0: 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
e9c0: 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e  w IdList if.** n
e9d0: 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  eed be..**.** A 
e9e0: 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65  new IdList is re
e9f0: 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
ea00: 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  if malloc() fail
ea10: 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71  s..*/.IdList *sq
ea20: 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
ea30: 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  d(IdList *pList,
ea40: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
ea50: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
ea60: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
ea70: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
ea80: 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
ea90: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
eaa0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
eab0: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
eac0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  0;.  }.  if( pLi
ead0: 73 74 2d 3e 6e 49 64 3e 3d 70 4c 69 73 74 2d 3e  st->nId>=pList->
eae0: 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 73 74  nAlloc ){.    st
eaf0: 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d  ruct IdList_item
eb00: 20 2a 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e   *a;.    pList->
eb10: 6e 41 6c 6c 6f 63 20 3d 20 70 4c 69 73 74 2d 3e  nAlloc = pList->
eb20: 6e 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20 20  nAlloc*2 + 5;.  
eb30: 20 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c    a = sqliteReal
eb40: 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 70 4c  loc(pList->a, pL
eb50: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69 7a 65  ist->nAlloc*size
eb60: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20  of(pList->a[0]) 
eb70: 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20  );.    if( a==0 
eb80: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
eb90: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  IdListDelete(pLi
eba0: 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
ebb0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
ebc0: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d  List->a = a;.  }
ebd0: 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74  .  memset(&pList
ebe0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c  ->a[pList->nId],
ebf0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74   0, sizeof(pList
ec00: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  ->a[0]));.  if( 
ec10: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68  pToken ){.    ch
ec20: 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74  ar **pz = &pList
ec30: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e  ->a[pList->nId].
ec40: 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74  zName;.    sqlit
ec50: 65 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c  e3SetNString(pz,
ec60: 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b   pToken->z, pTok
ec70: 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69  en->n, 0);.    i
ec80: 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20  f( *pz==0 ){.   
ec90: 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
eca0: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
ecb0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
ecc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ecd0: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 2a  sqlite3Dequote(*
ece0: 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pz);.    }.  }. 
ecf0: 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20   pList->nId++;. 
ed00: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
ed10: 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
ed20: 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20   new table name 
ed30: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72 63  to the given Src
ed40: 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20  List.  Create a 
ed50: 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a  new SrcList if.*
ed60: 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65  * need be.  A ne
ed70: 77 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74  w entry is creat
ed80: 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ed in the SrcLis
ed90: 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e  t even if pToken
eda0: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
edb0: 41 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 73  A new SrcList is
edc0: 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
edd0: 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66  LL if malloc() f
ede0: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ails..**.** If p
edf0: 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  Database is not 
ee00: 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  null, it means t
ee10: 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61  hat the table ha
ee20: 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a  s an optional.**
ee30: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70   database name p
ee40: 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69  refix.  Like thi
ee50: 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61  s:  "database.ta
ee60: 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61  ble".  The pData
ee70: 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  base.** points t
ee80: 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  o the table name
ee90: 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20   and the pTable 
eea0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61  points to the da
eeb0: 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20  tabase name..** 
eec0: 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  The SrcList.a[].
eed0: 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66  zName field is f
eee0: 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74  illed with the t
eef0: 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20  able name which 
ef00: 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72  might.** come fr
ef10: 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44  om pTable (if pD
ef20: 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29  atabase is NULL)
ef30: 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61   or from pDataba
ef40: 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74  se.  .** SrcList
ef50: 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69  .a[].zDatabase i
ef60: 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
ef70: 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
ef80: 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20  from pTable,.** 
ef90: 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20  or with NULL if 
efa0: 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73  no database is s
efb0: 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
efc0: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
efd0: 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69  if call like thi
efe0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
eff0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
f000: 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a  ppend(A,B,0);.**
f010: 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20  .** Then B is a 
f020: 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
f030: 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
f040: 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e   is unspecified.
f050: 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c    If called.** l
f060: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
f070: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
f080: 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42  rcListAppend(A,B
f090: 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,C);.**.** Then 
f0a0: 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  C is the table n
f0b0: 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65  ame and B is the
f0c0: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a   database name..
f0d0: 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
f0e0: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
f0f0: 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c  (SrcList *pList,
f100: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
f110: 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65  Token *pDatabase
f120: 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ){.  if( pList==
f130: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
f140: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
f150: 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29  izeof(SrcList) )
f160: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
f170: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
f180: 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
f190: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
f1a0: 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69  pList->nSrc>=pLi
f1b0: 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  st->nAlloc ){.  
f1c0: 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
f1d0: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
f1e0: 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65  oc *= 2;.    pNe
f1f0: 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
f200: 63 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20 20  c(pList,.       
f210: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
f220: 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74 2d  pList) + (pList-
f230: 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f  >nAlloc-1)*sizeo
f240: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29  f(pList->a[0]) )
f250: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
f260: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
f270: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
f280: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
f290: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
f2a0: 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a    pList = pNew;.
f2b0: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c    }.  memset(&pL
f2c0: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53  ist->a[pList->nS
f2d0: 72 63 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  rc], 0, sizeof(p
f2e0: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
f2f0: 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26  if( pDatabase &&
f300: 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30   pDatabase->z==0
f310: 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73   ){.    pDatabas
f320: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
f330: 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70 54   pDatabase && pT
f340: 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65  able ){.    Toke
f350: 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61  n *pTemp = pData
f360: 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62  base;.    pDatab
f370: 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ase = pTable;.  
f380: 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70    pTable = pTemp
f390: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62  ;.  }.  if( pTab
f3a0: 6c 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  le ){.    char *
f3b0: 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  *pz = &pList->a[
f3c0: 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a 4e 61  pList->nSrc].zNa
f3d0: 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  me;.    sqlite3S
f3e0: 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 54  etNString(pz, pT
f3f0: 61 62 6c 65 2d 3e 7a 2c 20 70 54 61 62 6c 65 2d  able->z, pTable-
f400: 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  >n, 0);.    if( 
f410: 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  *pz==0 ){.      
f420: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
f430: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
f440: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
f450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
f460: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 2a 70 7a  lite3Dequote(*pz
f470: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
f480: 66 28 20 70 44 61 74 61 62 61 73 65 20 29 7b 0a  f( pDatabase ){.
f490: 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20      char **pz = 
f4a0: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
f4b0: 3e 6e 53 72 63 5d 2e 7a 44 61 74 61 62 61 73 65  >nSrc].zDatabase
f4c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
f4d0: 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 44 61 74  NString(pz, pDat
f4e0: 61 62 61 73 65 2d 3e 7a 2c 20 70 44 61 74 61 62  abase->z, pDatab
f4f0: 61 73 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20  ase->n, 0);.    
f500: 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20  if( *pz==0 ){.  
f510: 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
f520: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
f530: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
f540: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f550: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
f560: 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (*pz);.    }.  }
f570: 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  .  pList->a[pLis
f580: 74 2d 3e 6e 53 72 63 5d 2e 69 43 75 72 73 6f 72  t->nSrc].iCursor
f590: 20 3d 20 2d 31 3b 0a 20 20 70 4c 69 73 74 2d 3e   = -1;.  pList->
f5a0: 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  nSrc++;.  return
f5b0: 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
f5c0: 20 41 73 73 69 67 6e 20 63 75 72 73 6f 72 73 20   Assign cursors 
f5d0: 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  to all tables in
f5e0: 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f   a SrcList.*/.vo
f5f0: 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
f600: 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50  tAssignCursors(P
f610: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
f620: 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
f630: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
f640: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  0; i<pList->nSrc
f650: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
f660: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  pList->a[i].iCur
f670: 73 6f 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  sor<0 ){.      p
f680: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
f690: 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
f6a0: 62 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  b++;.    }.  }.}
f6b0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61  ../*.** Add an a
f6c0: 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61 73 74  lias to the last
f6d0: 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 20 74   identifier on t
f6e0: 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74 69 66  he given identif
f6f0: 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ier list..*/.voi
f700: 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
f710: 41 64 64 41 6c 69 61 73 28 53 72 63 4c 69 73 74  AddAlias(SrcList
f720: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
f730: 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70  pToken){.  if( p
f740: 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e  List && pList->n
f750: 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  Src>0 ){.    int
f760: 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 53 72 63   i = pList->nSrc
f770: 20 2d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   - 1;.    sqlite
f780: 33 53 65 74 4e 53 74 72 69 6e 67 28 26 70 4c 69  3SetNString(&pLi
f790: 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c  st->a[i].zAlias,
f7a0: 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b   pToken->z, pTok
f7b0: 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 73  en->n, 0);.    s
f7c0: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 4c  qlite3Dequote(pL
f7d0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73  ist->a[i].zAlias
f7e0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
f7f0: 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74  Delete an IdList
f800: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
f810: 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64  3IdListDelete(Id
f820: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
f830: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
f840: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
f850: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
f860: 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
f870: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
f880: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
f890: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
f8a0: 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  ee(pList->a);.  
f8b0: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
f8c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
f8d0: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  rn the index in 
f8e0: 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65  pList of the ide
f8f0: 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49  ntifier named zI
f900: 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  d.  Return -1.**
f910: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
f920: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c  /.int sqlite3IdL
f930: 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20  istIndex(IdList 
f940: 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68  *pList, const ch
f950: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
f960: 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
f970: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ==0 ) return -1;
f980: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
f990: 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
f9a0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
f9b0: 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
f9c0: 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  i].zName, zName)
f9d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
f9e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
f9f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
fa00: 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69   an entire SrcLi
fa10: 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c  st including all
fa20: 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
fa30: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
fa40: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
fa50: 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
fa60: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
fa70: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
fa80: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
fa90: 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
faa0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
fab0: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 44  e(pList->a[i].zD
fac0: 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71  atabase);.    sq
fad0: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
fae0: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
faf0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
fb00: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b  t->a[i].zAlias);
fb10: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
fb20: 61 5b 69 5d 2e 70 54 61 62 20 26 26 20 70 4c 69  a[i].pTab && pLi
fb30: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d 3e 69  st->a[i].pTab->i
fb40: 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20  sTransient ){.  
fb50: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
fb60: 65 54 61 62 6c 65 28 30 2c 20 70 4c 69 73 74 2d  eTable(0, pList-
fb70: 3e 61 5b 69 5d 2e 70 54 61 62 29 3b 0a 20 20 20  >a[i].pTab);.   
fb80: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65   }.    sqlite3Se
fb90: 6c 65 63 74 44 65 6c 65 74 65 28 70 4c 69 73 74  lectDelete(pList
fba0: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b  ->a[i].pSelect);
fbb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
fbc0: 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b  Delete(pList->a[
fbd0: 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c  i].pOn);.    sql
fbe0: 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
fbf0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 55 73  (pList->a[i].pUs
fc00: 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ing);.  }.  sqli
fc10: 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
fc20: 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
fc30: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
fc40: 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
fc50: 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
fc60: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f  e *pParse, int o
fc70: 6e 45 72 72 6f 72 29 7b 0a 20 20 73 71 6c 69 74  nError){.  sqlit
fc80: 65 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 50  e *db;..  if( pP
fc90: 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
fca0: 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
fcb0: 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
fcc0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
fcd0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
fce0: 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
fcf0: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
fd00: 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( sqlite3
fd10: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
fd20: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
fd30: 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30  TION, "BEGIN", 0
fd40: 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  , 0) ) return;. 
fd50: 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
fd60: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20   SQLITE_InTrans 
fd70: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
fd80: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
fd90: 63 61 6e 6e 6f 74 20 73 74 61 72 74 20 61 20 74  cannot start a t
fda0: 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 74 68 69  ransaction withi
fdb0: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 22  n a transaction"
fdc0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
fdd0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69   }.  sqlite3Begi
fde0: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
fdf0: 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20  pParse, 0, 0);. 
fe00: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78   if( !pParse->ex
fe10: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 64 62 2d  plain ){.    db-
fe20: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
fe30: 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 20 20 64 62  _InTrans;.    db
fe40: 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72  ->onError = onEr
fe50: 72 6f 72 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ror;.  }.}../*.*
fe60: 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73  * Commit a trans
fe70: 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
fe80: 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e  qlite3CommitTran
fe90: 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
fea0: 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
feb0: 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61   *db;..  if( pPa
fec0: 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50  rse==0 || (db=pP
fed0: 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20  arse->db)==0 || 
fee0: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d  db->aDb[0].pBt==
fef0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
ff00: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
ff10: 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  | sqlite3_malloc
ff20: 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  _failed ) return
ff30: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
ff40: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
ff50: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
ff60: 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30  ION, "COMMIT", 0
ff70: 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  , 0) ) return;. 
ff80: 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20   if( (db->flags 
ff90: 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  & SQLITE_InTrans
ffa0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
ffb0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
ffc0: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d  se, "cannot comm
ffd0: 69 74 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74  it - no transact
ffe0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 29 3b  ion is active");
fff0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
10000 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
10010 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 64  explain ){.    d
10020 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
10030 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 7d  ITE_InTrans;.  }
10040 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 57 72 69  .  sqlite3EndWri
10050 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
10060 73 65 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72  se);.  if( !pPar
10070 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
10080 20 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d     db->onError =
10090 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20 7d   OE_Default;.  }
100a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
100b0 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
100c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
100d0 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74  RollbackTransact
100e0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
100f0 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  e){.  sqlite *db
10100 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
10110 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
10120 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
10130 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
10140 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
10150 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
10160 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
10170 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
10180 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
10190 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
101a0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
101b0 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c  RANSACTION, "ROL
101c0 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20  LBACK", 0, 0) ) 
101d0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 64  return;.  if( (d
101e0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
101f0 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b  E_InTrans)==0 ){
10200 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
10210 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61  rMsg(pParse, "ca
10220 6e 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 2d 20  nnot rollback - 
10230 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  no transaction i
10240 73 20 61 63 74 69 76 65 22 29 3b 0a 20 20 20 20  s active");.    
10250 72 65 74 75 72 6e 3b 20 0a 20 20 7d 0a 20 20 76  return; .  }.  v
10260 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
10270 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
10280 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
10290 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
102a0 5f 52 6f 6c 6c 62 61 63 6b 2c 20 30 2c 20 30 29  _Rollback, 0, 0)
102b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
102c0 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
102d0 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
102e0 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73   ~SQLITE_InTrans
102f0 3b 0a 20 20 20 20 64 62 2d 3e 6f 6e 45 72 72 6f  ;.    db->onErro
10300 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a  r = OE_Default;.
10310 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
10320 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20  erate VDBE code 
10330 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69 66 79  that will verify
10340 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
10350 69 65 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 6e 61  ie for all.** na
10360 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
10370 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
10380 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
10390 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
103a0 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73  e, int iDb){.  s
103b0 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
103c0 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
103d0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
103e0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  be(pParse);.  as
103f0 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
10400 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
10410 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
10420 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 29 3b 0a  [iDb].pBt!=0 );.
10430 20 20 69 66 28 20 69 44 62 21 3d 31 20 26 26 20    if( iDb!=1 && 
10440 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64  !DbHasProperty(d
10450 62 2c 20 69 44 62 2c 20 44 42 5f 43 6f 6f 6b 69  b, iDb, DB_Cooki
10460 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  e) ){.    sqlite
10470 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10480 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69  _VerifyCookie, i
10490 44 62 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  Db, db->aDb[iDb]
104a0 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 29 3b  .schema_cookie);
104b0 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72  .    DbSetProper
104c0 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 43  ty(db, iDb, DB_C
104d0 6f 6f 6b 69 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ookie);.  }.}../
104e0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
104f0 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65  BE code that pre
10500 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20  pares for doing 
10510 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61  an operation tha
10520 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67  t.** might chang
10530 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  e the database..
10540 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
10550 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20  ne starts a new 
10560 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77  transaction if w
10570 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64  e are not alread
10580 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72  y within.** a tr
10590 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77  ansaction.  If w
105a0 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69  e are already wi
105b0 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
105c0 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b  on, then a check
105d0 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20  point.** is set 
105e0 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d  if the setStatem
105f0 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  ent parameter is
10600 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70   true.  A checkp
10610 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  oint should.** b
10620 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74  e set for operat
10630 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20  ions that might 
10640 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63  fail (due to a c
10650 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20  onstraint) part 
10660 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68  of.** the way th
10670 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20  rough and which 
10680 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64  will need to und
10690 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69  o some writes wi
106a0 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a  thout having to.
106b0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** rollback the 
106c0 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  whole transactio
106d0 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f  n.  For operatio
106e0 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e  ns where all con
106f0 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20  straints.** can 
10700 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72  be checked befor
10710 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72  e any changes ar
10720 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  e made to the da
10730 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65  tabase, it is ne
10740 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79  ver.** necessary
10750 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65   to undo a write
10760 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f   and the checkpo
10770 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  int should not b
10780 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  e set..**.** Onl
10790 79 20 64 61 74 61 62 61 73 65 20 69 44 62 20 61  y database iDb a
107a0 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  nd the temp data
107b0 62 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72  base are made wr
107c0 69 74 61 62 6c 65 20 62 79 20 74 68 69 73 20 63  itable by this c
107d0 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d  all..** If iDb==
107e0 30 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 69 6e  0, then the main
107f0 20 61 6e 64 20 74 65 6d 70 20 64 61 74 61 62 61   and temp databa
10800 73 65 73 20 61 72 65 20 6d 61 64 65 20 77 72 69  ses are made wri
10810 74 61 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69  table.   If.** i
10820 44 62 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20  Db==1 then only 
10830 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
10840 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62  e is made writab
10850 6c 65 2e 20 20 49 66 20 69 44 62 3e 31 20 74 68  le.  If iDb>1 th
10860 65 6e 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66  en the.** specif
10870 69 65 64 20 61 75 78 69 6c 69 61 72 79 20 64 61  ied auxiliary da
10880 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 74  tabase and the t
10890 65 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65  emp database are
108a0 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 0a   made writable..
108b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
108c0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
108d0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
108e0 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65  , int setStateme
108f0 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  nt, int iDb){.  
10900 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
10910 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
10920 64 62 3b 0a 20 20 69 66 28 20 44 62 48 61 73 50  db;.  if( DbHasP
10930 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c  roperty(db, iDb,
10940 20 44 42 5f 4c 6f 63 6b 65 64 29 20 29 20 72 65   DB_Locked) ) re
10950 74 75 72 6e 3b 0a 20 20 76 20 3d 20 73 71 6c 69  turn;.  v = sqli
10960 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
10970 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
10980 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21   return;.  if( !
10990 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 69 6e 54  db->aDb[iDb].inT
109a0 72 61 6e 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  rans ){.    sqli
109b0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
109c0 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
109d0 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 44 62 53  iDb, 0);.    DbS
109e0 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  etProperty(db, i
109f0 44 62 2c 20 44 42 5f 4c 6f 63 6b 65 64 29 3b 0a  Db, DB_Locked);.
10a00 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
10a10 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
10a20 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66  se, iDb);.    if
10a30 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20  ( iDb!=1 ){.    
10a40 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
10a50 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
10a60 72 73 65 2c 20 73 65 74 53 74 61 74 65 6d 65 6e  rse, setStatemen
10a70 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t, 1);.    }.  }
10a80 65 6c 73 65 20 69 66 28 20 73 65 74 53 74 61 74  else if( setStat
10a90 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  ement ){.    sql
10aa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10ab0 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 2c 20 69   OP_Statement, i
10ac0 44 62 2c 20 30 29 3b 0a 20 20 20 20 44 62 53 65  Db, 0);.    DbSe
10ad0 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44  tProperty(db, iD
10ae0 62 2c 20 44 42 5f 4c 6f 63 6b 65 64 29 3b 0a 20  b, DB_Locked);. 
10af0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
10b00 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 63  rate code that c
10b10 6f 6e 63 6c 75 64 65 73 20 61 6e 20 6f 70 65 72  oncludes an oper
10b20 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 68  ation that may h
10b30 61 76 65 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74  ave changed.** t
10b40 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
10b50 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
10b60 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61  nsaction was sta
10b70 72 74 65 64 2c 20 74 68 65 6e 20 65 6d 69 74 0a  rted, then emit.
10b80 2a 2a 20 61 6e 20 4f 50 5f 43 6f 6d 6d 69 74 20  ** an OP_Commit 
10b90 74 68 61 74 20 77 69 6c 6c 20 63 61 75 73 65 20  that will cause 
10ba0 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 62  the changes to b
10bb0 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64  e committed to d
10bc0 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  isk..**.** Note 
10bd0 74 68 61 74 20 63 68 65 63 6b 70 6f 69 6e 74 73  that checkpoints
10be0 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
10bf0 6c 79 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 20  ly committed at 
10c00 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 61 20  the end of.** a 
10c10 73 74 61 74 65 6d 65 6e 74 2e 20 20 4e 6f 74 65  statement.  Note
10c20 20 61 6c 73 6f 20 74 68 61 74 20 74 68 65 72 65   also that there
10c30 20 63 61 6e 20 62 65 20 6d 75 6c 74 69 70 6c 65   can be multiple
10c40 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71   calls to .** sq
10c50 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
10c60 70 65 72 61 74 69 6f 6e 28 29 20 62 75 74 20 74  peration() but t
10c70 68 65 72 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  here should only
10c80 20 62 65 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20   be a single.** 
10c90 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 45  call to sqlite3E
10ca0 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  ndWriteOperation
10cb0 28 29 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  () at the conclu
10cc0 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74  sion of the stat
10cd0 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
10ce0 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70  qlite3EndWriteOp
10cf0 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
10d00 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
10d10 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  v;.  sqlite *db 
10d20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
10d30 69 66 28 20 70 50 61 72 73 65 2d 3e 74 72 69 67  if( pParse->trig
10d40 53 74 61 63 6b 20 29 20 72 65 74 75 72 6e 3b 20  Stack ) return; 
10d50 2f 2a 20 69 66 20 74 68 69 73 20 69 73 20 69 6e  /* if this is in
10d60 20 61 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20   a trigger */.  
10d70 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
10d80 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
10d90 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
10da0 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73  .  if( db->flags
10db0 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e   & SQLITE_InTran
10dc0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 42 45  s ){.    /* A BE
10dd0 47 49 4e 20 68 61 73 20 65 78 65 63 75 74 65 64  GIN has executed
10de0 2e 20 20 44 6f 20 6e 6f 74 20 63 6f 6d 6d 69 74  .  Do not commit
10df0 20 75 6e 74 69 6c 20 77 65 20 73 65 65 20 61 6e   until we see an
10e00 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20 2a 2a   explicit.    **
10e10 20 43 4f 4d 4d 49 54 20 73 74 61 74 65 6d 65 6e   COMMIT statemen
10e20 74 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  t. */.  }else{. 
10e30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10e40 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74  dOp(v, OP_Commit
10e50 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a     , 0, 0);.  }.}.